wayne

          JMS (1)

          開發任何JMS應用之前,首先要做的事是在應用服務器中配置JMS被管對象:連接工廠和目的地。它們最好不要以編程的方式實現,因為其背后的技術有多種不同的API實現,可能無法移植。以下是glassfish中的配置:
          在配置--java消息服務里創建兩個物理目的地
           名稱:myQueue
           類型:javax.jms.Queue
           名稱:myTopic
           類型:javax.jms.Topic
          在資源--jms資源里創建連接工廠
           JNIDI名:jms/ConnectionFactory
           資源類型:javax.jms.ConnectionFactory
          在資源--jms資源里創建兩個目的地資源
           JNIDI名:jms/Queue
           資源類型:javax.jms.Queue
           JNIDI名:jms/Topic
           資源類型:javax.jms.Topic

          這一次創建一個最簡單的同步隊列消息應用,創建一個EJB模塊,我們先創建發送消息的會話bean,首先定義遠程接口:

          @Remote
          public interface JMSSendRemote {

              
          void sendMessage(Object messageData);
              
          }

          遠程接口向遠程客戶端公開了一個發送消息的方法,然后是一個無狀態會話bean實現遠程接口:
           1@Stateless
           2public class JMSSendBean implements JMSSendRemote {
           3    @Resource(name = "jms/Queue")
           4    private Queue queue;
           5    @Resource(name = "jms/ConnectionFactory")
           6    private ConnectionFactory connectionFactory;
           7
           8    private Message createJMSMessageForjmsQueue(Session session, Object messageData) throws JMSException {
           9        TextMessage message = session.createTextMessage();
          10        message.setText(messageData.toString());
          11        return message;
          12    }

          13
          14    private void sendJMSMessageToQueue(Object messageData) throws JMSException {
          15        Connection connection = null;
          16        Session session = null;
          17        try {
          18            connection = connectionFactory.createConnection();
          19            session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
          20            MessageProducer messageProducer = session.createProducer(queue);
          21            messageProducer.send(createJMSMessageForjmsQueue(session, messageData));
          22        }
           finally {
          23            if (session != null{
          24                session.close();
          25            }

          26            if (connection != null{
          27                connection.close();
          28            }

          29        }

          30    }

          31
          32    public void sendMessage(Object messageData) {
          33        try {
          34            sendJMSMessageToQueue(messageData);
          35        }
           catch (JMSException ex) {
          36            Logger.getLogger(JMSSendBean.class.getName()).log(Level.SEVERE, null, ex);
          37        }

          38    }

          39 
          40}

          前6行聲明了連接工廠和隊列,并將被管對象注入其中。SessionFactory用來在消息客戶端和消息服務器之間創建一個連接;Queue是一個目的地,另一個是Topic,都是Destination(目的地)的子類,消息生成者將消息發送到目的地而消息使用者在目的地上獲取消息。15-16行聲明了Connection和Session兩個對象,Connection在消息客戶端和消息服務器相關端口上建立TCP/IP套接字,用來創建一個或多個Session;Session是一個單線程的上下文,用來生成和使用消息。18行創建一個Connection對象,19行創建一個一個Session對象,第一個參數表明Session未被事務化,第二個參數表明會話能夠在成功接收到消息時自動進行確認。MessageProducer是消息生成者,需要指定一個目的地。9行的TextMessage代表消息本身,Message有6個子類,TextMessage只是其中一種。10行設置了消息的正文,21行消息生成者將消息發送到目的地,最后在23-28行將Connection關閉,關閉連接會自動關閉會話和消息生成者,至此整個發送流程結束。

          接下來創建接收消息的會話bean,還是先創建遠程接口:
          @Remote
          public interface JMSReceiveRemote {

              String receiveMessage();
              
          }

          向遠程客戶端公開了一個接收方法,我們看會話bean如何實現:
           1@Stateless
           2public class JMSReceiveBean implements JMSReceiveRemote {
           3    @Resource(name = "jms/Queue")
           4    private Queue queue;
           5    @Resource(name = "jms/ConnectionFactory")
           6    private ConnectionFactory queueFactory;
           7
           8    private String receiveJMSMessageFromQueue() throws JMSException {
           9        Connection connection = null;
          10        Session session = null;
          11        try {
          12            connection = queueFactory.createConnection();
          13            session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
          14            MessageConsumer consumer = session.createConsumer(queue);
          15            connection.start();
          16            TextMessage msg = (TextMessage)consumer.receive();
          17            return msg.getText();
          18        }
           finally {
          19            if (session != null{
          20                session.close();
          21            }

          22            if (connection != null{
          23                connection.close();
          24            }

          25        }

          26    }

          27
          28    public String receiveMessage() {
          29        try {
          30            return receiveJMSMessageFromQueue();
          31        }
           catch (JMSException ex) {
          32            Logger.getLogger(JMSReceiveBean.class.getName()).log(Level.SEVERE, null, ex);
          33        }

          34        return null;
          35    }
              
          36    
          37}

          很多重復的地方不解釋了,14行創建了一個MessageConsumer對象,代表一個消息使用者。在接收消息前始終要打開一個連接,15行正是這個意思。16行consumer.receive()方法從目的地接收消息,receive方法用于執行一個同步接收過程,若不指定參數或參數為0,則在某個消息到來之前方法會一直阻塞,大于0的值代表設定阻塞時長毫秒數。17行從消息中獲取正文,19-23行關閉連接,關閉Connection對象將自動關閉會話和消息使用者,至此整個接收流程結束,打包部署EJB模塊。

          最后創建遠程客戶端來進行測試:
          <%
                      InitialContext ctx 
          = new InitialContext();
                      JMSSendRemote sendBean 
          = (JMSSendRemote)ctx.lookup(JMSSendRemote.class.getName());
                      sendBean.sendMessage(
          "Hi Tom");
                      out.println(
          "JMS消息發送成功");
          %>

          <%
                      InitialContext ctx 
          = new InitialContext();
                      JMSReceiveRemote receiveBean 
          = (JMSReceiveRemote)ctx.lookup(JMSReceiveRemote.class.getName());
                      String msg 
          = receiveBean.receiveMessage();
                      
          if(msg != null){
                          out.println(msg);
                      }
          else{
                          out.println(
          "JMS消息沒找到");
                      }

          %>

          posted on 2008-09-14 05:31 waynemao 閱讀(315) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          default

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阳山县| 大关县| 长兴县| 璧山县| 汝阳县| 涿州市| 奉化市| 宁乡县| 张掖市| 昔阳县| 绥芬河市| 涞源县| 喀喇沁旗| 临高县| 岳池县| 中牟县| 汝阳县| 龙海市| 柏乡县| 长汀县| 辽阳市| 平塘县| 紫金县| 翁牛特旗| 深州市| 镇赉县| 巴塘县| 韶山市| 拉萨市| 济南市| 同德县| 萍乡市| 梁平县| 甘德县| 沈阳市| 农安县| 昭觉县| 贵定县| 六枝特区| 固原市| 墨竹工卡县|