Skip to content

Commit 17a5101

Browse files
author
Baruch Sadogursky
committed
Merge pull request #32 from charlesk40/master
Allow AsyncHttpClient to be passed in. Use bounded threadpool.
2 parents b57d180 + 94a191d commit 17a5101

File tree

2 files changed

+63
-21
lines changed

2 files changed

+63
-21
lines changed

ning-services/src/main/groovy/org/jfrog/artifactory/client/ning/ArtifactoryClient.groovy

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66
* limitations under the License. See accompanying LICENSE file. */
77
package org.jfrog.artifactory.client.ning
88

9-
import java.util.concurrent.ExecutorService
9+
import java.util.concurrent.ThreadFactory
10+
1011
import java.util.concurrent.Executors
1112
import java.util.concurrent.ThreadFactory
13+
import java.util.concurrent.ExecutorService
14+
import java.util.concurrent.SynchronousQueue
15+
import java.util.concurrent.ThreadFactory
16+
import java.util.concurrent.ThreadPoolExecutor
17+
import java.util.concurrent.TimeUnit
1218

1319
import org.jfrog.artifactory.client.Artifactory
1420
import org.slf4j.Logger
@@ -30,17 +36,8 @@ import com.ning.http.client.Realm.AuthScheme
3036
public class ArtifactoryClient {
3137

3238
private static final Logger log = LoggerFactory.getLogger(ArtifactoryClient.class);
33-
private static AsyncHttpClient ningHttpClient;
34-
private static final NingRequest ningRequest;
3539

3640
public static Artifactory create(final String url, final String username, final char[] password, final NingRequest ningRequest) {
37-
def matcher = url =~ /(https?:\/\/[^\/]+)\/+([^\/]*).*/
38-
if (!matcher) {
39-
matcher = url =~ /(https?:\/\/[^\/]+)\/*()/
40-
if (!matcher) {
41-
throw new IllegalArgumentException("Invalid Artifactory URL: ${url}.")
42-
}
43-
}
4441
Realm realm=null;
4542
if (username!=null && !"".equals(username)){
4643
realm = new Realm.RealmBuilder()
@@ -50,19 +47,31 @@ public class ArtifactoryClient {
5047
.setScheme(AuthScheme.BASIC)
5148
.build();
5249
}
53-
ExecutorService executorService = Executors
54-
.newCachedThreadPool(new ThreadFactory() {
55-
public Thread newThread(Runnable r) {
56-
Thread t = new Thread(r,
57-
"AsyncHttpClient-Callback");
58-
t.setDaemon(true);
59-
return t;
60-
}
61-
});
62-
ningHttpClient = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
50+
//Use bounded
51+
ExecutorService executorService = new ThreadPoolExecutor(20, 100, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
52+
new ThreadFactory() {
53+
public Thread newThread(Runnable r) {
54+
Thread t = new Thread(r,
55+
"AsyncHttpClient-Callback");
56+
t.setDaemon(true);
57+
return t;
58+
}
59+
});
60+
AsyncHttpClient ningHttpClient = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
6361
.setRealm(realm)
6462
.setExecutorService(executorService)
6563
.build());
64+
return create(url, ningHttpClient, ningRequest);
65+
}
66+
67+
public static Artifactory create(final String url, final AsyncHttpClient ningHttpClient, final NingRequest ningRequest) {
68+
def matcher = url =~ /(https?:\/\/[^\/]+)\/+([^\/]*).*/
69+
if (!matcher) {
70+
matcher = url =~ /(https?:\/\/[^\/]+)\/*()/
71+
if (!matcher) {
72+
throw new IllegalArgumentException("Invalid Artifactory URL: ${url}.")
73+
}
74+
}
6675
log.debug("Url: {}, Context: {}, Host: {}", url, matcher[0][2], matcher[0][1]);
6776
return new ArtifactoryNingClientImpl(ningHttpClient, matcher[0][2], matcher[0][1], ningRequest);
6877
}

ning-services/src/test/java/org/jfrog/artifactory/client/ning/ArtifactoryNingClientTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder;
1111
import com.ning.http.client.Cookie;
12+
import com.ning.http.client.AsyncHttpClient;
13+
import com.ning.http.client.AsyncHttpClientConfig;
14+
1215
import org.apache.http.client.HttpResponseException;
1316
import org.jfrog.artifactory.client.*;
1417
import org.jfrog.artifactory.client.model.File;
@@ -22,6 +25,14 @@
2225
import java.io.InputStream;
2326
import java.util.Properties;
2427

28+
import java.util.concurrent.Executors;
29+
import java.util.concurrent.ThreadFactory;
30+
import java.util.concurrent.ExecutorService;
31+
import java.util.concurrent.SynchronousQueue;
32+
import java.util.concurrent.ThreadFactory;
33+
import java.util.concurrent.ThreadPoolExecutor;
34+
import java.util.concurrent.TimeUnit;
35+
2536
/**
2637
* @author charlesk
2738
*/
@@ -112,6 +123,29 @@ public void clean() {
112123
artifactory.close();
113124
}
114125

126+
@Test
127+
public void testCreateArtifactoryClient() throws Exception {
128+
ExecutorService executorService = new ThreadPoolExecutor(20, 100, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
129+
new ThreadFactory() {
130+
public Thread newThread(Runnable r) {
131+
Thread t = new Thread(r,
132+
"AsyncHttpClient-Callback");
133+
t.setDaemon(true);
134+
return t;
135+
}
136+
});
137+
AsyncHttpClient ningHttpClient = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
138+
.setExecutorService(executorService)
139+
.build());
140+
Artifactory artifactory = org.jfrog.artifactory.client.ning.ArtifactoryClient.create(url, ningHttpClient, testNingRequestImpl);
141+
RepositoryHandle repositoryHandle = artifactory.repository(repo);
142+
Assert.assertNotNull(repositoryHandle);
143+
ItemHandle itemHandle = repositoryHandle.file(filePath + "/" + fileName);
144+
Assert.assertNotNull(itemHandle);
145+
Item item = itemHandle.info();
146+
Assert.assertNotNull(item);
147+
}
148+
115149
@Test
116150
public void testGetMetaData() throws Exception {
117151
// meta-data Get
@@ -192,5 +226,4 @@ public BoundRequestBuilder getBoundRequestBuilder(BoundRequestBuilder requestBui
192226

193227
}
194228
}
195-
196229
}

0 commit comments

Comments
 (0)