2014-02-26 131 views
1

我是JMS的新手,并通过Active MQ Hello world的示例。说我有一个场景,每当我做入门 在DB员工的桌子底下,我必须把消息queue.here是从Hello World示例现在在JMS队列上发布消息?

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")?

回答

0

现在我的问题是,如果我关闭了连接和会话,它会关闭队列还是 ?如果是,如果消息还没有被消费,会发生什么?

消息仍然在队列中。没有'关闭队列'这样的东西。

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

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

会话#createQueue方法()

注意的javadoc,这种方法只是简单地创建一个封装了话题的 名称的对象。它不会在JMS 提供程序中创建物理主题。 JMS不提供创建物理主题的方法,因为这将特定于给定的JMS提供者。创建一个 物理主题是特定于提供程序的,通常由管理员执行的管理 任务,但有些提供程序可能会在需要时自动创建 。

0

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

如果您想发送两次邮件,则不需要重新创建邮件。但是,那么,为什么你会发送两次?

我觉得你的问题可以通过使用JMS事务来解决。