文章來源……IBM 中國
介紹
在這一節中,我們將查看兩個進行 JMS 客戶機消息接發的程序——Sender.java 和 Receiver.java。
Sender
:提示輸入 JNDI 名
所有示例程序都是命令行程序,它們用 System.in
進行輸入,用System.out
進行輸出。
Sender
類有兩個方法:main(String[])
和 send()
。main(String[])
方法只是舉例說明了 Sender
並調用了它的 send()
方法。 send()
方法的第一部分提示了將用來發送消息的受管理對象的 JNDI 名。
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Sender {
- public static void main(String[] args) {
- new Sender().send();
- }
- public void send() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- . . .
Sender
:查詢管理對象
send()
方法的下一部分用前面輸入的名字在 JNDI 中查詢受管理的對象。Sender
:創建 JMS 對象
通過舉例說明 InitialContext
對象訪問了 JNDI,通過調用 lookup(String)
方法並傳遞要獲取的對象的名字來檢索受管理的對象。注意, lookup(String)
方法返回 Object
,所以必須對返回的對象進行類型強制轉換(typecast)。
- . . .
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- . . .
現在,我們創建了發送消息所需要的 JMS 對象。注意,我們不用直接使用 new
舉例說明這些對象。所有對象都是通過調用另一個對象的方法創建的。
首先,用 ConnectionFactory
創建一個 Connection。然後我們用這個 Connection
創建一個 Session
。
Session
沒有被處理(false
) 並且它將使用自動確認(Session.AUTO_ACKNOWLEDGE
)。
最後,創建 Sender
,向從 JNDI 中檢索的 Destination
發送消息。
- . . .
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer sender = session.createProducer(destination);
- . . .
Sender
:發送消息
現在我們已經可以發送消息了。在這一部分,我們進入一個循環,它提示了要發送消息的文本。如果用戶輸入 quit,就可以從循環就退出。
否則要在輸入文本中建立一個 TextMessage
,用 MessageProducer
發送消息,然後返回到循環的開始部分。
- . . .
- //Send messages
- String messageText = null;
- while (true) {
- System.out.println("Enter message to send or 'quit':");
- messageText = reader.readLine();
- if ("quit".equals(messageText))
- break;
- TextMessage message = session.createTextMessage(messageText);
- sender.send(message);
- }
- . . .
Sender
:退出
退出循環後,關閉 Connection
。關閉Connection
會自動關閉 Session
和 MessageProducer
。
- . . .
- //Exit
- System.out.println("Exiting...");
- reader.close();
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
Receiver
:提示輸入 JNDI 的名稱並查找受管理的對象
Receiver
類與 Sender
類非常類似,都有一個 main(String[])
方法,它只是舉例說明了 Receiver
並調用它的主要方法 receive()
。
提示輸入 JNDI 的名稱並查找受管理對象的代碼與 Sender
中的代碼完全一樣。
不過,在這個類中有兩處不一樣的地方:
boolean stop
實例變量用來指出程序應該退出。Receiver
實現了MessageListener
接口,爲了異步接收消息。
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Receiver implements MessageListener {
- private boolean stop = false;
- public static void main(String[] args) {
- new Receiver().receive();
- }
- public void receive() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- reader.close();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- . . .
Receiver
:創建 JMS 對象
像在 Sender
中那樣創建Connection
和 Session
,然後創建一個 MessageConsumer
。
接着,調用 setMessageListener()
,傳遞 Receiver
——本地實例 this
,您會重調用它來實現 MessageListener
接口。
最後,啓動 Connection
,允許接收消息。
- . . .
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageConsumer receiver = session.createConsumer(queue);
- receiver.setMessageListener(this);
- connection.start();
- . . .
Receiver
:等待 stop
並退出
接着,程序進入一個循環,循環會在 stop
變量變爲 true 時退出。在循環中,線程睡眠一秒鐘。一旦退出循環, Connection
就會關閉,程序會終止。
- . . .
- //Wait for stop
- while (!stop) {
- Thread.sleep(1000);
- }
- //Exit
- System.out.println("Exiting...");
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- . . .
Receiver
:onMessage(Message)
方法
需要包含 Receiver
類的 onMessage(Message)
方法,因爲 Receiver
可以實現 MessageListener
接口。 收到消息時,就調用這個方法,並將 Message
作爲參數傳遞。
在我們的實現中,我們得到消息的文字內容並將它打印到 System.out
。然後檢查消息是否等於 stop,如果是,那麼就將 stop
變量設置爲 true
,這會使 receive()
方法中的循環終止。
- . . .
- public void onMessage(Message message) {
- try {
- String msgText = ((TextMessage) message).getText();
- System.out.println(msgText);
- if ("stop".equals(msgText))
- stop = true;
- } catch (JMSException e) {
- e.printStackTrace();
- stop = true;
- }
- }
- }
返回程序
如開始中所述,編譯 Sender
和 Receiver
程序需要 javax.naming
和 javax.jms
包。
在運行這個程序之前,需要使用 JMS 提供者提供的管理工具創建受管理對象 ConnectionFactory
和 Destination
,並將它們放到 JNDI 名字空間中。
還需要保證提供者的 JMS 實現類存在於 classpath 中。
然後,可以同時運行這兩個程序,爲 ConnectionFactory
和 Destination
提供同樣的 JNDI 名稱,並從 Sender
向 Receiver
發送消息。
最後附上Sender.java 和 Receiver.java
Sender.java
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Sender {
- public static void main(String[] args) {
- new Sender().send();
- }
- public void send() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer sender = session.createProducer(queue);
- //Send messages
- String messageText = null;
- while (true) {
- System.out.println("Enter message to send or 'quit':");
- messageText = reader.readLine();
- if ("quit".equals(messageText))
- break;
- TextMessage message = session.createTextMessage(messageText);
- sender.send(message);
- }
- //Exit
- System.out.println("Exiting...");
- reader.close();
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- }
Receiver.java
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class Receiver implements MessageListener {
- private boolean stop = false;
- public static void main(String[] args) {
- new Receiver().receive();
- }
- public void receive() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter ConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Destination name:");
- String destinationName = reader.readLine();
- reader.close();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- ConnectionFactory factory =
- (ConnectionFactory) initContext.lookup(factoryName);
- Destination destination = (Destination) initContext.lookup(destinationName);
- initContext.close();
- //Create JMS objects
- Connection connection = factory.createConnection();
- Session session =
- connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageConsumer receiver = session.createConsumer(queue);
- receiver.setMessageListener(this);
- connection.start();
- //Wait for stop
- while (!stop) {
- Thread.sleep(1000);
- }
- //Exit
- System.out.println("Exiting...");
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public void onMessage(Message message) {
- try {
- String msgText = ((TextMessage) message).getText();
- System.out.println(msgText);
- if ("stop".equals(msgText))
- stop = true;
- } catch (JMSException e) {
- e.printStackTrace();
- stop = true;
- }
- }
- }
----------==========================__END__============================================------------------