[ 
https://issues.apache.org/jira/browse/CXF-7881?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jan Hallonsten updated CXF-7881:
--------------------------------
    Description: 
Creating this Jira according to the discussion 
[here|http://cxf.547215.n5.nabble.com/Response-always-handled-on-current-thread-when-WorkQueue-rejects-execution-tt5793019.html]

In the method 

[org.apache.cxf.transport.http.HTTPConduit.handleResponseOnWorkqueue(boolean 
allowCurrentThread, boolean 
forceWQ)|https://github.com/apache/cxf/blob/540bb76f6f3d3d23944c566905f9f395c6f86b79/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java#L1190]

If the work queue is full so that RejectedExecutionException is thrown and 
allowCurrentThread is false like when called from 
[AsyncHttpConduit|https://github.com/apache/cxf/blob/6db38f9984b9c0bf6309a3d7e26d5a9ab8055d1f/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java#L600]
 the expression in the if statement below will always return false and the 
response will be handled on the current thread via the call to 
handleResponseInternal. When used from AsyncHttpConduit this will be the IO 
core thread which is not a good idea.
{code:java}
} catch (RejectedExecutionException rex) {
    if (allowCurrentThread
        && policy != null
        && policy.isSetAsyncExecuteTimeoutRejection()
        && policy.isAsyncExecuteTimeoutRejection()) {
        throw rex;
    }
    if (!hasLoggedAsyncWarning) {
        LOG.warning("EXECUTOR_FULL_WARNING");
        hasLoggedAsyncWarning = true;
    }
    LOG.fine("EXECUTOR_FULL");
    handleResponseInternal();
}
{code}

I think that the code above should be changed to

{code:java}
} catch (RejectedExecutionException rex) { 
     if (!allowCurrentThread 
         || (policy != null 
         && policy.isSetAsyncExecuteTimeoutRejection() 
         && policy.isAsyncExecuteTimeoutRejection())) { 
         throw rex; 
     } 
     if (!hasLoggedAsyncWarning) { 
         LOG.warning("EXECUTOR_FULL_WARNING"); 
         hasLoggedAsyncWarning = true; 
     } 
     LOG.fine("EXECUTOR_FULL"); 
     handleResponseInternal(); 
}
{code}



  was:
Creating this Jira according to the discussion 
[here|http://cxf.547215.n5.nabble.com/Response-always-handled-on-current-thread-when-WorkQueue-rejects-execution-tt5793019.html]

In the method 

[org.apache.cxf.transport.http.HTTPConduit.handleResponseOnWorkqueue(boolean 
allowCurrentThread, boolean 
forceWQ)|https://github.com/apache/cxf/blob/540bb76f6f3d3d23944c566905f9f395c6f86b79/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java#L1190]

If the work queue is full so that RejectedExecutionException is thrown and 
allowCurrentThread is false like when called from 
[AsyncHttpConduit|https://github.com/apache/cxf/blob/6db38f9984b9c0bf6309a3d7e26d5a9ab8055d1f/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java#L600]
 the expression in the if statement below will always return false and the 
response will be handled on the current thread via the call to 
handleResponseInternal. When used from AsyncHttpConduit this will be the IO 
core thread which is not a good idea.
{code:java}
} catch (RejectedExecutionException rex) {
    if (allowCurrentThread
        && policy != null
        && policy.isSetAsyncExecuteTimeoutRejection()
        && policy.isAsyncExecuteTimeoutRejection()) {
        throw rex;
    }
    if (!hasLoggedAsyncWarning) {
        LOG.warning("EXECUTOR_FULL_WARNING");
        hasLoggedAsyncWarning = true;
    }
    LOG.fine("EXECUTOR_FULL");
    handleResponseInternal();
}
{code}




> HttpConduit.handleResponseOnWorkqueue will always handle response on current 
> thread when allowCurrentThread is false and the work queue rejects the 
> execution
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-7881
>                 URL: https://issues.apache.org/jira/browse/CXF-7881
>             Project: CXF
>          Issue Type: Bug
>          Components: Transports
>    Affects Versions: 3.2.6
>            Reporter: Jan Hallonsten
>            Priority: Major
>
> Creating this Jira according to the discussion 
> [here|http://cxf.547215.n5.nabble.com/Response-always-handled-on-current-thread-when-WorkQueue-rejects-execution-tt5793019.html]
> In the method 
> [org.apache.cxf.transport.http.HTTPConduit.handleResponseOnWorkqueue(boolean 
> allowCurrentThread, boolean 
> forceWQ)|https://github.com/apache/cxf/blob/540bb76f6f3d3d23944c566905f9f395c6f86b79/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java#L1190]
> If the work queue is full so that RejectedExecutionException is thrown and 
> allowCurrentThread is false like when called from 
> [AsyncHttpConduit|https://github.com/apache/cxf/blob/6db38f9984b9c0bf6309a3d7e26d5a9ab8055d1f/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java#L600]
>  the expression in the if statement below will always return false and the 
> response will be handled on the current thread via the call to 
> handleResponseInternal. When used from AsyncHttpConduit this will be the IO 
> core thread which is not a good idea.
> {code:java}
> } catch (RejectedExecutionException rex) {
>     if (allowCurrentThread
>         && policy != null
>         && policy.isSetAsyncExecuteTimeoutRejection()
>         && policy.isAsyncExecuteTimeoutRejection()) {
>         throw rex;
>     }
>     if (!hasLoggedAsyncWarning) {
>         LOG.warning("EXECUTOR_FULL_WARNING");
>         hasLoggedAsyncWarning = true;
>     }
>     LOG.fine("EXECUTOR_FULL");
>     handleResponseInternal();
> }
> {code}
> I think that the code above should be changed to
> {code:java}
> } catch (RejectedExecutionException rex) { 
>      if (!allowCurrentThread 
>          || (policy != null 
>          && policy.isSetAsyncExecuteTimeoutRejection() 
>          && policy.isAsyncExecuteTimeoutRejection())) { 
>          throw rex; 
>      } 
>      if (!hasLoggedAsyncWarning) { 
>          LOG.warning("EXECUTOR_FULL_WARNING"); 
>          hasLoggedAsyncWarning = true; 
>      } 
>      LOG.fine("EXECUTOR_FULL"); 
>      handleResponseInternal(); 
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to