亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

JMS簡介與ActiveMQ實戰代碼分享

2024-07-13 10:15:40
字體:
來源:轉載
供稿:網友

一、異步通信

之前接觸到的RMI,Hessian等技術都是同步通信機制。當客戶端調用遠程方法時,客戶端必須等到遠程方法完成后,才能繼續執行。這段時間客戶端一直會被阻塞(這樣造成的用戶體驗很不好)。

jms,activemq,jms和activemq,實例,jms之activemq

(同步通信)

同步通信有并不是程序之間交互的唯一方式,異步通信機制中,客戶端不需要等待服務處理消息,可以繼續執行,并且最終能夠收到并處理消息。

jms,activemq,jms和activemq,實例,jms之activemq

(異步通信)

異步通信的優勢

無需等待。客戶端只需要將消息發送給消息代理,不需要等待就可以繼續執行別的任務,且確信消息會被投遞給相應的目的地。
面向消息和解耦。 客戶端不需要擔心遠程服務的接口規范,只需要把消息放入消息隊列然后獲取結果即可。

二、JMS

1. 簡介

在JMS出現之前,每個消息代理都是有不同的實現,這就使得不同代理之間的消息代碼很難通用。JMS(Java Message Service,Java消息服務)是一個標準,定義了使用消息代理的通用API。即所有遵從規范的實現都使用通用的接口,類似于JDBC為數據庫操作提供通用接口。

JMS幾個重要的要素:

Destination:消息從發送端發出后要走的通道。
ConnectionFactory:連接工廠,用于創建連接的對象。
Connection:連接接口,用于創建session。
Session:會話接口,用于創建消息的發送者,接受者以及消息對象本身。
MessageConsumer:消息的消費者。
MessageProducer:消息的生產者。
XXXMessage:各種類型的消息對象,包括ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage 5種。

2. JMS消息模型

不同的消息系統有不同的消息模型。JMS提供了兩種模型:Queue(點對點)和Topic(發布/訂閱)。

JMS Queue(點對點)模型

在點對點模型中,消息生產者生產消息發送到queue中,然后消息消費者從queue中取出并且消費消息,但不可重復消費。

如圖:

jms,activemq,jms和activemq,實例,jms之activemq

發送者1,發送者2,發送者3各發送一條消息到服務器;

消息1,2,3就會按照順序形成一個隊列,隊列中的消息不知道自己會被哪個接收者消費;

接收者1,2,3分別從隊列中取出一條消息進行消費,每取出一條消息,隊列就會將該消息刪除,這樣即保證了消息不會被重復消費。

JMS Queue模型也成為P2P(Point to Point)模型。

JMS Topic(發布/訂閱)模型

JMS Topic模型與JMS Queue模型的最大差別在于消息接收的部分。Topic模型類似于微信公眾號,訂閱了該公眾號的接收者都可以接收到公眾號推送的消息。

如圖:

jms,activemq,jms和activemq,實例,jms之activemq

發布者1,2,3分別發布3個主題1,2,3;
這樣訂閱了主題1的用戶群:訂閱者1,2,3即能接收到主題1消息;同理訂閱者4,5,6即能接收到主題2消息,訂閱者7,8,9即能接收到主題3消息。

JMS Topic模型也成為Pus/Sub模型。

兩種模式下各要素的對比:

jms,activemq,jms和activemq,實例,jms之activemq

3. 傳統JMS編程模型

Producer:

(1)創建連接工廠ConnectionFactory;
(2) 使用連接工廠創建連接;
(3)啟動連接;
(4)創建會話;
(5) 創建消息發送的目的地;
(6)創建生產者;
(7)創建消息類型和消息內容;
(8)發送消息;

Consumer:

(1)創建連接工廠ConnectionFactory;
(2) 使用連接工廠創建連接;
(3)啟動連接;
(4)創建會話;
(5) 創建消息發送的目的地;
(6)創建消費者
(7)創建消息類型;
(8)接收消息;

三、 ActiveMQ簡介

ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。

ActiveMQ 主要特性:

多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議:
OpenWire,Stomp REST,WS Notification,XMPP,AMQP
完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
對spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性
通過了常見J2EE服務器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上
支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
支持通過JDBC和journal提供高速的消息持久化
從設計上保證了高性能的集群,客戶端-服務器,點對點
支持Ajax
支持與Axis的整合
可以很容易得調用內嵌JMS provider,進行測試

四、 ActiveMQ實戰

下面看看如何ActiveMQ實現一個簡單的消息隊列。

傳統的JMS編程模型

1. JMS Queue模型代碼實現:

Producer:

