2012-01-08 43 views
1

異步JMS如何工作?我有下面的示例代碼:JMS如何在Java中工作?

public class JmsAdapter implements MessageListener, ExceptionListener 
{ 
private ConnectionFactory connFactory = null; 
private Connection conn = null; 
private Session session = null; 

public void receiveMessages() 
{ 
    try 
    { 
     this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED); 

     this.conn.setExceptionListener(this); 

     Destination destination = this.session.createQueue("SOME_QUEUE_NAME"); 

     this.consumer = this.session.createConsumer(destination); 

     this.consumer.setMessageListener(this); 

     this.conn.start(); 
    } 
    catch (JMSException e) 
    { 
     //Handle JMS Exceptions Here 
    } 
} 

@Override 
public void onMessage(Message message) 
{ 
    try 
    { 
     //Do Message Processing Here 

     //Message sucessfully processed... Go ahead and commit the transaction. 
     this.session.commit(); 
    } 
    catch(SomeApplicationException e) 
    { 
     //Message processing failed. 
     //Do whatever you need to do here for the exception. 

     //NOTE: You may need to check the redelivery count of this message first 
     //and just commit it after it fails a predefined number of times (Make sure you 
     //store it somewhere if you don't want to lose it). This way you're process isn't 
     //handling the same failed message over and over again. 
     this.session.rollback() 
    } 
} 

}

但我是新來的Java & JMS。我可能會在onMessage方法中使用消息。但我不知道它是如何工作的。

我是否需要在JmsAdapter類中添加主要方法?添加主要方法後,我需要創建一個罐子&然後運行jar爲「java -jar abc.jar」?

任何幫助,非常感謝。

更新:我想知道的是,如果我添加主要方法,我應該簡單地調用receiveMessages()在主?然後運行後,聽衆會繼續運行嗎?如果有消息,它會自動檢索onMessage方法嗎?

此外,如果聽者不斷地收聽,是不是需要CPU?在線程的情況下,當我們創建一個線程&將其置於睡眠狀態時,CPU利用率爲零,如果聽者情況下它如何工作?

注意:我只有Tomcat服務器&我不會使用任何jms服務器。我不確定偵聽器是否需要任何特定的jms服務器,如JBoss?但無論如何,請假設我除了tomcat之外沒有任何東西。 謝謝!

+0

我不知道你的問題與JMS做什麼。您似乎在問「如何在Java中運行程序」。 – skaffman 2012-01-08 00:04:16

+0

一旦部署在服務器上,您不會創建主要方法,onMessage()方法會處理髮送到您的班級正在觀察的隊列的所有消息。 onMessage()將包含消息到達隊列時要執行的邏輯。 – Logan 2012-01-08 00:36:55

+0

你用什麼JMS實現? – 2012-01-08 00:40:17

回答

5

在開始嘗試運行之前,您需要學會走路。

  • 閱讀/做一個關於Java編程的教程。這應該解釋(除其他外)如何從命令行編譯和運行Java程序。

  • 閱讀/做一個關於JMS的教程。

  • 閱讀關於如何創建可執行JAR文件的Oracle材料。

  • 找出你正在嘗試做什麼...和設計你的應用程序。


看着你已經證明什麼,告訴我們:

  • 可以主要方法添加到類,但作出可執行 JAR文件,您必須使用清單條目創建您的JAR文件,該清單條目使用main方法指定類的名稱。

  • 還有很多更是你必須做的之前的代碼將工作:

    • 添加代碼,(至少)日誌,你是趕上

    • 添加代碼來處理異常消息

    • 附加代碼來初始化連接工廠和連接對象

  • 就像我上面所說的,你可能需要某種設計......這樣你纔不會在「廚房水槽」類中得到所有東西。


如果我添加的主要方法,我應該簡單地調用receiveMessages()的主?

這是一種方法。但就像我說的,你真的需要設計你的應用程序。

然後運行後,聽衆會繼續運行嗎?

這是不完全清楚的。只要main線程處於活動狀態,它應該保持運行,但是當您的main方法返回時,會發生什麼情況不會立即發生。 (這取決於JMS線程是否創建爲守護進程線程,並且沒有指定。)

如果有消息,它會自動檢索onMessage方法嗎?

這樣看來,每個消息被檢索(從套接字讀取)就是您onMessage方法之前


而且,如果聽者不斷聽,是不是佔用CPU ???

如果正確實施,則不適用。

在線程的情況下,當我們創建一個線程&把它在睡眠時,CPU佔用率是零,怎麼能源部它監聽的情況下工作?

在一定的水平,偵聽器線程會讓系統調用等待數據對網絡套接字到達。我不知道它是如何完全實現的,但這個可能是就像在網絡套接字的InoutStream上調用read()一樣簡單。線程在等待阻塞系統調用時不使用CPU。

+0

如果我添加主要方法,我應該簡單地調用receiveMessages()主要?然後運行後,聽衆會繼續運行嗎?如果有消息,它會自動檢索onMessage方法嗎? – Mike 2012-01-08 00:31:29

0

此鏈接看起來像一個相當不錯的地方,使用Oracle AQ的示例。有一個示例部分,告訴您如何設置示例並運行它們。希望這可以幫助。

Link to Oracle Advanced Queueing