隨筆 - 37  文章 - 29  trackbacks - 0


          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          最新評論

          閱讀排行榜

          評論排行榜

          如前所述,JMS分兩大類:PTP和Pub/Sub

          主要的幾個對象:ConnectionFactory、Connection、Destination、Session、MessageProducer、MessageConsumer
          其相互關系如下圖:

          1.PTP:
          簡單回顧7個對象:QueueConnectionFactory、QuequeConnection、Queue、QueueSession、QueueSender、QueueReceiver、QueueBrowser
              1) Sender
              try {
                  //具體怎么得到就不寫了,各個系統肯定都不一樣,但終究都是通過jdni來獲得
                  Context jndiContext = new InitialContext();
                  QueueConnectionFactory factory = jndiContext.lookup("**Factory");
                  Queue queue = jndiContext.lookup("**Queue");
                  QueueConnection connection = factory.createQueueConnection();
                  boolean transaction = true;
                  QueueSession session = connection.createQueueSession(transaction , Session.AUTO_ACKNOWLEDGE);
                  Message objMessage = session.createObjectMessage();  //或session.createTextMessage("...");
                  objMessage.setObject((Serializable)obj); //obj為要傳輸的對象
                  QueueSender sender = session.createSender(queue);
                  publisher.setTimeToLive(timeout); //long timeout = ...
                  connection.start();
                  sender.send(objMessage);
                  //or
                  /**
                  sender = session.createSender(null);
                  sender.send(queue, message);
                  */
                  //如果不用了,就收拾干凈
                  publisher.close();
                  session.close();
                  connection.close();
              } catch (JMSException e) {
                  //TODO
              } finally {
                  publisher = null;
                  session = null;
                  connection = null;
              }

              2) Receiver/Browser
                  a.主動接收,synchronously
                  try {
                      QueueReceiver receiver = session.createReceiver(queue);
                      receiver.receiveNoWait();
                      /**
                      QueueBrowser browser = session.createBrowser(queue); //QueueBrowser只會取消息,但不會取走消息
                      Enumeration elements = browser.getEnumeration();
                      while(elements.hasMoreElements) {
                          Message message = elements.nextElement();
                          ...
                      }
                      */
                  } catch (JMSException e) {
                      ...
                  }

                  b.消息偵聽,也是最主要的應用,asynchronously
                  try {
                      MessageListener myListener = new MyListener();
                      QueueReceiver receiver = session.createReceiver(queue);
                      receiver.setMessageListener(myListener);
                      connection.start();
                  } catch (JMSException e) {
                      ...    
                  }

                  public class MyListener impelments MessageListner {
                      public void onMessage(Message message) {
                          if(message instanceof TextMessage) {
                              ...
                          } else if (message instanceof ObjectMessage) {
                              ...
                          } else {
                              ...
                          }    
                      }
                  }


          2.Pub/Sub:
          簡單回顧6個對象:TopicConnectionFactory、TopicConnection、Topic、TopicSession、TopicPublisher、TopicSubscriber
              1) Publisher
              try {
                  //具體怎么得到就不寫了,各個系統肯定都不一樣,但終究都是通過jdni來獲得
                  Context jndiContext = new InitialContext();
                  TopicConnectionFactory factory = jndiContext.lookup("**Factory");
                  Topic topic = jndiContext.lookup("**Topic");
                  TopicConnection connection = factory.createTopicConnection();
                  TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);  //false表示不使用事務
                  Message objMessage = session.createObjectMessage();
                  objMessage.setObject((Serializable)obj); //obj為要傳輸的對象
                  TopicPublisher publisher = session.createPublisher(topic);
                  publisher.setTimeToLive(100000);
                  connection.start();
                  publisher.publish(message);
                  //or
                  /**
                  publisher = session.createPublisher(null);
                  publiser.publish(topic, message);
                  */
                  publisher.close();
                  session.close();
                  connection.close();
              } catch (JMSException e) {
                  //TODO
              }


              2) Subscriber
                  a.主動接收,比如上面發送完后,接收回應消息,相當于同步接收了
                  try {
                      TopicSubscriber subscriber = session.createSubScriber(topic);
                      message = subscriber.receiver(timeout); //long timeout = ...
                      subscriber.close();
                  } catch (JMSException e) {
                      ...    
                  }


                  b.消息偵聽,asynchronously
                  try {
                      ...
                      TopicSubscriber subscriber = session.createSubScriber(topic);
                      MessageListener listener = new MyListener();
                      subscriber.setMessageListener(listener); //關鍵在于這個listener
                      connection.start();
                  } catch (JMSException e) {
                      ...
                  }

                  MyListener實現同上


          posted on 2008-08-03 18:04 EvanLiu 閱讀(934) 評論(0)  編輯  收藏 所屬分類: Java基礎
          主站蜘蛛池模板: 萍乡市| 永嘉县| 和林格尔县| 民丰县| 若尔盖县| 安福县| 秭归县| 桂林市| 云阳县| 凤庆县| 敦煌市| 宁南县| 钟祥市| 阿拉善右旗| 淄博市| 青浦区| 托克托县| 晋宁县| 云安县| 金平| 平果县| 乌拉特前旗| 湾仔区| 永春县| 孝义市| 宁德市| 伊春市| 兴业县| 六盘水市| 历史| 阳谷县| 安龙县| 蒲城县| 子洲县| 彰化市| 萨迦县| 中江县| 紫金县| 阿拉善左旗| 平潭县| 张家口市|