View Javadoc

1   /*
2    * $Id: JettyContinuationsReceiverServlet.java 12320 2008-07-13 04:58:28Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.servlet.jetty;
12  
13  import org.mule.DefaultMuleMessage;
14  import org.mule.api.MuleException;
15  import org.mule.api.MuleMessage;
16  import org.mule.api.config.MuleProperties;
17  import org.mule.api.transport.MessageReceiver;
18  import org.mule.transport.http.HttpConnector;
19  import org.mule.transport.servlet.HttpRequestMessageAdapter;
20  
21  import javax.servlet.http.HttpServletRequest;
22  
23  import org.mortbay.util.ajax.Continuation;
24  import org.mortbay.util.ajax.ContinuationSupport;
25  
26  public class JettyContinuationsReceiverServlet extends JettyReceiverServlet
27  {
28      private Object mutex = new Object();
29  
30      //@Override
31      protected MuleMessage doMethod(HttpServletRequest request, String method) throws MuleException
32      {
33          final Continuation continuation = ContinuationSupport.getContinuation(request, mutex);
34          synchronized (mutex)
35          {
36              MessageReceiver receiver = getReceiverForURI(request);
37  
38              MuleMessage requestMessage = new DefaultMuleMessage(new HttpRequestMessageAdapter(request));
39              requestMessage.setProperty(HttpConnector.HTTP_METHOD_PROPERTY, method);
40              //Need to remove this if set, we'll be returning a result but we need to make the request async
41              requestMessage.removeProperty(MuleProperties.MULE_REMOTE_SYNC_PROPERTY);
42              //This will allow Mule to continue the response once the service has do its processing
43              requestMessage.setReplyTo(continuation);
44              setupRequestMessage(request, requestMessage);
45  
46              //we force asynchronous in the {@link #routeMessage} method
47              routeMessage(receiver, requestMessage, request);
48  
49              continuation.suspend(10000);
50          }
51  
52          return (MuleMessage)continuation.getObject();
53      }
54  
55      protected MuleMessage routeMessage(MessageReceiver receiver, MuleMessage requestMessage, HttpServletRequest request)
56          throws MuleException
57      {
58          //Force asynchronous processing since we are using continuations
59          return receiver.routeMessage(requestMessage, false);
60      }
61  }