[英]Glassfish & JMS: Why do published messages not arrive at subscribers?
我有一台運行在遠程計算機(JDK 1.6.0_30)上的Glassfish 3.1.2服務器。 以下代碼是在Java SE環境中運行的獨立客戶端,該客戶端使用JNDI查找連接到JMS。 客戶端同時是發布者和訂閱者。
我創建了JMS連接池和主題,如下所示:
./asadmin create-jms-resource --restype javax.jms.ConnectionFactory jms/TopicConnectionFactory
./asadmin create-jms-resource --restype javax.jms.Topic jms/TopicUpdate
我啟動了此客戶端的兩個實例。 消息似乎已傳遞-沒有錯誤-但消息未到達訂戶...
我做錯了什么?
任何幫助表示贊賞-非常感謝!
public class JMS implements MessageListener {
private TopicConnectionFactory factory;
private TopicConnection connection;
private Topic topic;
private void subscribe() {
try {
System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext();
factory = (TopicConnectionFactory)ctx.lookup("jms/TopicConnectionFactory");
topic = (Topic)ctx.lookup("jms/TopicUpdate");
connection = factory.createTopicConnection();
TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
TopicSubscriber subscriber = session.createSubscriber(topic);
subscriber.setMessageListener(this);
connection.start();
while(true) {
Thread.sleep(5000);
sendMessage();
}
} catch (InterruptedException ex) {
Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
} catch (NamingException ex) {
Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
} catch (JMSException ex) {
Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void sendMessage() {
try {
TopicSession session = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
TopicPublisher publisher = session.createPublisher(topic);
TextMessage message = session.createTextMessage();
message.setText("Message from client.");
publisher.send(message);
session.close();
System.out.println("Message sent.");
} catch (JMSException ex) {
Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void onMessage(Message msg) {
System.out.println("Message received.");
}
public JMS() {
subscribe();
}
public static void main(String[] args) {
new JMS();
}
}
當您在創建會話時將true用作第一個參數時,確認模式將被忽略,並假定您已進行交易。 嘗試使用第一個參數為false的方法。
顯然,修改以下代碼行:
TopicSession session = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
成為 :
TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
在您的發送消息方法中。
最好使發布者和訂閱者有所不同。
這是如何使用Spring JMS模板進行訂閱的代碼。
public class MsgReader implements
SessionAwareMessageListener<Message> {
@Override
public void onMessage(Message message, Session session) throws JMSException {
if (message instanceof TextMessage) {
try {
System.out.println(((TextMessage) message).getText());
} catch (JMSException ex) {
throw new RuntimeException(ex);
}
} else {
throw new IllegalArgumentException(
"Message must be of type TextMessage");
}
}
}
Spring Bean文件。
最后裝入豆。
公共類SpringJMSTest {
/** * @param args */ public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{"/resource/consumerBean.xml"}); } }
現在,您將開始在控制台中接收消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.