You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "KimJohn Quinn (Jira)" <ji...@apache.org> on 2020/09/27 02:30:00 UTC

[jira] [Created] (CXF-8349) Flux Returns Mixed Response on Errors and Mono Hangs when Empty

KimJohn Quinn created CXF-8349:
----------------------------------

             Summary: Flux Returns Mixed Response on Errors and Mono Hangs when Empty
                 Key: CXF-8349
                 URL: https://issues.apache.org/jira/browse/CXF-8349
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 3.4.0
         Environment: Our environment is:
 * Spring Boot 2.3.4.RELEASE
 * Apache CXF 3.4.0 (using the new BOM + reactor extension)
 * Undertow
 * Jackson

We use CXF instead of Spring for all Mono/Flux REST endpoints.  Outside of the error handling, everything works great.
            Reporter: KimJohn Quinn


It looks like we have similar/continuing issues as originally outlined in [CXF-8022|https://issues.apache.org/jira/browse/CXF-8022].

*Two issues I have are:*
 * Flux "error" returns a mixed response
 * Mono that returns empty seems to hang on thread and never return.

{color:#de350b}These are super important for us because it makes handling exceptions somewhat difficult (if there is a workaround that would be acceptable too as this is only with errors) and empty mono results, which can happen, unhandleable.{color}

+{color:#0747a6}*Problem 1: Flux error returns mixed response*{color}+

Using this test, when an exception is thrown from within a step in the stream the expectation is to get the error response only (handled by an ExceptionMapper).  Most cases this is true.

This appears to happen only with a Flux and if the error is thrown before the last step in the chain (i.e. call a --> call b --> call c).  If there are multiple steps it _appears_ the last one will return an error correctly, in the example call a and call b would return the mixed response where as call c returns the error correctly.

*Using this code (replica code in the original issue CXF08022):*

 
{code:java}
@GET
    @Path("/test3")
    @Produces(APPLICATION_JSON)
    @Consumes(APPLICATION_JSON)
    public Flux<String> getError()
    {
        return Flux
            .range(1, 5)
            .flatMap(item ->
                     {
                         if (item <= 4)
                         {
                             return Mono.just("item: " + item);
                         }
                         else
                         {
                             System.out.println("---Hitting exception");
                             return error(new NotFoundException());
                         }
                     })
            .onErrorMap(e -> new RuntimeException(e));
    }
{code}
 

*Returns this result (error):* 
{code:java}
 [item: 1,item: 2,item: 3,item: 4
]{
    "status": 404,
    "phrase": "Not Found",
    "message": "javax.ws.rs.NotFoundException: HTTP 404 Not Found",
    "path": "/projects/xxx/test3",
    "timestamp": 1601172421939,
    "trace": [
        "at aaa.bbb.project.services.ProjectResource.lambda$getError$0(ProjectResource.java:133)"
    ]
}{code}
 

 

+{color:#0747a6}*Problem 2: Mono hangs returning empty*{color}+

Also, as a side node, I seem to have a similar problem with an empty Mono (whereas the ticket above the problem was in the Flux)
{code:java}
    @GET
    @Path("/test1a")
    @Produces(APPLICATION_JSON)
    @Consumes(APPLICATION_JSON)
    public Mono<Map> getMono()
    {
        return Mono.empty();
    }
{code}
This will hang and not return a result.  Pausing it while debugging shows it holding up on a Thread parking...

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)