2015-10-05 173 views
1

如何配置我的J2EE應用程序,以便可以與Tomcat服務器一起調用ActiveMQ服務?我知道關於嵌入式代理,這裏詢問如何啓動ActiveMQ,只要我啓動tomcat如何在tomcat啓動時啓動ActiveMQ?

當前代碼(正常工作): 現在我想刪除main()方法並使用代碼在tomcat運行時運行。

public class JMSService { 


public void produceJMS() throws NamingException, JMSException { 

    ConnectionFactory connFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL); 

    Connection conn = connFactory.createConnection(); 

    conn.start(); 

    Session session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); 

    Destination destination = session.createQueue("testQueue"); 

    MessageProducer producer = session.createProducer(destination); 
    producer.setDeliveryMode(DeliveryMode.PERSISTENT); 

    TextMessage message = session.createTextMessage("Test Message "); 

    // send the message 
    producer.send(message); 

    System.out.println("sent: " + message); 
}} 

這裏是我的消費:

public class JMSReceiver implements MessageListener,ExceptionListener { 

public static void main(String args[]) throws Exception { 

    JMSReceiver re = new JMSReceiver(); 
    re.receiveJMS();  
    } 

public void receiveJMS() throws NamingException, JMSException { 

    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL); 
    Connection connection = connectionFactory.createConnection(); 
    connection.start(); 


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

    // Getting the queue 'testQueue' 
    Destination destination = session.createQueue("testQueue"); 


    MessageConsumer consumer = session.createConsumer(destination);   

    // set an asynchronous message listener 
    JMSReceiver asyncReceiver = new JMSReceiver(); 
    consumer.setMessageListener(asyncReceiver); 

    connection.setExceptionListener(asyncReceiver); 

} 

@Override 
public void onMessage(Message message) { 

    System.out.println("Received message : " +message); 
} 

}

+0

您是否嘗試從您的客戶中刪除'connection.close()'? –

+0

感謝您的時間。請檢查我的更新 –

+0

由於它是java程序,它應該在jvm(java.exe)中運行。可能性是運行你的客戶端在像tomcat這樣的服務器上運行,或者作爲主線程運行。 –

回答

1

@Tim Bish說的是正確的。你或者需要有一個計時器,例如接收器應該監聽1小時 - 或者在程序終止之前使其可用。你需要這兩種情況下一次啓動消費計劃:

更改receiveJMS方法如下:

public void receiveJMS() throws NamingException, JMSException { 
try{ 
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL); 
    Connection connection = connectionFactory.createConnection(); 
    connection.start(); // it's the start point 


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

    // Getting the queue 'testQueue' 
    Destination destination = session.createQueue("testQueue"); 


    MessageConsumer consumer = session.createConsumer(destination);   

    // set an asynchronous message listener 
    // JMSReceiver asyncReceiver = new JMSReceiver(); 
    //no need to create another object 
    consumer.setMessageListener(this); 

    connection.setExceptionListener(this); 

    // connection.close(); once this is closed consumer no longer active 

    Thread.sleep(60 *60 * 1000);    // receive messages for 1 hour 
    }finally{ 
     connection.close();// after 1 hour close it 
    } 

} 

上述程序將聽取高達1小時。如果您希望只要程序運行,請刪除finally塊。但推薦的方法是以某種方式關閉它。由於您的應用程序似乎是獨立的,因此您可以檢查java runtime shutdown hook,您可以在程序終止時指定如何釋放這些資源。

如果您的消費者是一個Web應用程序,您可以在ServletContextlistner關閉它。

1

你不給消費者應用程序的任何時間以實際收到一條消息,您創建它,那麼你將其關閉。您需要使用定時接收調用來同步接收來自隊列的消息,或者您需要在主方法中添加某種等待(例如CountDownLatch等),以允許異步onMessage調用在處理完該消息已完成。

+0

您正在詢問一個普通的java應用程序,因此需要一個主要方法,對於服務類型方案來看待像Tomcat這樣的容器或某些類似的容器,JMS對容器或服務沒有定義。 –