package com.wgs.mq.queue;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by GenshenWang.nomico on 2017/10/19. */public class ActiveMQProducer {	private static final String URL = "tcp://localhost:61616";	private static final String QUEUE_NAME = "queue-name";	public static void main(String[] args) throws JMSException {		//1 創建連接工廠ConnectionFactory		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);		//2 使用連接工廠創建連接		Connection connection = connectionFactory.createConnection();		//3 啟動連接		connection.start();		//4 創建會話		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);		//5 創建消息發送的目的地		Destination destination = session.createQueue(QUEUE_NAME);		//6 創建生產者		MessageProducer messageProducer = session.createProducer(destination);		//7 創建消息		TextMessage textMessage = session.createTextMessage();		for (int i = 1; i <= 100; i++) {			//8 創建消息內容			textMessage.setText("發送者- 1 -發送消息:" + i);			//9 發送消息			messageProducer.send(textMessage);		}		System.out.println("消息發送成功");		session.close();		connection.close();	}}

Conusmer:

package com.wgs.mq.queue;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by GenshenWang.nomico on 2017/10/19. */public class ActiveMQConsumer {	private static final String URL = "tcp://localhost:61616";	private static final String QUEUE_NAME = "queue-name";	public static void main(String[] args) throws JMSException {		//1 創建連接工廠ConnectionFactory		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);		//2 使用連接工廠創建連接		Connection connection = connectionFactory.createConnection();		//3 啟動連接		connection.start();		//4 創建會話		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);		//5 創建消息發送的目的地		Destination destination = session.createQueue(QUEUE_NAME);		//6 創建消費者		MessageConsumer messageConsumer = session.createConsumer(destination);		messageConsumer.setMessageListener(new MessageListener() {			public void onMessage(Message message) {				//7 創建消息				TextMessage textMessage = (TextMessage)message;				try {					//7 接收消息					System.out.println("消費者- 1 -接收消息:【" + textMessage.getText() + "】");				}				catch (JMSException e) {					e.printStackTrace();				}			}		}		);	}}

2. JMS Topic模型代碼實現:

Producer:

package com.wgs.mq.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * 發布訂閱模式 * Created by GenshenWang.nomico on 2017/10/19. */public class ActiveMQProducer {	private static final String URL = "tcp://localhost:61616";	private static final String TOPIC_NAME = "topic-name";	public static void main(String[] args) throws JMSException {		//1 創建連接工廠ConnectionFactory		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);		//2 使用連接工廠創建連接		Connection connection = connectionFactory.createConnection();		//3 啟動連接		connection.start();		//4 創建會話		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);		//5 創建帶有主題的消息發送的目的地		Destination destination = session.createTopic(TOPIC_NAME);		//6 創建生產者		MessageProducer messageProducer = session.createProducer(destination);		//7 創建消息		TextMessage textMessage = session.createTextMessage();		for (int i = 1; i <= 100; i++) {			//8 創建消息內容			textMessage.setText("發送者- 1 -發送消息:" + i);			//9 發送消息			messageProducer.send(textMessage);		}		System.out.println("消息發送成功");		session.close();		connection.close();	}}

Consumer:

package com.wgs.mq.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * 發布訂閱模式 * Created by GenshenWang.nomico on 2017/10/19. */public class ActiveMQConsumer {	private static final String URL = "tcp://localhost:61616";	private static final String TOPIC_NAME = "topic-name";	public static void main(String[] args) throws JMSException {		//1 創建連接工廠ConnectionFactory		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);		//2 使用連接工廠創建連接		Connection connection = connectionFactory.createConnection();		//3 啟動連接		connection.start();		//4 創建會話		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);		//5 創建消息發送的目的地		Destination destination = session.createTopic(TOPIC_NAME);		//6 創建消費者		MessageConsumer messageConsumer = session.createConsumer(destination);		messageConsumer.setMessageListener(new MessageListener() {			public void onMessage(Message message) {				//7 創建消息				TextMessage textMessage = (TextMessage)message;				try {					//7 接收消息					System.out.println("消費者- 1 -接收消息:【" + textMessage.getText() + "】");				}				catch (JMSException e) {					e.printStackTrace();				}			}		}		);	}}

使用Spring的JMS模板

雖然JMS為所有的消息代理提供了統一的接口,但如同JDBC一樣,在處理連接,語句,結果集和異常時會顯得很繁雜。不過,Spring為我們提供了JmsTemplate來消除冗余和重復的JMS代碼。
下面看看如何使用JmsTemplate來實現消息隊列。

1. JMS Queue模型代碼實現:

配置文件:
producer.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  <context:annotation-config/>  <!-- ActiveMQ提供的ConnectionFactory-->  <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">    <property name="brokerURL" value="tcp://localhost:61616"/>  </bean>  <!-- 在Spring 中配置JMS連接工廠,連接到ActiveMQ提供的ConnectionFactory-->  <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">    <property name="targetConnectionFactory" ref = "targetConnectionFactory"/>  </bean>  <!-- 配置JmsTemplate,用于發送消息 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">    <property name="connectionFactory" ref="connectionFactory"/>  </bean>  <!-- 配置隊列目的地的名稱-->  <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">    <constructor-arg value="queue-spring-name"/>  </bean>  <!-- 配置隊列目的地的名稱-->  <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">    <constructor-arg value="topic-spring-name"/>  </bean>  <bean id="producerServiceImpl" class="com.wgs.jms.producer.ActiveMQProducerServiceImpl"/></beans>

consumer.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  <context:annotation-config/>  <!-- ActiveMQ提供的ConnectionFactory-->  <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">    <property name="brokerURL" value="tcp://localhost:61616"/>  </bean>  <!-- 在Spring 中配置JMS連接工廠,連接到ActiveMQ提供的ConnectionFactory-->  <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">    <property name="targetConnectionFactory" ref = "targetConnectionFactory"/>  </bean>  <!-- 配置隊列目的地的名稱-->  <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">    <constructor-arg value="queue-spring-name"/>  </bean>  <!-- 配置消息監聽器-->  <bean id="consumerMessageListener" class="com.wgs.jms.consumer.ConsumerMessageListener"/>  <!-- 配置隊列目的地的名稱-->  <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">    <property name="destination" ref="queueDestination"/>    <property name="connectionFactory" ref="connectionFactory"/>    <property name="messageListener" ref="consumerMessageListener"/>  </bean>  <!-- 配置隊列目的地的名稱-->  <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">    <constructor-arg value="topic-spring-name"/>  </bean></beans>

生產者Producer:

(1)先寫一個接口:

package com.wgs.jms.producer;/** * Created by GenshenWang.nomico on 2017/10/20. */public interface ActiveMQProducerService {  void sendMessage(final String message);}

(2)接口的實現:

package com.wgs.jms.producer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import javax.annotation.Resource;import javax.jms.*;/** * Created by GenshenWang.nomico on 2017/10/20. */public class ActiveMQProducerServiceImpl implements ActiveMQProducerService {	@Autowired	  JmsTemplate jmsTemplate;	@Resource(name = "queueDestination")	  Destination destination;	public void sendMessage(final String message) {		jmsTemplate.send(destination, new MessageCreator() {			public Message createMessage(Session session) throws JMSException {				TextMessage textMessage = session.createTextMessage(message);				return textMessage;			}		}		);		System.out.println("生產者- 1 -發送消息成功:" + message);	}}

(3)測試:

package com.wgs.jms.producer;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by GenshenWang.nomico on 2017/10/20. */public class ActiveMQProducerMain {	public static void main(String[] args) {		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("producer.xml");		ActiveMQProducerService service = context.getBean(ActiveMQProducerService.class);		for (int i = 0; i < 100; i++) {			service.sendMessage("test" + i);		}		context.close();	}}

消費者:

(1)創建消息監聽器:

package com.wgs.jms.consumer;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * Created by GenshenWang.nomico on 2017/10/20. */public class ConsumerMessageListener implements MessageListener {	public void onMessage(Message message) {		try {			TextMessage textMessage = (TextMessage) message;			System.out.println("消費者- 1 -接收消息:" + textMessage.getText());		}		catch (JMSException e) {			e.printStackTrace();		}	}}

(2)測試:

package com.wgs.jms.consumer;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by GenshenWang.nomico on 2017/10/20. */public class ActiveMQConsumerMain {	public static void main(String[] args) {		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");	}}

2. JMS Topic模型代碼實現:

將上述代碼中出現的queueDestination改為topicDestination即可。

總結

以上就是本文關于JMS簡介與ActiveMQ實戰代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲有声小说3d| 欧美性猛交xxxx免费看漫画| 日韩av电影手机在线观看| 97婷婷大伊香蕉精品视频| 亚洲第一精品自拍| 另类天堂视频在线观看| 疯狂欧美牲乱大交777| 中文字幕欧美精品日韩中文字幕| 欧美一级电影免费在线观看| 91在线看www| 92国产精品久久久久首页| 亚洲国产欧美一区二区丝袜黑人| 91精品免费久久久久久久久| 国产不卡av在线免费观看| 亚洲天堂男人天堂女人天堂| 色悠久久久久综合先锋影音下载| 久久久av亚洲男天堂| 91视频国产高清| 欧美视频第一页| 国产有码一区二区| 国产精品香蕉av| 免费av一区二区| 国产美女久久久| 91在线免费视频| 国产欧美最新羞羞视频在线观看| 欧美大尺度激情区在线播放| 亚洲欧美中文日韩v在线观看| 欧美激情aaaa| 欧美重口另类videos人妖| 久久精品国产亚洲精品| 伊人久久久久久久久久久久久| 亚洲黄页网在线观看| 中文字幕综合一区| 国产精品美乳一区二区免费| 久久久天堂国产精品女人| 一区二区欧美激情| 成人国内精品久久久久一区| 国产精品久久久久久av下载红粉| 久久99热精品| 久久天堂电影网| 国产精品扒开腿做爽爽爽男男| 久久亚洲成人精品| 欧美孕妇孕交黑巨大网站| 精品国产福利视频| 亚洲综合日韩在线| 青青草国产精品一区二区| 97成人精品区在线播放| 一本色道久久88亚洲综合88| 欧洲亚洲免费视频| 国产91色在线| 91在线中文字幕| 成人国产在线激情| 欧美精品一本久久男人的天堂| 亚洲日韩欧美视频| www国产精品视频| 国内精品中文字幕| 国产中文欧美精品| 91av在线看| 91精品综合久久久久久五月天| 日韩欧美成人区| 亚洲va久久久噜噜噜久久天堂| 亚洲精品国产精品自产a区红杏吧| 在线精品播放av| 午夜精品久久久久久久男人的天堂| 欧美精品videossex性护士| 欧美日韩国产一区中文午夜| 26uuu日韩精品一区二区| 91视频-88av| 国产精品福利片| 精品亚洲男同gayvideo网站| 日韩视频在线免费观看| 国自产精品手机在线观看视频| 久久久久久久91| 国产欧美一区二区三区四区| 国产婷婷成人久久av免费高清| 国产精品视频永久免费播放| 欧美成aaa人片在线观看蜜臀| 亚洲人成电影网站色www| 91最新在线免费观看| 久久夜色精品亚洲噜噜国产mv| 国产成人精品视频在线观看| 日韩国产精品视频| 欧美激情亚洲国产| yw.139尤物在线精品视频| 久久精品视频导航| 亚洲黄色免费三级| 欧美黑人极品猛少妇色xxxxx| 亚洲毛片在线看| 欧美一区二区三区四区在线| 欧美老女人性视频| 亚洲free性xxxx护士白浆| 亚洲网站在线观看| 日韩精品亚洲精品| 国产不卡av在线免费观看| 精品成人在线视频| 亚洲网站在线看| 97在线观看视频国产| 欧美最顶级丰满的aⅴ艳星| 欧美精品电影在线| 尤物九九久久国产精品的特点| 日韩av免费一区| 欧美美女18p| 国产999在线观看| 欧美精品videos另类日本| 亚洲自拍另类欧美丝袜| 亚洲激情国产精品| 成人av资源在线播放| 亚洲人成电影网站色…| 亚洲色图15p| 成人性生交大片免费观看嘿嘿视频| 日韩欧美在线视频| 亚洲人成电影网站色xx| 国产精品视频免费在线观看| 一道本无吗dⅴd在线播放一区| 亚洲精品电影网站| 国产精品青青在线观看爽香蕉| 成人精品在线观看| 亚洲美女av网站| 亚洲影院在线看| 精品久久久久久久久久国产| 欧洲美女免费图片一区| 91av在线国产| 在线观看视频亚洲| 久久久久久久999精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲男女自偷自拍图片另类| 色偷偷噜噜噜亚洲男人的天堂| 视频一区视频二区国产精品| 精品久久久久久久久久久久| 欧美精品videossex性护士| 国产免费一区二区三区香蕉精| 91日韩在线播放| 亚洲japanese制服美女| 久久九九精品99国产精品| 精品欧美国产一区二区三区| 成人精品久久一区二区三区| 中文亚洲视频在线| 亚洲亚裔videos黑人hd| 成人在线激情视频| 日韩精品在线免费| 最近中文字幕mv在线一区二区三区四区| 精品久久久久久久久久久久久久| 欧美黑人xxxⅹ高潮交| 中文国产亚洲喷潮| 成人深夜直播免费观看| 国产精品自产拍高潮在线观看| 久久精品久久久久久国产 免费| 亚洲人成77777在线观看网| 国内精品免费午夜毛片| 91九色国产社区在线观看| 米奇精品一区二区三区在线观看| 一区二区欧美在线| 人人澡人人澡人人看欧美| 国产精品久久久久国产a级| 日韩欧美在线播放| 精品国产自在精品国产浪潮| 日韩**中文字幕毛片| 亚洲天堂男人天堂| 欧美大片网站在线观看| 日本不卡高字幕在线2019| 操人视频在线观看欧美| 亚洲午夜av久久乱码| 亚洲mm色国产网站| 91免费在线视频网站|