在JMS队列上发布消息?

时间:2014-02-26 12:12:04

标签: java jms activemq

我是JMS的新手并且通过Active MQ Hello world的例子。假设每当我进入时我就有一个场景 在DB中的employee表下,我必须将消息放入queue.here是来自hello world示例的生产者代码片段

public static class HelloWorldProducer  {
        public void createMessageOnQueue() {
            try {
                // Create a ConnectionFactory
                ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");

                // Create a Connection
                Connection connection = connectionFactory.createConnection();
                connection.start();

                // Create a Session
                Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

                // Create the destination (Topic or Queue)
                Destination destination = session.createQueue("TEST.FOO");

                // Create a MessageProducer from the Session to the Topic or Queue
                MessageProducer producer = session.createProducer(destination);
                producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

                // Create a messages
                String text = "Hello world! From: " + Thread.currentThread().getName() + " : " + this.hashCode();
                TextMessage message = session.createTextMessage(text);

                // Tell the producer to send the message
                System.out.println("Sent message: "+ message.hashCode() + " : " + Thread.currentThread().getName());
                producer.send(message);

                // Clean up
                session.close();
                connection.close();
            }
            catch (Exception e) {
                System.out.println("Caught: " + e);
                e.printStackTrace();
            }
        }
    }

现在我的问题是,如果我关闭连接和会话,它也会关闭队列吗?如果是,如果消息尚未被消费,会发生什么?

第二个问题是如果我需要第二次在同一队列(即“TEST.FOO”)上发布消息,我是否需要第二次调用createMessageOnQueue方法。如果是,则不会使用session.createQueue("TEST.FOO")?

创建新队列

2 个答案:

答案 0 :(得分:0)

队列创建一次,只有您可以手动删除它。 一旦消息被发送到队列,它将等待队列,直到它被消耗(与主题不同)。

如果要将消息发送两次,则无需重新创建消息。但话又说回来,你为什么要送两次呢?

我觉得您的问题可能会使用JMS事务解决。

答案 1 :(得分:0)

  

现在我的问题是,如果我关闭连接和会话,是吗?   关闭队列呢?如果是,如果没有消息将会发生什么   消耗了吗?

消息仍然在队列中。没有“关闭队列”这样的事情。

  

第二个问题是我是否需要在同一队列上发布消息(即   “TEST.FOO”)第二次,我需要调用createMessageOnQueue   方法第二次。如果是,它是否不会创建新队列   session.createQueue( “TEST.FOO”)?

session.createQueue(“TEST.FOO”)不一定会创建队列,只是获取对现有队列的引用。

session#createQueue()

的javadoc
  

请注意,此方法只是创建一个封装的对象   主题的名称。它不会在JMS中创建物理主题   供应商。 JMS没有提供创建物理主题的方法,   因为这将特定于给定的JMS提供者。创建一个   物理主题是特定于提供者的,通常是管理主题   由管理员执行的任务,尽管某些提供商可能会创建   它们会在需要时自动生成。

相关问题