2

シンプルな AJAX サーブレットを使用して JMS (ActiveMQ) と通信し、トピックからメッセージが到着したときにサイトを更新するサイトを構築しています。

データの XMLHttpRequest を作成する Javascript があります。サーブレットは Get リクエストを処理し、JSON を返します。ただし、サーブレットを ActiveMQ Message Broker に接続する方法がわかりません。今はダミーデータを送り返すだけです。

私はServeltがメッセージリスナーを実装するべきだと考えています。次に、onMessage が JavaScript ページにデータを送信します。しかし、これを行う方法がわかりません。

4

4 に答える 4

2

サーブレットに MessageListener を実装させる場合の問題は、サーブレットが同期で、MessageListener が非同期であることです。代わりに、MessageListener として機能する別のオブジェクトを作成し、メッセージが着信したときにどこか (おそらくデータベース、JMX MBean、またはステートフル セッション EJB) の状態を更新する必要があります。その後、サーブレットはその状態をクエリして、報告するデータがあるかどうかを確認できます。クライアントに戻ると、Web ページは定期的にサーブレットに ping を送信して新しいデータを要求できます。

于 2008-09-15T17:56:07.417 に答える
2

James Strachan が言うように - http://activemq.apache.org/ajax.htmlは、問題に対する理想的なすぐに使えるソリューションです。

このようなソリューションを手動で作成したい場合は、Ajax サーブレットで JMS 接続を作成するだけです (リクエストごとの接続)。そのため、Spring JMS テンプレートの使用を検討してください ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html )。次に、サーブレットの doGet/doPost メソッドでメッセージを受け取るだけです。その場合、受信のタイムアウト値を低くすることを検討してください。このようなソリューションは、キューと永続的なトピックで機能します。

非永続的なトピックについては、外部メッセージ リスナーを検討してください。SpringMessageListenerContainerは、その目的のための優れたツールです。

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

BeanlastTenUpdatesCacheは、 を実装するシングルトン Bean になりますMesssageListener。この Bean は、最後の 10 個のメッセージをキャッシュする役割を果たします (それを java.util リストに入れるだけです)。これは Ajax サーブレットに挿入されるため、doGet/doPost メソッドで、トピックに送信された最新の 10 件のメッセージについて問い合わせることができます。

于 2010-03-02T08:04:04.330 に答える
1

ActiveMQAjaxサポートにリンクしているこの質問の回答を読んでみましたか。基本的に、ActiveMQはAjaxをネイティブでサポートしているため、JavaScriptライブラリを使用してActiveMQトピックから直接サブスクライブできます。

ActiveMQでAjaxを使用してリアルタイムチャットやリアルタイムの株式ポートフォリオ画面などを実行する方法を示すActiveMQWebサンプルも参照してください。

于 2008-09-16T13:44:14.347 に答える
0

次のように、おそらく JNDI から JMS 接続を取得する必要があります。

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);
于 2008-09-15T17:24:08.303 に答える