Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-8349

Flux Returns Mixed Response on Errors and Mono Hangs when Empty

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 3.4.0
    • 3.5.0, 3.3.8, 3.4.1
    • JAX-RS
    • None

    Description

      It looks like we have similar/continuing issues as originally outlined in 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.

      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. We have a lot invested in using CXF as we start to move to Kamel and eventually Quarkus later and would not want to use Spring controllers.


      Problem 1: Flux error returns mixed response

      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 CXF-8022):

      @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));
          }
      

       Returns this result (error):

       [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)"
          ]
      }

      Problem 2: Mono hangs returning empty

      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)

          @GET
          @Path("/test1a")
          @Produces(APPLICATION_JSON)
          @Consumes(APPLICATION_JSON)
          public Mono<Map> getMono()
          {
              return Mono.empty();
          }
      

      This will hang and not return a result.  Pausing it while debugging shows it holding up on a Thread parking...

       

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            reta Andriy Redko
            kjq KimJohn Quinn
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment