国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java消息服務(wù)JMS詳解

開發(fā) 后端
本文向您介紹Java中的消息服務(wù)JMS,Java消息服務(wù)提供了點(diǎn)對點(diǎn)模式和發(fā)布-訂閱模式,文中將詳細(xì)介紹這兩種服務(wù)。

Java消息服務(wù)(JMS Java Message Services)提供了點(diǎn)對點(diǎn)模式(Point-to-Point Queue)和發(fā)布-訂閱模式(Publish-Subscribe Topics).

Queue僅允許一個(gè)消息傳送給一個(gè)客戶(一對一):

Java消息服務(wù)JMS的接收者和發(fā)送者之間不存在時(shí)間上的依賴關(guān)系。不論發(fā)送者發(fā)送消息時(shí)接收者是否在運(yùn)行,接收者都可以提取信息。接收者對于成功處理的消息給出回執(zhí)。

Topics可以有多個(gè)客戶端(一對多,多對多):

向某個(gè)話題訂閱的客戶程序只能收到那些在它訂閱之后發(fā)布的消息。為了接收到消息,訂閱者必須保持活動(dòng)狀態(tài)。因此,發(fā)布者和訂閱者之間存在時(shí)間上的依賴關(guān)系。

點(diǎn)對點(diǎn)消息模式通過一個(gè)消息隊(duì)列(Queue)實(shí)現(xiàn),消息的生產(chǎn)者向隊(duì)列寫入消息,消息的訂閱者從隊(duì)列提取消息。發(fā)布-訂閱消息模式通過一個(gè)話題(Topic)節(jié)點(diǎn)構(gòu)成的層次結(jié)構(gòu)實(shí)現(xiàn),消息的生產(chǎn)者向這個(gè)層次結(jié)構(gòu)發(fā)布消息,消息的訂閱者向這個(gè)結(jié)構(gòu)訂閱消息。

消息驅(qū)動(dòng)的Bean只有一個(gè)Bean類。從某些方面看,JMS消息驅(qū)動(dòng)的Bean類似于無狀態(tài)會(huì)話Bean:消息驅(qū)動(dòng)的Bean不為特定的客戶保留數(shù)據(jù)或?qū)υ挔顟B(tài)。

  1. @MessageDriven(activationConfig={  
  2.    @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),  
  3.    @ActivationConfigProperty(propertyName="destination",propertyValue="queue/jms")  
  4. }) 

@MessageDriven注釋指明這是一個(gè)消息驅(qū)動(dòng)Bean,并使用@ActivationConfigProperty注釋配置消息的各種屬性,其 中destinationType屬性指定消息的類型,消息有兩種類型topics 和queues,下面是這兩種消息類型的介紹:

Topics 可以有多個(gè)客戶端。用topic發(fā)布允許一對多,或多對多通訊通道。消息的產(chǎn)生者被叫做publisher, Java消息服務(wù)接受者叫做subscriber。destinationType屬性對應(yīng)值:javax.jms.Topic

Queue 僅僅允許一個(gè)消息傳送給一個(gè)客戶。一個(gè)發(fā)送者將消息放入消息隊(duì)列,接受者從隊(duì)列中抽取并得到消息,消息就會(huì)在隊(duì)列中消失。第一個(gè)接受者抽取并得到消息后,其他人就不能再得到它。destinationType屬性對應(yīng)值:javax.jms.Queue destination屬性用作指定消息路徑,消息驅(qū)動(dòng)Bean在發(fā)布時(shí),如果路徑不存在,容器會(huì)自動(dòng)創(chuàng)建該路徑,當(dāng)容器關(guān)閉時(shí)該路徑會(huì)自動(dòng)被刪除

