[
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)