After getting this all set up, I was able to get my channel configured and subscribe to it from the flex client. In my tomcat log, I could see how the comet request timeouts happened at regular intervals (as you’d expect). I wasn’t, however, getting messages sent to the client. Since that is the whole purpose of this exercise, getting this working was very important!
After digging through the gravity code, it seems that the thing that was missing is that the sub_topic header needs to be set on the message. Once I set that to be the same as the client was expecting, it worked great! Here is the code for a servlet I extend for some REST web services which need to send a message to my flex app.
import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import flex.messaging.messages.AsyncMessage; import flex.messaging.messages.Message; import org.granite.gravity.AbstractChannel; import org.granite.gravity.Gravity; import org.granite.gravity.tomcat.TomcatChannelFactory; public class GravityServlet extends HttpServlet { private Gravity gravity; private AbstractChannel pubChannel; public void init(ServletConfig config) throws ServletException { gravity = (Gravity)config.getServletContext().getAttribute("org.granite.gravity.Gravity"); pubChannel = new AbstractChannel(gravity) { @Override protected void clearQueue() { } @Override public void deliver( AbstractChannel from, Message message, String subscriptionId ) { } }; gravity.registerChannel(pubChannel); } protected void sendMessage(String msg) { AsyncMessage message = new AsyncMessage(); message.setBody(msg); message.setHeader(AsyncMessage.SUBTOPIC_HEADER, "discussion"); message.setDestination("etlprocess"); gravity.publishMessage(pubChannel, message); } }Here is the code that registers to receive the messages;
// this code sets up listener for server push of EDL update status consumer = new Consumer(); consumer.destination = "etlprocess"; consumer.topic = "discussion"; consumer.subscribe(); consumer.addEventListener(MessageEvent.MESSAGE, handleETL);The web.xml looks like this;
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com /dtd/web-app_2_3.dtd"> <web-app> <!-- read services-config.xml file at web application startup --> <listener> <listener-class>org.granite.config.GraniteConfigListener</listener-class> </listener> <!-- handle AMF requests ([de]serialization) --> <filter> <filter-name>AMFMessageFilter</filter-name> <filter-class>org.granite.messaging.webapp.AMFMessageFilter</filter-class> </filter> <filter-mapping> <filter-name>AMFMessageFilter</filter-name> <url-pattern>/graniteamf/*</url-pattern> </filter-mapping> <!-- handle AMF requests (execution) --> <servlet> <servlet-name>AMFMessageServlet</servlet-name> <servlet-class>org.granite.messaging.webapp.AMFMessageServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>GravityServlet</servlet-name> <servlet-class>org.granite.gravity.tomcat.GravityTomcatServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AMFMessageServlet</servlet-name> <url-pattern>/graniteamf/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>GravityServlet</servlet-name> <url-pattern>/gravity/*</url-pattern> </servlet-mapping> </web-app>One more piece that I seem to have left out. In the services-config.xml which configures graniteDS, I had to add a service def that defined my destination (in this case, "etlprocess").
<service id="messaging-service" class="flex.messaging.services.MessagingService" messageTypes="flex.messaging.messages.AsyncMessage"> <adapters> <adapter-definition id="default" class="org.granite.gravity.adapters.SimpleServiceAdapter" default="true"/> </adapters> <destination id="etlprocess"> <channels> <channel ref="my-gravityamf"/> </channels> </destination> </service>
Image may be NSFW.
Clik here to view.Image may be NSFW.
Clik here to view.