[ https://issues.apache.org/jira/browse/CXF-7644?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16363185#comment-16363185 ]
Andy McCright commented on CXF-7644: ------------------------------------ Thanks [~sergey_beryozkin] - that is what I'm thinking too. I've asked our CTS team to challenge this and related tests. I agree that the spec is silent on this - so IMO, either the TCK test needs to be rewritten - if it tested against a real remote resource and then checked that the response was on a different thread, I would think that would be sufficient - or the spec needs to be updated to clarify that the outbound interceptors must run on a separate thread. Thanks, Andy > TCK/CTS: JAX-RS async client requests should invoke interceptor chain on > separate thread > ---------------------------------------------------------------------------------------- > > Key: CXF-7644 > URL: https://issues.apache.org/jira/browse/CXF-7644 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.2.2 > Reporter: Andy McCright > Priority: Major > > The JAX-RS 2.1 TCK is using ClientRequestFilters to verify that it is on a > separate thread than the main client thread. Although it is not specific in > the spec that providers like filters must be invoked on a new thread, I > believe this line from the spec (section 8.4) is what they base this test on: > _Note that in this example, the call to get after calling async returns > immediately without blocking the caller’s thread._ > > Currently, we call WebClient.doInvokeAsync(...) which calls > prepareAsyncClient(...) which calls doRunInterceptorChain(...) - all on the > main client thread. As a result the filters on the outbound chain get > executed on the same thread which breaks the test. > I wrote a simpler test case that similarly breaks, but could use some help > with how to implement the fix: > > public static class ThreadCheckFilter implements ClientRequestFilter { > @Override > public void filter(ClientRequestContext context) throws IOException { > final Thread currentThread = Thread.currentThread(); > context.abortWith(Response.ok(currentThread.getName()) > .header("ThreadID", > currentThread.getId()) > .build()); > } > } > > @Test > public void > testClientRequestFilterRunsOnSepaarateThreadWhenInvokedAsynchronously() > throws Exception { > final Thread currentThread = Thread.currentThread(); > Client client = ClientBuilder.newClient(); > client.register(ThreadCheckFilter.class); > WebTarget target = client.target("http://localhost:8080/notReal"); > AsyncInvoker invoker = target.request().async(); > Future<Response> future = invoker.get(); > Response response = future.get(); > assertNotEquals(currentThread.getName(), > response.readEntity(String.class)); > assertNotEquals(currentThread.getId(), > Long.parseLong(response.getHeaderString("ThreadID"))); > } -- This message was sent by Atlassian JIRA (v7.6.3#76005)