Details
-
Bug
-
Status: Resolved
-
Blocker
-
Resolution: Fixed
-
servicemix-http-2008.01, servicemix-http-2009.01, servicemix-http-2009.02
-
None
-
Windows XP, servicemix-http component 2009.02
Description
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.