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);
}
}
}
이 프로그램은 오라클 큐의 메시지를 듣고 &을 계속 실행하는 독립 실행 형 프로그램입니다 참고 : 다음은 내 샘플입니다. 나는이 클래스 파일 & 실행 그것의 항아리를 만들 때
불행하게도, 그냥 다음 &를 실행 & 대기열에 단 1 메시지를 소비 종료합니다. 청취자가 대기열 수신 대기 중 &을 계속 실행하지 않는 이유는 무엇입니까?
나는 계속 듣고 있다고 생각했다. & 대기열에있는 모든 메시지를 검색한다. & 그런 다음 영원히 듣기 모드로 남아있을 것이지만, 그런 식으로 행동하지는 않는다.
무엇이 잘못되었는지 알 수있는 사람이 있으면 감사하게 생각하십시오.
감사
try 블록의 시작 부분에서 while (true)을 사용하여 블록의 끝까지 래핑 해보십시오. 그러면 메시지를 소비 한 후 해당 큐 설정을 다시 실행하고 다른 메시지를 기다리고 있습니다. . 나는 그것이 메인에 있기 때문에 각 메시지를 처리 한 후에 그 세션을 만들어야 할 수도 있다고 생각한다. 이것은 영구적 인 해결책은 아닐지 모르지만 지금 당장 얻을 수 있습니다. – Logan
@Logan, 블록을 사용하는 것은 무엇입니까? 주요 방법에서 나온 것입니까? – Mike
예, 죄송합니다. 주요 방법에있는 것. – Logan