Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit 5217803

Browse files
author
Petr Janouch
committed
JERSEY-2969: Client#close() not shutting down Async Executor
Change-Id: Ic49977db09f393509befcb8bf7c10c994c2f1911
1 parent b280312 commit 5217803

File tree

3 files changed

+99
-2
lines changed

3 files changed

+99
-2
lines changed

core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ protected void configure() {
148148
// Default async request executors support
149149
int asyncThreadPoolSize = ClientProperties.getValue(clientRuntimeProperties, ClientProperties.ASYNC_THREADPOOL_SIZE, 0);
150150
asyncThreadPoolSize = (asyncThreadPoolSize < 0) ? 0 : asyncThreadPoolSize;
151-
bind(new DefaultClientAsyncExecutorProvider(asyncThreadPoolSize)).to(ExecutorServiceProvider.class);
151+
// a constructor parameter injected into DefaultClientAsyncExecutorProvider
152+
bind(asyncThreadPoolSize).named("ClientAsyncThreadPoolSize");
153+
// DefaultClientAsyncExecutorProvider must be singleton scoped, so that @PreDestroy, which closes the executor, is called
154+
bind(DefaultClientAsyncExecutorProvider.class).to(ExecutorServiceProvider.class).in(Singleton.class);
152155
}
153156
}

core-client/src/main/java/org/glassfish/jersey/client/DefaultClientAsyncExecutorProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242

4343
import java.util.logging.Logger;
4444

45+
import javax.inject.Inject;
46+
import javax.inject.Named;
47+
4548
import org.glassfish.jersey.client.internal.LocalizationMessages;
4649
import org.glassfish.jersey.internal.util.collection.LazyValue;
4750
import org.glassfish.jersey.internal.util.collection.Value;
@@ -66,7 +69,8 @@ class DefaultClientAsyncExecutorProvider extends ThreadPoolExecutorProvider {
6669
* @param poolSize size of the default executor thread pool (if used). Zero or negative values are ignored.
6770
* See also {@link org.glassfish.jersey.client.ClientProperties#ASYNC_THREADPOOL_SIZE}.
6871
*/
69-
public DefaultClientAsyncExecutorProvider(final int poolSize) {
72+
@Inject
73+
public DefaultClientAsyncExecutorProvider(@Named("ClientAsyncThreadPoolSize") final int poolSize) {
7074
super("jersey-client-async-executor");
7175

7276
this.asyncThreadPoolSize = Values.lazy(new Value<Integer>() {
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3+
*
4+
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
5+
*
6+
* The contents of this file are subject to the terms of either the GNU
7+
* General Public License Version 2 only ("GPL") or the Common Development
8+
* and Distribution License("CDDL") (collectively, the "License"). You
9+
* may not use this file except in compliance with the License. You can
10+
* obtain a copy of the License at
11+
* http://glassfish.java.net/public/CDDL+GPL_1_1.html
12+
* or packager/legal/LICENSE.txt. See the License for the specific
13+
* language governing permissions and limitations under the License.
14+
*
15+
* When distributing the software, include this License Header Notice in each
16+
* file and include the License file at packager/legal/LICENSE.txt.
17+
*
18+
* GPL Classpath Exception:
19+
* Oracle designates this particular file as subject to the "Classpath"
20+
* exception as provided by Oracle in the GPL Version 2 section of the License
21+
* file that accompanied this code.
22+
*
23+
* Modifications:
24+
* If applicable, add the following below the License Header, with the fields
25+
* enclosed by brackets [] replaced by your own identifying information:
26+
* "Portions Copyright [year] [name of copyright owner]"
27+
*
28+
* Contributor(s):
29+
* If you wish your version of this file to be governed by only the CDDL or
30+
* only the GPL Version 2, indicate your decision by adding "[Contributor]
31+
* elects to include this software in this distribution under the [CDDL or GPL
32+
* Version 2] license." If you don't indicate a single choice of license, a
33+
* recipient has the option to distribute your version of this file under
34+
* either the CDDL, the GPL Version 2 or to extend the choice of license to
35+
* its licensees as provided above. However, if you add GPL Version 2 code
36+
* and therefore, elected the GPL Version 2 license, then the option applies
37+
* only if the new code is made subject to such option by the copyright
38+
* holder.
39+
*/
40+
package org.glassfish.jersey.tests.e2e.client;
41+
42+
import java.util.Set;
43+
44+
import javax.ws.rs.GET;
45+
import javax.ws.rs.Path;
46+
import javax.ws.rs.core.Application;
47+
48+
import org.glassfish.jersey.server.ResourceConfig;
49+
import org.glassfish.jersey.test.JerseyTest;
50+
51+
import org.junit.Test;
52+
import static org.junit.Assert.assertFalse;
53+
import static org.junit.Assert.assertTrue;
54+
55+
/**
56+
* @author Petr Janouch (petr.janouch at oracle.com)
57+
*/
58+
public class ClientExecutorCloseTest extends JerseyTest {
59+
60+
/**
61+
* Tests that closing a client shuts down a corresponding client async executor service.
62+
*/
63+
@Test
64+
public void testCloseAsyncExecutor() {
65+
assertFalse(clientExecutorThreadPresent());
66+
target("resource").request().async().get();
67+
assertTrue(clientExecutorThreadPresent());
68+
client().close();
69+
assertFalse(clientExecutorThreadPresent());
70+
}
71+
72+
private boolean clientExecutorThreadPresent() {
73+
Set<Thread> threads = Thread.getAllStackTraces().keySet();
74+
return threads.stream().map(Thread::getName).anyMatch(name -> name.contains("jersey-client-async-executor"));
75+
}
76+
77+
@Override
78+
protected Application configure() {
79+
return new ResourceConfig(Resource.class);
80+
}
81+
82+
@Path("resource")
83+
public static class Resource {
84+
85+
@GET
86+
public String getHello() {
87+
return "Hello";
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)