2

我有一个在远程机器(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();
    }

}
4

2 回答 2

1

当您在创建会话时使用 true 作为第一个参数时,确认模式将被忽略,并假定您已进行交易。尝试将第一个参数设置为 false。

很清楚,修改这行代码:

TopicSession session = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);

成为 :

TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

在您的发送消息方法中。

于 2012-04-20T10:20:53.763 回答
0

让发布者和订阅者不同是个好主意。我

这是如何使用 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");
        }
    }
}
  • 弹簧豆文件。

  • 最后加载bean。

    公共类 SpringJMSTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{"/resource/consumerBean.xml"});
            }
    }
    
  • 现在您将开始在控制台中接收消息。

于 2012-04-20T07:32:16.457 回答