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

Reply via email to