2014-02-26 193 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事務來解決。