用共用接口進行客戶機編程

文章來源……IBM 中國

介紹

在這一節中,我們將查看兩個進行 JMS 客戶機消息接發的程序——Sender.java 和 Receiver.java。

Sender:提示輸入 JNDI 名

所有示例程序都是命令行程序,它們用 System.in 進行輸入,用System.out 進行輸出。

Sender 類有兩個方法:main(String[])send()main(String[]) 方法只是舉例說明了 Sender 並調用了它的 send() 方法。 send() 方法的第一部分提示了將用來發送消息的受管理對象的 JNDI 名。

  1. import java.io.*;   
  2. import javax.jms.*;   
  3. import javax.naming.*;   
  4.   
  5. public class Sender {   
  6.   
  7.     public static void main(String[] args) {   
  8.   
  9.         new Sender().send();   
  10.     }   
  11.   
  12.     public void send() {   
  13.   
  14.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
  15.   
  16.         try {   
  17.             //Prompt for JNDI names   
  18.             System.out.println("Enter ConnectionFactory name:");   
  19.             String factoryName = reader.readLine();   
  20.             System.out.println("Enter Destination name:");   
  21.             String destinationName = reader.readLine();   
  22.     . . .   

Sender:查詢管理對象

send() 方法的下一部分用前面輸入的名字在 JNDI 中查詢受管理的對象。Sender:創建 JMS 對象

通過舉例說明 InitialContext 對象訪問了 JNDI,通過調用 lookup(String) 方法並傳遞要獲取的對象的名字來檢索受管理的對象。注意, lookup(String) 方法返回 Object,所以必須對返回的對象進行類型強制轉換(typecast)。

java 代碼
  1. . . .   
  2.         //Look up administered objects   
  3.         InitialContext initContext = new InitialContext();   
  4.         ConnectionFactory factory =   
  5.             (ConnectionFactory) initContext.lookup(factoryName);   
  6.         Destination destination = (Destination) initContext.lookup(destinationName);   
  7.         initContext.close();   
  8.         . . .   

 

現在,我們創建了發送消息所需要的 JMS 對象。注意,我們不用直接使用 new 舉例說明這些對象。所有對象都是通過調用另一個對象的方法創建的。

首先,用 ConnectionFactory 創建一個 Connection。然後我們用這個 Connection 創建一個 Session

Session 沒有被處理(false) 並且它將使用自動確認(Session.AUTO_ACKNOWLEDGE)。

最後,創建 Sender ,向從 JNDI 中檢索的 Destination 發送消息。

java 代碼
  1. . . .   
  2.         //Create JMS objects   
  3.         Connection connection = factory.createConnection();   
  4.         Session session =   
  5.             connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
  6.         MessageProducer sender = session.createProducer(destination);   
  7.         . . .   

Sender:發送消息

 

現在我們已經可以發送消息了。在這一部分,我們進入一個循環,它提示了要發送消息的文本。如果用戶輸入 quit,就可以從循環就退出。

否則要在輸入文本中建立一個 TextMessage ,用 MessageProducer 發送消息,然後返回到循環的開始部分。

java 代碼
  1. . . .   
  2.         //Send messages   
  3.         String messageText = null;   
  4.         while (true) {   
  5.             System.out.println("Enter message to send or 'quit':");   
  6.             messageText = reader.readLine();   
  7.             if ("quit".equals(messageText))   
  8.                 break;   
  9.             TextMessage message = session.createTextMessage(messageText);   
  10.             sender.send(message);   
  11.         }   
  12.         . . .   

Sender:退出

退出循環後,關閉 Connection。關閉Connection 會自動關閉 SessionMessageProducer

java 代碼
  1. . . .   
  2.         //Exit   
  3.         System.out.println("Exiting...");   
  4.         reader.close();   
  5.         connection.close();   
  6.         System.out.println("Goodbye!");   
  7.   
  8.     } catch (Exception e) {   
  9.         e.printStackTrace();   
  10.         System.exit(1);   
  11.     }   
  12. }   

Receiver:提示輸入 JNDI 的名稱並查找受管理的對象

Receiver 類與 Sender 類非常類似,都有一個 main(String[]) 方法,它只是舉例說明了 Receiver 並調用它的主要方法 receive()

提示輸入 JNDI 的名稱並查找受管理對象的代碼與 Sender 中的代碼完全一樣。

不過,在這個類中有兩處不一樣的地方:

  • boolean stop 實例變量用來指出程序應該退出。
  • Receiver 實現了 MessageListener 接口,爲了異步接收消息。
java 代碼
  1. import java.io.*;   
  2. import javax.jms.*;   
  3. import javax.naming.*;   
  4.   
  5. public class Receiver implements MessageListener {   
  6.   
  7.     private boolean stop = false;   
  8.   
  9.     public static void main(String[] args) {   
  10.   
  11.         new Receiver().receive();   
  12.     }   
  13.   
  14.     public void receive() {   
  15.   
  16.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
  17.   
  18.         try {   
  19.             //Prompt for JNDI names   
  20.             System.out.println("Enter ConnectionFactory name:");   
  21.             String factoryName = reader.readLine();   
  22.             System.out.println("Enter Destination name:");   
  23.             String destinationName = reader.readLine();   
  24.             reader.close();   
  25.   
  26.             //Look up administered objects   
  27.             InitialContext initContext = new InitialContext();   
  28.             ConnectionFactory factory =   
  29.                 (ConnectionFactory) initContext.lookup(factoryName);   
  30.             Destination destination = (Destination) initContext.lookup(destinationName);   
  31.             initContext.close();   
  32.             . . .   
  33.   

Receiver:創建 JMS 對象

像在 Sender 中那樣創建ConnectionSession,然後創建一個 MessageConsumer

接着,調用 setMessageListener(),傳遞 Receiver ——本地實例 this,您會重調用它來實現 MessageListener 接口。

最後,啓動 Connection,允許接收消息。

java 代碼
  1. . . .   
  2.         //Create JMS objects   
  3.         Connection connection = factory.createConnection();   
  4.         Session session =   
  5.             connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
  6.         MessageConsumer receiver = session.createConsumer(queue);   
  7.         receiver.setMessageListener(this);   
  8.         connection.start();   
  9.         . . .   

Receiver:等待 stop 並退出

接着,程序進入一個循環,循環會在 stop 變量變爲 true 時退出。在循環中,線程睡眠一秒鐘。一旦退出循環, Connection 就會關閉,程序會終止。

java 代碼
  1. . . .   
  2.         //Wait for stop   
  3.         while (!stop) {   
  4.             Thread.sleep(1000);   
  5.         }   
  6.   
  7.         //Exit   
  8.         System.out.println("Exiting...");   
  9.         connection.close();   
  10.         System.out.println("Goodbye!");   
  11.   
  12.     } catch (Exception e) {   
  13.         e.printStackTrace();   
  14.         System.exit(1);   
  15.     }   
  16. }   
  17. . . .   

ReceiveronMessage(Message) 方法

需要包含 Receiver 類的 onMessage(Message) 方法,因爲 Receiver 可以實現 MessageListener 接口。 收到消息時,就調用這個方法,並將 Message 作爲參數傳遞。

在我們的實現中,我們得到消息的文字內容並將它打印到 System.out。然後檢查消息是否等於 stop,如果是,那麼就將 stop 變量設置爲 true,這會使 receive() 方法中的循環終止。

java 代碼
  1.     . . .   
  2.     public void onMessage(Message message) {   
  3.   
  4.         try {   
  5.             String msgText = ((TextMessage) message).getText();   
  6.             System.out.println(msgText);   
  7.             if ("stop".equals(msgText))   
  8.                 stop = true;   
  9.         } catch (JMSException e) {   
  10.             e.printStackTrace();   
  11.             stop = true;   
  12.         }   
  13.     }   
  14. }   

返回程序

如開始中所述,編譯 SenderReceiver 程序需要 javax.namingjavax.jms 包。

在運行這個程序之前,需要使用 JMS 提供者提供的管理工具創建受管理對象 ConnectionFactoryDestination ,並將它們放到 JNDI 名字空間中。

還需要保證提供者的 JMS 實現類存在於 classpath 中。

然後,可以同時運行這兩個程序,爲 ConnectionFactoryDestination 提供同樣的 JNDI 名稱,並從 SenderReceiver 發送消息。

最後附上Sender.java 和 Receiver.java

Sender.java

java 代碼
  1. import java.io.*;   
  2. import javax.jms.*;   
  3. import javax.naming.*;   
  4.   
  5. public class Sender {   
  6.   
  7.     public static void main(String[] args) {   
  8.   
  9.         new Sender().send();   
  10.     }   
  11.   
  12.     public void send() {   
  13.   
  14.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
  15.   
  16.         try {   
  17.             //Prompt for JNDI names   
  18.             System.out.println("Enter ConnectionFactory name:");   
  19.             String factoryName = reader.readLine();   
  20.             System.out.println("Enter Destination name:");   
  21.             String destinationName = reader.readLine();   
  22.   
  23.             //Look up administered objects   
  24.             InitialContext initContext = new InitialContext();   
  25.             ConnectionFactory factory =   
  26.                 (ConnectionFactory) initContext.lookup(factoryName);   
  27.             Destination destination = (Destination) initContext.lookup(destinationName);   
  28.             initContext.close();   
  29.   
  30.             //Create JMS objects   
  31.             Connection connection = factory.createConnection();   
  32.             Session session =   
  33.                 connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
  34.             MessageProducer sender = session.createProducer(queue);   
  35.   
  36.             //Send messages   
  37.             String messageText = null;   
  38.             while (true) {   
  39.                 System.out.println("Enter message to send or 'quit':");   
  40.                 messageText = reader.readLine();   
  41.                 if ("quit".equals(messageText))   
  42.                     break;   
  43.                 TextMessage message = session.createTextMessage(messageText);   
  44.                 sender.send(message);   
  45.             }   
  46.   
  47.             //Exit   
  48.             System.out.println("Exiting...");   
  49.             reader.close();   
  50.             connection.close();   
  51.             System.out.println("Goodbye!");   
  52.   
  53.         } catch (Exception e) {   
  54.             e.printStackTrace();   
  55.             System.exit(1);   
  56.         }   
  57.     }   
  58. }  

Receiver.java

java 代碼
  1. import java.io.*;   
  2. import javax.jms.*;   
  3. import javax.naming.*;   
  4.   
  5. public class Receiver implements MessageListener {   
  6.   
  7.     private boolean stop = false;   
  8.   
  9.     public static void main(String[] args) {   
  10.   
  11.         new Receiver().receive();   
  12.     }   
  13.   
  14.     public void receive() {   
  15.   
  16.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
  17.   
  18.         try {   
  19.             //Prompt for JNDI names   
  20.             System.out.println("Enter ConnectionFactory name:");   
  21.             String factoryName = reader.readLine();   
  22.             System.out.println("Enter Destination name:");   
  23.             String destinationName = reader.readLine();   
  24.             reader.close();   
  25.   
  26.             //Look up administered objects   
  27.             InitialContext initContext = new InitialContext();   
  28.             ConnectionFactory factory =   
  29.                 (ConnectionFactory) initContext.lookup(factoryName);   
  30.             Destination destination = (Destination) initContext.lookup(destinationName);   
  31.             initContext.close();   
  32.   
  33.             //Create JMS objects   
  34.             Connection connection = factory.createConnection();   
  35.             Session session =   
  36.                 connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
  37.             MessageConsumer receiver = session.createConsumer(queue);   
  38.             receiver.setMessageListener(this);   
  39.             connection.start();   
  40.   
  41.             //Wait for stop   
  42.             while (!stop) {   
  43.                 Thread.sleep(1000);   
  44.             }   
  45.   
  46.             //Exit   
  47.             System.out.println("Exiting...");   
  48.             connection.close();   
  49.             System.out.println("Goodbye!");   
  50.   
  51.         } catch (Exception e) {   
  52.             e.printStackTrace();   
  53.             System.exit(1);   
  54.         }   
  55.     }   
  56.   
  57.     public void onMessage(Message message) {   
  58.   
  59.         try {   
  60.             String msgText = ((TextMessage) message).getText();   
  61.             System.out.println(msgText);   
  62.             if ("stop".equals(msgText))   
  63.                 stop = true;   
  64.         } catch (JMSException e) {   
  65.             e.printStackTrace();   
  66.             stop = true;   
  67.         }   
  68.     }   
  69. }   
  70.   

 

----------==========================__END__============================================------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章