Threading problem in Servicemix-HTTP which renders the component unusable.
--------------------------------------------------------------------------
Key: SM-1931
URL: https://issues.apache.org/activemq/browse/SM-1931
Project: ServiceMix
Issue Type: Bug
Components: servicemix-http
Affects Versions: 3.3.1
Environment: Windows XP, servicemix-http component 2009.02
Reporter: Ryan Moquin
Priority: Blocker
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.