簡體   English   中英

Glassfish和JMS:為什么發布的消息無法到達訂閱者?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM