View Javadoc

1   /*
2    * $Id: JettyContinuationsReceiverServlet.java 19341 2010-09-03 14:40:03Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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.api.MuleEvent;
14  import org.mule.api.MuleException;
15  import org.mule.api.MuleMessage;
16  import org.mule.api.transport.MessageReceiver;
17  import org.mule.transport.http.HttpConnector;
18  
19  import java.io.IOException;
20  
21  import javax.servlet.ServletException;
22  import javax.servlet.http.HttpServletRequest;
23  import javax.servlet.http.HttpServletResponse;
24  
25  import org.mortbay.util.ajax.Continuation;
26  import org.mortbay.util.ajax.ContinuationSupport;
27  
28  public class JettyContinuationsReceiverServlet extends JettyReceiverServlet
29  {
30      private Object mutex = new Object();
31  
32      @Override
33      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
34      {
35          try
36          {
37              final Continuation continuation = ContinuationSupport.getContinuation(request, mutex);
38              synchronized (mutex)
39              {
40                  MessageReceiver receiver = getReceiverForURI(request);
41  
42                  MuleMessage requestMessage = receiver.createMuleMessage(request);
43                  requestMessage.setOutboundProperty(HttpConnector.HTTP_METHOD_PROPERTY, request.getMethod());
44  
45                  //This will allow Mule to continue the response once the service has do its processing
46                  requestMessage.setReplyTo(continuation);
47                  setupRequestMessage(request, requestMessage, receiver);
48  
49                  //we force asynchronous in the {@link #routeMessage} method
50                  routeMessage(receiver, requestMessage, request);
51  
52                  continuation.suspend(10000);
53              }
54  
55              writeResponse(response, (MuleMessage) continuation.getObject());
56          }
57          catch (Exception e)
58          {
59              throw new ServletException(e);
60          }
61      }
62  
63      @Override
64      protected MuleEvent routeMessage(MessageReceiver receiver, MuleMessage requestMessage, HttpServletRequest request)
65              throws MuleException
66      {
67          //Force asynchronous processing since we are using continuations
68          return receiver.routeMessage(requestMessage);
69      }
70  }