Oracle Advanced Queueを実装しました&リスナー・プログラムを作成しています。MessageListenerがOracle Queueのメッセージをリッスンしない
package com.myprog;
import java.io.File;
import java.io.FileInputStream;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;
import oracle.jms.AQjmsFactory;
import oracle.jms.AQjmsSession;
import org.apache.log4j.Logger;
public class abc implements MessageListener, ExceptionListener {
private static String queueUserName = "admin";
private static String queueName = "my_queue";
// Initialize the logger
private static Logger log = Logger.getLogger(abc.class);
public static void main(String[] args) {
final String METHOD_NAME = "main()";
abc a = new abc();
Queue queue;
try {
QueueConnection QCon = getConnection();
Session session = QCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QCon.start();
queue = ((AQjmsSession) session).getQueue(queueUserName, queueName);
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(a);
QCon.setExceptionListener(a);
consumer.close();
session.close();
QCon.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
public static QueueConnection getConnection() {
String hostname = "myhost";
String oracle_sid = "mysid";
int portno = 1521;
String userName = "myapp";
String password = "pwd";
String driver = "thin";
QueueConnectionFactory QFac = null;
QueueConnection QCon = null;
try {
// get connection factory , not going through JNDI here
QFac = AQjmsFactory.getQueueConnectionFactory(hostname, oracle_sid, portno,driver);
// create connection
QCon = QFac.createQueueConnection(userName, password);
} catch (Exception e) {
e.printStackTrace();
}
return QCon;
}
@Override
public void onException(JMSException e) {
log.error(e);
}
@Override
public void onMessage(Message message) {
TextMessage msg = (TextMessage) message;
try {
String m = msg.getText();
System.out.println("m="+m);
log.info("MESSAGE RECEIVED " + m);
} catch (JMSException e) {
log.error(e);
}
}
}
このプログラムは、Oracleキュー内のメッセージを聞い&を実行し続けるスタンドアロンのプログラムであることに注意してください。以下は、私のサンプルです。私は、このクラスファイルのJAR &実行、それを作成したときに
は残念ながら、それだけで&を終了し、その後&を実行し、キュー内の1つのだけのメッセージを消費します。リスナーがキューを聞いて&を実行し続けるのはなぜですか?
私はそれが待ち続けると思った&キュー内のすべてのメッセージを取得する&その後、リッスンモードは永遠に残りますが、そのようには動作しません。
何か問題があると私には分かりますか?
おかげ
tryブロックの先頭からwhile(真)でブロックの最後まですべてのコードをラップして、メッセージを消費するとそのキューの設定をすべて再実行し、別のメッセージを待っているようにしてください。私はそれがメインであるので、あなたが各メッセージを処理した後にそのセッションを作成しなければならないかもしれないと思います。これは恒久的な解決策ではないかもしれませんが、今のところそれが得られるかもしれません。 – Logan
@Logan、ブロックしようとしていますか?それは主な方法のものですか? – Mike
はい、申し訳ありません。メインメソッドの1つ。 – Logan