3

からメッセージをプルするためのコードを書きたいと思います。一度にActivemqすべてのメッセージをプルしたくありません。Activemq私の要件は、Java アプリケーションが から 1 つのメッセージを受信するたびに、Activemqメッセージ本文に基づいて対応するものを見つけHTTP Linkて転送することだからです。リンク。このロジック全体について、2 つ.javaのファイル名を書きました。

MessageConsumer.java

MyListener.java

MessageConsumer.java ファイルは接続確立専用です。対応するコードは以下のとおりです。

 package PackageName;
 import java.io.IOException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.jms.*;
 import org.apache.activemq.ActiveMQConnectionFactory;
 public class MessageConsumer extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
    throws ServletException, IOException {
    try {
      //creating connectionfactory object for way
      ConnectionFactory connectionFactory=new        
      ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617");
     //establishing the connection b/w this Application and Activemq
     Connection connection=connectionFactory.createConnection();
     Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     Queue queue=session.createQueue("MessageTesing");
     javax.jms.MessageConsumer consumer=session.createConsumer(queue);
     //fetching queues from Activemq
     MessageListener listener = new MyListener();
    consumer.setMessageListener(listener);
    connection.start();
    System.out.println("Press a key to terminate");
    }
  catch (Exception e) {
    // TODO: handle exception
}
 }
}

MyListener.java ファイルは、対応する Applications.code をトリガーするためのものです。

package PackageName;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class MyListener implements MessageListener {
public void onMessage(Message msg) {
    try {
        TextMessage msg1=(TextMessage)msg;
        //just for your understanding I mention dummy code
        System.out.println(msg1.getText());
        if (msg1.getText()=="Google") {
            System.out.println("Forwarding http link to Google");
        }
        else {
            System.out.println("Forwarding http link to Facebook");
        }
    } catch (JMSException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

私の投稿では、Google と Facebook のリンクをトリガーしています。しかし、私の要件に関しては、自分のアプリケーションを呼び出します。各アプリケーションは 20 分以上かかります。したがって、メッセージを 1 つずつプルしたいと思います。前のメッセージ プロセスが完了したら、それだけです。は から別のメッセージを受け取りますActivemq

しかし、私は一度にすべてのメッセージを受け取っていることを知っています.どうすればこれを修正できますか.私はプログラムを見ました.私Activemq-Hellowworldは理解できませんでした.

申し訳ありませんが、私はJavaテクノロジーに不慣れです。誰か助けてください。

ありがとう。

4

2 に答える 2

5

MessageListenerを使用している場合、実際にはメッセージを非同期的に (別のスレッドで) 受信しています。

おそらく同期メッセージ受信を探しているので、メインスレッドでこれを試してください:

final QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueConnection.start();

while (true) {
  Message message = queueReceiver.receive();
  // Process your message: insert the code from MyListener.onMessage here

  // Possibly add an explit message.acknowledge() here, 
  // if you want to make sure that in case of an exception no message is lost
  // (requires Session.CLIENT_ACKNOWLEDGE, when you create the queue session)

  // Possibly terminate program, if a certain condition/situation arises
}

なしMessageListener

receive() メッセージが利用可能になるまでブロックするため、メインスレッド (およびプログラム) はreceiveメソッドで待機します。メッセージが到着すると、それを受信して​​処理します。

アップデート

使用する場合

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

それからあなたは電話するべきです

message.acknowledge()

メッセージが完全に処理された後。

一方、メッセージの場合Session.AUTO_ACKNOWLEDGE、メッセージはすぐにキューから削除されます (そのため、メッセージの処理中にプログラムが終了すると失われます)。

于 2013-08-09T08:48:52.290 に答える
0

を使用する代わりに、オブジェクトでメソッドをMessageListener使用できます。この方法では、メソッドを呼び出すたびに 1 つのメッセージしか取得できません。receive()MessageConsumerreceive()

MessageConsumer consumer = session.createConsumer(destination); 
Message message = consumer.receive(1000);
于 2013-08-09T08:43:38.233 に答える