2008-09-15 7 views
2

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

データのXMLHttpRequestを作成するJavascriptがあります。サーブレットはGet Requestを処理し、JSONを返します。しかし、私はどのように私のサーブレットを私のActiveMQ Message Brokerに接続するのか分かりません。ダミーデータを送り返すだけです。

私はServeltがmessagelistenerを実装すべきだと思っています。その後、onMessageはJavaScriptページにデータを送信します。しかし、私はこれを行う方法がわかりません。あなたはおそらく、JNDIからJMS接続を取得する必要が

答えて

2

サーブレットはMessageListenerの実装を持つ問題は、サーブレットが同期しているとMessageListenersが非同期であるということです。その代わりに、MessageListenerとして動作し、メッセージが入ったときに何らかの状態(データベースまたはJMX MBeanまたはステートフルSession EJB)を更新するその他のオブジェクトを作成する必要があります。次に、サーブレットはその状態を照会して、報告するデータがあるかどうかを調べることができますクライアントに戻って、Webページは定期的にサーブレットにpingを送信して新しいデータを要求することができます。

+0

ありがとうございますjodonnell ..私はJMX MBeanやステートフルセッションEJBを書いたことはありませんが、すばやくGoogle検索した後、これは見下ろす正しい道だと思います。助けてくれてありがとう。 –

0

は、次のように:

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); 
+0

これは私のトピックに接続するための良い方法です。ありがとうございます。私はすでにこれが別のJavaクライアントのようなコードを持っています。しかし、私はServeltにmessagelistenerを実装させたい。その後、onMessageはJavascriptページにデータを送信します。 –

1

ActiveMQ Ajax supportにリンクしているthis questionの回答を読もうとしましたか。基本的にActiveMQはAjaxをネイティブにサポートしているため、JavaScriptライブラリを使用してActiveMQのトピックから直接購読することができます。

またジェームス・ストラチャンが言うようにActiveMQの

2

でのAjaxを使用してリアルタイムチャットやリアルタイムの株式ポートフォリオ画面のようなものを行う方法を示しActiveMQ web samplesを参照してください - http://activemq.apache.org/ajax.htmlをするための理想的なアウトオブボックスソリューションです。あなたの問題。

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

耐久性のないトピックについては、外部メッセージリスナーを検討してください。

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

lastTenUpdatesCacheMesssageListenerを実装するシングルトン豆になります:春MessageListenerContainerは、その目的のための優れたツールです。このBeanは最後の10個のメッセージをキャッシュする責任があります(java.utilリストに入れるだけです)。あなたのAjaxサーブレットに注入されるので、あなたのdoGet/doPostメソッドでは、そのトピックに送られた最後の10個のメッセージを聞くことができます。

関連する問題