[
https://issues.apache.org/activemq/browse/SMXCOMP-713?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ryan Moquin updated SMXCOMP-713:
--------------------------------
Attachment: HttpConsumerEndpoint.java
I found out that my patch files to work if you are using JMS Flow. So I added
a line to the patched code which fixes that issue and it should now work in all
the cases the original did, without the failures on fast machines. We've been
testing our services with the patched servicemix-http component and it works
perfectly on all machines that were problematic and machines that weren't.
> Threading problem in Servicemix-HTTP which renders the component unusable.
> --------------------------------------------------------------------------
>
> Key: SMXCOMP-713
> URL: https://issues.apache.org/activemq/browse/SMXCOMP-713
> Project: ServiceMix Components
> Issue Type: Bug
> Components: servicemix-http
> Affects Versions: servicemix-http-2008.01, servicemix-http-2009.01,
> servicemix-http-2009.02
> Environment: Windows XP, servicemix-http component 2009.02
> Reporter: Ryan Moquin
> Assignee: Jean-Baptiste Onofré
> Priority: Blocker
> Attachments: HttpConsumerEndpoint.java, HttpConsumerEndpoint.java
>
>
> In most of the servicemix-http component versions, including the latest,
> there is a variable called isSTFlow which is a class variable. This variable
> appears to be shared among all threads that access a deployed servicemix-http
> component. The problem with this is that isSTFlow is set by a certain
> request based upon the state of it's continuation when the exchange response
> is processed here:
> if (!cont.isPending()) {
> isSTFlow = true;
> System.out.println("isSTFlow set to true because continuation
> isn't pending.");
> } else {
> isSTFlow = false;
> System.out.println("isSTFlow set to false because continuation is
> pending.");
> If isSTFlow is set to true during that response.. all future requests that
> come in will then end up executing this code block on line 348:
> } else {
> String id =
> (String)request.getAttribute(MessageExchange.class.getName());
> System.out.println("STFlow was true, removing
> exchange with id: " + id);
> locks.remove(id);
> exchange = exchanges.remove(id);
>
> request.removeAttribute(MessageExchange.class.getName());
> }
> before the exchange associated with the request has had a chance to return.
> Once that exchange has returned, it can't be found, because it was removed
> and throws a timeout error. Once isSTFlow becomes true, the component hits a
> race condition where it checks isSTFlow for true before the async call has a
> chance to return and immediately times out the exchange. This variable needs
> to be localized for each specific request, not global to all requests.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.