Schreiben Sie einen Servlet, die JMS-Talk zu (ActiveMQ) und onMessage die Website aktualisieren

StackOverflow https://stackoverflow.com/questions/64843

Frage

Ich bin den Aufbau einer Website, die eine einfache AJAX Servlets verwendet JMS (ActiveMQ) zu sprechen, und wenn eine Nachricht aus dem Thema kommt die Website zu aktualisieren.

Ich habe Javascript, die eine XMLHttpRequest für Daten bereitstellt. Die Servlet verarbeitet die Get-Anfrage und JSON zurückschickt. Allerdings habe ich keine Ahnung, wie meine Servlets in meine ActiveMQ Message Broker zu verbinden. Es sendet nur jetzt Dummy-Daten zurück.

Ich denke die Servelt sollte die Message implementieren. Dann onMessage Daten an die JavaScript-Seite senden. Aber ich bin nicht sicher, wie dies zu tun.

War es hilfreich?

Lösung

Das Problem ein Servlet implementieren Message mit ist, dass Servlets sind synchron und MessageListeners sind asynchron. Stattdessen sollten Sie ein anderes Objekt erstellen, die als Message zu handeln und einigen Zustand irgendwo aktualisieren (möglicherweise eine Datenbank oder einen JMX MBean oder eine Stateful Session EJB), wenn Nachrichten in kommen. Dann kann die Servlet diesen Zustand abfragen, um zu sehen, ob Daten gibt es zu berichten, zurück an den Client, und Ihre Web-Seite in regelmäßigen Abständen die Servlet-ping für neue Daten zu fragen.

Andere Tipps

Wie James Strachan sagt - http://activemq.apache.org/ajax.html ist ein ideale out-of-the-box-Lösung für Ihr Problem.

Wenn Sie immer noch eine solche Lösung erstellen möchten manuell können Sie einfach JMS-Verbindung in Ihrem Ajax-Servlet erstellen (Verbindung pro Anfrage). Betrachten wir mit Spring JMS-Vorlage aus diesem Grund ( http: // static .springsource.org / Feder / docs / 2.5.x / Referenz / jms.html ). Dann erhält nur die Nachricht in der Servlet doGet / doPost Methode. Betrachten niedrigen Timeout-Wert für die in diesem Fall erhalten. Eine solche Lösung wird für die Warteschlangen und dauerhaft Themen arbeiten.

Für kurzlebige Themen betrachten externe Nachricht Hörer. Frühling MessageListenerContainer ist ein ausgezeichnetes Werkzeug für diesen Zweck:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer
   <property name="connectionFactory" ref="jmsFactory"/>
   <property name="destination" ref="myTopic" />
   <property name="messageListener" ref="lastTenUpdatesCache" />
</bean>

Bean lastTenUpdatesCache wird ein Singleton Bean Implementierung MesssageListener sein. Diese Bean würde für das Caching letzten zehn Nachrichten verantwortlich sein (nur in eine java.util Liste setzen). Es wird in der Ajax-Servlet injiziert werden, um in Ihrer doGet / doPost Methode Sie es über letzte 10 gesendeten Nachrichten zum Thema fragen.

Haben Sie versucht, die Antworten zu lesen für diese Frage , die die ActiveMQ Ajax Unterstützung . Grundsätzlich hat ActiveMQ native Unterstützung für Ajax, so dass Sie seine JavaScript-Bibliothek verwenden können, um direkt von einem ActiveMQ Thema zu abonnieren.

Siehe auch die ActiveMQ Bahnproben die zeigen, wie Dinge wie Echtzeit zu tun Chat oder Echtzeit-Aktienportfolio Bildschirm mit Ajax mit ActiveMQ

Sie müssen wahrscheinlich eine JMS-Verbindung von JNDI zu bekommen, wie folgt aus:

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,
    "tcp://hostname:61616");
javax.naming.Context ctx = new InitialContext(props);
// lookup the connection factory
javax.jms.TopicConnectionFactory factory = 
    (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory");
// create a new TopicConnection for pub/sub messaging
javax.jms.TopicConnection conn = factory.getTopicConnection();
// lookup an existing topic
javax.jms.Topic mytopic = (javax.jms.Topic)ctx.lookup("MyTopic");
// create a new TopicSession for the client
javax.jms.TopicSession session = 
    conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
// create a new subscriber to receive messages
javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top