當(dāng)一個(gè)消息到達(dá)queue/jms隊(duì)列時(shí),就會(huì)觸發(fā)onMessage方法,消息作為一個(gè)參數(shù)傳入.

  1. package com.julycn.jms;  
  2.  
  3. import javax.ejb.ActivationConfigProperty;  
  4. import javax.ejb.MessageDriven;  
  5. import javax.jms.JMSException;  
  6. import javax.jms.Message;  
  7. import javax.jms.MessageListener;  
  8. import javax.jms.TextMessage;  
  9.  
  10. @MessageDriven(activationConfig = {  
  11.         @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),  
  12.         @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/jms") })  
  13. public class MessageQueue implements MessageListener {  
  14.  
  15.     public MessageQueue() {  
  16.  
  17.     }  
  18.  
  19.     public void onMessage(Message message) {  
  20.         TextMessage tmsg = (TextMessage) message;  
  21.         try {  
  22.             System.out.println(tmsg.getText());  
  23.         } catch (JMSException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.  
  1. package com.julycn.client;  
  2.  
  3. import javax.jms.JMSException;  
  4. import javax.jms.Queue;  
  5. import javax.jms.QueueConnection;  
  6. import javax.jms.QueueConnectionFactory;  
  7. import javax.jms.QueueSender;  
  8. import javax.jms.QueueSession;  
  9. import javax.jms.TextMessage;  
  10. import javax.naming.InitialContext;  
  11. import javax.naming.NamingException;  
  12.  
  13. public class MessageQueueClient {  
  14.  
  15.     public static void main(String[] args) {  
  16.         QueueConnection conn;  
  17.         QueueSession session;  
  18.         Queue queue;  
  19.         QueueSender sender;  
  20.         TextMessage msg;  
  21.  
  22.         try {  
  23.             InitialContext ctx = new InitialContext();  
  24.             QueueConnectionFactory qcf = (QueueConnectionFactory) ctx  
  25.                     .lookup("ConnectionFactory");  
  26.             conn = qcf.createQueueConnection();  
  27.             session = conn.createQueueSession(false,  
  28.                     QueueSession.AUTO_ACKNOWLEDGE);  
  29.             queue = (Queue) ctx.lookup("queue/jms");  
  30.             msg = session.createTextMessage("你好,好久不見!");  
  31.             sender = session.createSender(queue);  
  32.             sender.send(msg);  
  33.             sender.close();  
  34.         } catch (NamingException e) {  
  35.             e.printStackTrace();  
  36.         } catch (JMSException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.  
  40.     }  
  41.  

(1) 得到一個(gè)JNDI初始化上下文(Context);

例子對應(yīng)代碼:

Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);

注意:可以寫在代碼中,也可以寫在jndi.properties文件中.

(2) 根據(jù)上下文來查找一個(gè)連接工廠TopicConnectFactory/ QueueConnectionFactory (有兩種連接工廠,根據(jù)是topic/queue來使用相應(yīng)的類型);

例子對應(yīng)代碼:

QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.lookup("ConnectionFactory");

(3) 從連接工廠得到一個(gè)連接(Connect 有兩種[TopicConnection/ QueueConnection]);

例子對應(yīng)代碼:conn = qcf.createQueueConnection();

(4) 通過連接來建立一個(gè)會(huì)話(Session);

例子對應(yīng)代碼:session= conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);

這句代碼意思是:建立不需要事務(wù)的并且能自動(dòng)接收J(rèn)ava消息服務(wù)收條的會(huì)話,在非事務(wù)Session 中,JMS消息傳遞的方式有三種:
Session.AUTO_ACKNOWLEDGE :當(dāng)客戶機(jī)調(diào)用的receive方法成功返回,或當(dāng)MessageListenser 成功處理了消息,session將會(huì)自動(dòng)接收消息的收條。

Session.CLIENT_ACKNOWLEDGE :客戶機(jī)通過調(diào)用消息的acknowledge方法來接收消息。接收發(fā)生在session層。接收到一個(gè)被消費(fèi)的消息時(shí),將自動(dòng)接收該session已經(jīng) 消費(fèi)的所有消息。例如:如果消息的消費(fèi)者消費(fèi)了10條消息,然后接收15 個(gè)被傳遞的消息,則前面的10 個(gè)消息的收據(jù)都會(huì)在這15 個(gè)消息中被接收。

Session.DUPS_ACKNOWLEDGE :指示session緩慢接收消息。

(5) 查找目的地(Topic/ Queue);

例子對應(yīng)代碼:queue =(Queue) ctx.lookup("queue/jms");

(6) 根據(jù)會(huì)話以及目的地來建立消息制造者(TopicPublisher/QueueSender)和消費(fèi)者(TopicSubscriber/QueueReceiver).
例子對應(yīng)代碼:

         msg = session.createTextMessage("你好,好久不見!");
         sender = session.createSender(queue);
         sender.send(msg);

備注:如果運(yùn)行時(shí)出現(xiàn)javax.naming.NameNotFoundException: jms not bound , 是因?yàn)镴Boss不會(huì)自已建立一個(gè)Queue對象,因此,需要手工來配置Queue對象。可以<JBoss5.x安裝目錄>\server\default\deploy目錄中建立一個(gè)xxx-service.xml文件,其中xxx可以任意取值,但必須跟“-service”后綴,例如,abc-service.xml。該文件可以放在deploy或其子目錄(可以是多層子目錄)中。該文件的內(nèi)容如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <server> 
  3.     <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=jms"> 
  4.         <depends optional-attribute-name="DestinationManager"> 
  5.             jboss.mq:service=DestinationManager</depends> 
  6.     </mbean> 
  7. </server> 

<mbean>元素的name屬性值中的name必須是jms,要與queue/jms中的/后面的部分一致.

 

【編輯推薦】

  1. 成為Java高手需要注意的25個(gè)學(xué)習(xí)目標(biāo)
  2. Java理論和實(shí)踐: 理解JTS
  3. Java內(nèi)存模型詳解
  4. Java與.NET的WebServices相互調(diào)用
  5. 用純Java代碼調(diào)用JavaFX的功能
責(zé)任編輯:佚名 來源: JavaEye
相關(guān)推薦

2009-06-17 16:56:46

Spring JMS

2009-06-17 16:39:03

Spring JMS

2020-11-05 10:40:18

ActiveMQ

2009-06-12 17:45:16

JMS集群JBoss集群

2017-02-28 08:57:41

JavaJMS隊(duì)列

2018-03-29 08:38:10

2013-01-05 09:58:35

JavaEEJavaEE7JMS 2.0

2009-11-23 20:29:20

ibmdwWeb

2009-04-13 11:37:12

IBMdWSOAP

2010-04-13 17:00:43

Unix消息隊(duì)列

2012-05-25 15:35:43

JMSJava

2009-06-16 13:25:02

JBoss和JMS

2022-06-02 08:21:07

RocketMQ消息中間件

2024-07-11 11:17:00

消息隊(duì)列Java

2023-05-08 08:09:26

路由元信息謂詞

2011-08-18 10:59:57

iPhone開發(fā)消息通信NSNotificat

2022-08-09 08:31:29

RocketMQ消息中間件

2010-07-17 01:20:00

Telnet服務(wù)

2022-10-08 07:31:26

微服務(wù)編排體系

2019-02-19 15:20:12

消息總線架構(gòu)異步
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91精品论坛| 999国产视频| 成人免费毛片app| 国产黄色在线免费观看| 久久精品日产第一区二区三区精品版 | 一区在线播放视频| 久9re热视频这里只有精品| 国产色视频在线播放| 欧洲成人免费视频| 婷婷综合在线观看| 亚洲一区二区三区无吗| 成人免费一区二区三区视频网站| 国产伦精品一区二区三区视频孕妇| 欧美精品在线视频| 久久电影网站中文字幕| www.成人在线视频| 日日干夜夜操s8| 国产又爽又黄的激情精品视频 | www.成人.com| 热re99久久精品国99热蜜月| 亚洲国产91色在线| 国产在线播精品第三| 久久久国产精品网站| 男女av免费观看| 日韩av免费一区| 欧美综合天天夜夜久久| 日本aⅴ亚洲精品中文乱码| 电影一区二区| 全部a∨一极品视觉盛宴| 国产精品久久久久久久久婷婷| 欧美精品一区二区久久婷婷| 97aⅴ精品视频一二三区| 蜜桃一区二区三区| 91在线看黄| www.av蜜桃| 日韩美女视频免费看| 欧美私人免费视频| 国产精品系列在线观看| 国产精品chinese在线观看| 日韩av地址| 在线免费观看成人网| 欧美激情喷水视频| 日韩欧美在线观看| 国产一区二区三区在线看麻豆| 大桥未久女教师av一区二区| 邻家有女韩剧在线观看国语| 天天干天天色天天爽| 91高清免费视频| 在线不卡a资源高清| 成人国产精品免费观看| 成人一区而且| 在线观看特色大片免费视频| 成人精品视频一区二区三区| 91老司机福利 在线| 在线观看免费视频综合| 国产精品污www一区二区三区| 亚洲精品一区在线观看香蕉| 一本色道久久综合亚洲91| 性娇小13――14欧美| 蜜桃视频成人m3u8| 日本在线视频www| 久草资源站在线观看| 欧美视频小说| 一区二区成人精品| 日本在线观看天堂男亚洲| 国内久久婷婷综合| 凹凸成人在线| 久操视频在线免费播放| 亚欧在线免费观看| 久久精品欧美| 992tv在线成人免费观看| 日韩午夜激情电影| 亚洲欧洲成人自拍| 精品一区二区三区在线视频| 日本不卡高清| 黑人一区二区三区| 3p在线观看| 久久亚洲精华国产精华液 | 国产精品嫩草影院av蜜臀| 国产午夜精品一区二区三区欧美| 视频在线一区| 久久免费电影| 中文av在线播放| 免费无码不卡视频在线观看| 成人在线观看av| 欧美在线一级视频| 在线看欧美日韩| 欧美日产在线观看| 国产精品国产自产拍在线| 亚洲国产天堂久久综合| 4hu四虎永久在线影院成人| 久久久亚洲午夜电影| 97久久精品人人做人人爽50路| 成人av中文字幕| 亚洲美女激情视频| 成人av在线资源网站| 伊人成人开心激情综合网| xnxx国产精品| 视频一区二区三区在线| 欧美激情视频一区二区三区在线播放 | 久久久久久久久免费视频| a优女a优女片| 日韩欧美视频网站| 最新国产精品久久| 精品综合在线| 97人人模人人爽人人少妇| 日韩av成人在线| 欧美极度另类性三渗透| 色噜噜久久综合伊人一本| 亚洲精品美女在线观看播放| 欧美美女一区二区在线观看| 色婷婷综合久久久| 欧美性xxxx极品hd满灌| 亚洲尤物视频在线| 亚洲精品视频免费观看| 国产精品嫩草99a| 国产精品全国免费观看高清| 久久伊99综合婷婷久久伊| 成人免费观看男女羞羞视频| 久久精品国产亚洲aⅴ| 久久久777| 日韩专区在线视频| 久久一区中文字幕| 视频一区二区三区在线| 噜噜噜91成人网| 葵司免费一区二区三区四区五区| 一区二区三区国产盗摄| 国产精品毛片| 石原莉奈在线亚洲三区| 天堂一区二区在线| 在线观看欧美| 国产亚洲人成网站| 亚洲一区二区精品| 天天视频天天爽| 国产探花在线精品一区二区| av中文字幕一区| 日本精品视频一区二区三区| 天堂а√在线资源在线| 亚洲视频精品在线观看| 三上悠亚在线观看| 日韩男人天堂| 最近最新mv在线观看免费高清| 日本五十路在线| 超碰在线首页| 欧美女子与性| av网站在线免费观看| 欧美一级二级三级区| 在线中文字幕第一页| 91白丝在线| se69色成人网wwwsex| 4438五月综合| 91成人福利| 免费欧美一区| 久久高清精品| 亚洲国产高清一区| 日韩激情一二三区| 国产91高潮流白浆在线麻豆| 久久综合色天天久久综合图片| 亚洲国产精品激情在线观看| 最新国产成人在线观看| 亚洲靠逼com| 黑人极品videos精品欧美裸| 欧美色网站导航| 精品久久久久久无| 国产一区av在线| 久久久久久91香蕉国产| 国产精品一区二区久久国产| 国产精品一区二区不卡视频| 亚洲一区二区三区精品动漫| 精品国产伦一区二区三区观看体验| 日韩av地址| 国产一区二区在线电影| 黄页网站在线观看| 中文在线中文字幕| 免费av在线网址| videos性欧美另类高清| 成人av在线播放| 精品一区二区三| 在线日韩av| 日本韩国欧美三级| 久色视频在线| 在线麻豆国产传媒1国产免费| 欧美巨大丰满猛性社交| 不卡视频在线看| 欧美一区二区三区精品电影| 高潮白浆视频| 在线不卡欧美| 欧美白人最猛性xxxxx69交| 欧美一级日本a级v片| 99re热精品视频| 欧美丝袜自拍制服另类| 污污污污污污www网站免费| 国产精品探花在线观看| 自拍偷拍亚洲在线| 日韩欧美福利视频| 日韩视频一区二区在线观看| 俺去啦;欧美日韩| 国产精品美女www| 亚洲图片欧洲图片日韩av| 国产视频一区二区视频|