From e03b437442335d33ad52d31a750701933fb021d0 Mon Sep 17 00:00:00 2001 From: fmoga Date: Tue, 24 May 2011 14:27:45 +0000 Subject: Improve comet support. Add status to callback return type to determine when browser client has closed the page. Upgrade to atmosphere-jquery-0.7.1. Add support for multiple tabs. Fix and improve reliability of long polling technique. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1127080 13f79535-47bb-0310-9956-ffa450edef68 --- .../comet/runtime/handler/CometBindingHandler.java | 46 +++++++++++----------- 1 file changed, 24 insertions(+), 22 deletions(-) (limited to 'sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler') diff --git a/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java b/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java index a62d73d467..0d47b72f8b 100644 --- a/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java +++ b/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java @@ -32,24 +32,27 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; import org.apache.tuscany.sca.assembly.EndpointReference; import org.apache.tuscany.sca.binding.comet.runtime.CometComponentContext; -import org.apache.tuscany.sca.binding.comet.runtime.CometMessageContext; import org.apache.tuscany.sca.binding.comet.runtime.ServletFactory; import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl; import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl; +import org.apache.tuscany.sca.core.invocation.Constants; import org.apache.tuscany.sca.core.invocation.impl.MessageImpl; import org.apache.tuscany.sca.interfacedef.DataType; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Message; import org.apache.tuscany.sca.runtime.RuntimeEndpoint; -import org.atmosphere.annotation.Broadcast; +import org.atmosphere.cache.SessionBroadcasterCache; import org.atmosphere.cpr.Broadcaster; import org.atmosphere.cpr.DefaultBroadcaster; +import org.atmosphere.cpr.DefaultBroadcasterFactory; +import org.atmosphere.jersey.JerseyBroadcaster; import org.atmosphere.jersey.SuspendResponse; +import org.atmosphere.jersey.util.JerseyBroadcasterUtil; -import com.google.gson.Gson; import com.sun.jersey.spi.container.servlet.PerSession; /** @@ -66,11 +69,6 @@ public class CometBindingHandler { */ private Broadcaster broadcaster; - /** - * JSON converter. - */ - private Gson gson = new Gson(); - /** * The underlying servlet context. */ @@ -82,6 +80,15 @@ public class CometBindingHandler { private CometComponentContext context; + @GET + @Path("/sessionId") + @Produces(MediaType.TEXT_PLAIN) + public String establishSessionId() { + request.getSession().invalidate(); + request.getSession(true); + return "OK"; + } + /** * Method called at comet connect time. This suspends the response and keeps * the connection opened. @@ -89,12 +96,14 @@ public class CometBindingHandler { * @return the suspended response */ @GET + @Path("/connect") public SuspendResponse connect() { System.out.println("-- connect -- Session Id: " + request.getSession().getId()); if (broadcaster == null) { - broadcaster = new DefaultBroadcaster(); + broadcaster = new JerseyBroadcaster(); context = (CometComponentContext) sc.getAttribute(ServletFactory.COMET_COMPONENT_CONTEXT_KEY); } + CometComponentContext.broadcasters.put(request.getSession().getId(), broadcaster); return new SuspendResponse.SuspendResponseBuilder().broadcaster(this.broadcaster).outputComments(true) .build(); } @@ -117,7 +126,6 @@ public class CometBindingHandler { */ @POST @Path("/{service}/{method}") - @Broadcast public void handleRequest(@PathParam("service") final String service, @PathParam("method") final String method, @FormParam("callback") final String callbackMethod, @FormParam("params") final String jsonData) throws InvocationTargetException { @@ -128,6 +136,7 @@ public class CometBindingHandler { final Object[] args = decodeJsonDataForOperation(jsonData, operation); Message msg = createMessageWithMockedCometReference(args, callbackMethod); + System.out.println("CometBindingHandler thread id: " + Thread.currentThread().getId()); wire.invoke(operation, msg); } @@ -144,7 +153,7 @@ public class CometBindingHandler { int index = 0; // convert each argument to the corresponding class for (final DataType dataType : operation.getInputType().getLogical()) { - args[index] = this.gson.fromJson(json[index], dataType.getPhysical()); + args[index] = CometComponentContext.gson.fromJson(json[index], dataType.getPhysical()); index++; } return args; @@ -161,11 +170,12 @@ public class CometBindingHandler { */ private Message createMessageWithMockedCometReference(Object[] args, String callbackMethod) { Message msg = new MessageImpl(); + msg.getHeaders().put(Constants.MESSAGE_ID, request.getSession().getId()); msg.setBody(args); - CometMessageContext messageContext = new CometMessageContext(this, callbackMethod); - msg.setBindingContext(messageContext); EndpointReference re = new RuntimeEndpointReferenceImpl(); - re.setCallbackEndpoint(new RuntimeEndpointImpl()); + RuntimeEndpointImpl callbackEndpoint = new RuntimeEndpointImpl(); + callbackEndpoint.setURI(callbackMethod); + re.setCallbackEndpoint(callbackEndpoint); msg.setFrom(re); return msg; } @@ -211,12 +221,4 @@ public class CometBindingHandler { return objects.toArray(new String[] {}); } - public void respondToClient(String callbackMethod, Object response) { - broadcaster.broadcast(callbackMethod + "($.secureEvalJSON('" + this.gson.toJson(response) + "'))"); - } - - public boolean isClientConnected() { - return !broadcaster.getAtmosphereResources().isEmpty(); - } - } -- cgit v1.2.3