摘要:而中的消息中間件則是在常見的消息中間件類型無疑是不錯的選擇。是在之間傳遞的消息的對象?;竟δ苁怯糜诤兔嫦蛳⒌闹虚g件相互通信的應(yīng)用程序接口。支持兩種消息發(fā)送和接收模型。一種稱為模型,即采用點(diǎn)對點(diǎn)的方式發(fā)送消息。
消息中間件利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。而Java中的消息中間件則是JMS---Java Message Service.在常見的消息中間件類型ActiveMQ無疑是不錯的選擇。接下來我們先簡單介紹一下什么是JMS及ActiveMQ而后我們介紹一下ActiveMQ中的兩種模式 -- 隊(duì)列模型以及主題模式。
JMS簡介JMS基本概念
JMS(Java Message Service)是訪問企業(yè)消息系統(tǒng)的標(biāo)準(zhǔn)API,它便于消息系統(tǒng)中的Java應(yīng)用程序進(jìn)行消息交換,并且通過提供標(biāo)準(zhǔn)的產(chǎn)生、發(fā)送、接收消息的接口簡化企業(yè)應(yīng)用的開發(fā)。
JMS應(yīng)用由以下幾部分組成:
JMS provider :是一個消息系統(tǒng),它實(shí)現(xiàn)了JMS 接口并提供管理和控制的功能。
JMS clients :是用Java語言寫的一些程序和組件,它們產(chǎn)生和使用消息。
Messages :是在JMS clients之間傳遞的消息的對象。
Administered objects :是由使用JMS clients 的人生成的預(yù)選設(shè)置好的JMS 對象。有兩種這樣的對象:
destinations和connection factories。
JMS基本功能
JMS是用于和面向消息的中間件相互通信的應(yīng)用程序接口。它既支持點(diǎn)對點(diǎn)(point-to-point)的域,又支持發(fā)布/訂閱 (publish/subscribe)類型的域,并且提供對下列類型的支持:經(jīng)認(rèn)可的消息傳遞,事務(wù)型消息的傳遞,一致性消息和具有持久性的訂閱者支 持。JMS還提供了另一種方式來對您的應(yīng)用與舊的后臺系統(tǒng)相集成。
消息服務(wù)類型
1) point-to-point (PTP)方式:點(diǎn)到點(diǎn)的模型。消息由一個JMS客戶機(jī)(發(fā)布者)發(fā)送到服務(wù)器上的一個目的地,即一個隊(duì)列(queue)。而另一個JMS客戶機(jī)(訂閱者)則可以訪問這個隊(duì)列,并從該服務(wù)器獲取這條消息。
2) publish/subscribe (pub/sub)方式:發(fā)布-訂閱模型。這里仍然是由一個JMS客戶機(jī)將一條消息發(fā)布到服務(wù)器上的一個目的地上,但是這次這個目的地叫做一個主題 (topic),可有多個訂閱者去訪問該消息。消息將一直維持在主題中,直到這個主題的所有訂閱者都取走了該消息的一個副本。消息也包括了一個參數(shù),用于 定義了該消息的耐久性(它能夠在服務(wù)器上等待訂閱者多長時間)。
ActiveMQ是Apache所提供的一個開源的消息系統(tǒng),完全采用Java來實(shí)現(xiàn),因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服務(wù))規(guī)范。JMS是一組Java應(yīng)用程序接口,它提供消息的創(chuàng)建、發(fā)送、讀取等一系列服務(wù)。JMS提供了一組公共應(yīng)用程序接口和響應(yīng)的語法,類似于Java數(shù)據(jù)庫的統(tǒng)一訪問接口JDBC,它是一種與廠商無關(guān)的API,使得Java程序能夠與不同廠商的消息組件很好地進(jìn)行通信。
JMS支持兩種消息發(fā)送和接收模型。一種稱為P2P(Ponit to Point)模型,即采用點(diǎn)對點(diǎn)的方式發(fā)送消息。P2P模型是基于隊(duì)列的,消息生產(chǎn)者發(fā)送消息到隊(duì)列,消息消費(fèi)者從隊(duì)列中接收消息,隊(duì)列的存在使得消息的異步傳輸稱為可能,P2P模型在點(diǎn)對點(diǎn)的情況下進(jìn)行消息傳遞時采用。下面兩張圖來描述一下這兩種模型:
【1】隊(duì)列模型
隊(duì)列模型之生產(chǎn)者端
package com.imooc.jms.queue;
import java.awt.font.TextMeasurer;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AppProducer {
private static final String url = "tcp://192.168.133.1:61616"; private static final String queueName = "queue-test"; public static void main(String[] args) throws JMSException { //1.創(chuàng)建connectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創(chuàng)建connection Connection connection = connectionFactory.createConnection(); //3. 啟動鏈接 connection.start(); //4. 創(chuàng)建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創(chuàng)建目標(biāo) Destination destination = session.createQueue(queueName); //6. 創(chuàng)建生產(chǎn)者向目標(biāo)發(fā)送消息 MessageProducer producer= session.createProducer(destination); for(int i = 0 ;i<100;i++){ //7. 創(chuàng)建消息 TextMessage textMessage = session.createTextMessage("test"+i); //8. 發(fā)布消息 producer.send(textMessage); System.out.println("發(fā)送消息:"+textMessage.getText()); } //9. 關(guān)閉連接 connection.close(); }
}
說明:此為隊(duì)列模型中的生產(chǎn)者端,下面就該端代碼進(jìn)行說明:
new 一個ConnectionFactory --》 new 一個connection ---》啟動這個連接----》創(chuàng)建一個會話----》創(chuàng)建消息發(fā)送目的地---》創(chuàng)建一個消息生產(chǎn)者向目的地發(fā)送消息--》發(fā)送消息----》關(guān)閉連接
隊(duì)列模型之消費(fèi)者端
package com.imooc.jms.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AppConsumer {
private static final String url = "tcp://192.168.133.1:61616"; private static final String queueName = "queue-test"; public static void main(String[] args) throws JMSException { //1.創(chuàng)建connectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創(chuàng)建connection Connection connection = connectionFactory.createConnection(); //3. 啟動鏈接 connection.start(); //4. 創(chuàng)建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創(chuàng)建目標(biāo) Destination destination = session.createQueue(queueName); //6. 創(chuàng)建一個消費(fèi)者 MessageConsumer consumer = session.createConsumer(destination); //7. 創(chuàng)建一個監(jiān)聽器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { System.out.println("接受消息:"+textMessage.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //9. 關(guān)閉連接 //connection.close(); }
}
說明:此為隊(duì)列模型中的消費(fèi)者端,下面就該端代碼進(jìn)行說明:
new 一個ConnectionFactory --》 new 一個connection ---》啟動這個連接----》創(chuàng)建一個會話----》創(chuàng)建消息發(fā)送目的地---》創(chuàng)建一個消息消費(fèi)者--》創(chuàng)建一個消息監(jiān)聽器監(jiān)聽消息----》關(guān)閉連接
【2】主題模型
主題模型之生產(chǎn)者端
package com.imooc.jms.topic;
import java.awt.font.TextMeasurer;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AppProducer {
private static final String url = "tcp://192.168.133.1:61616"; private static final String topicName = "topic-test"; public static void main(String[] args) throws JMSException { //1.創(chuàng)建connectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創(chuàng)建connection Connection connection = connectionFactory.createConnection(); //3. 啟動鏈接 connection.start(); //4. 創(chuàng)建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創(chuàng)建目標(biāo) Destination destination = session.createTopic(topicName); //6. 創(chuàng)建生產(chǎn)者向目標(biāo)發(fā)送消息 MessageProducer producer= session.createProducer(destination); for(int i = 0 ;i<100;i++){ //7. 創(chuàng)建消息 TextMessage textMessage = session.createTextMessage("test"+i); //8. 發(fā)布消息 producer.send(textMessage); System.out.println("發(fā)送消息:"+textMessage.getText()); } //9. 關(guān)閉連接 connection.close(); }
}
主題模型之消費(fèi)者端
package com.imooc.jms.topic;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AppConsumer {
private static final String url = "tcp://192.168.133.1:61616"; private static final String topicName = "topic-test"; public static void main(String[] args) throws JMSException { //1.創(chuàng)建connectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.創(chuàng)建connection Connection connection = connectionFactory.createConnection(); //3. 啟動鏈接 connection.start(); //4. 創(chuàng)建會話 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5. 創(chuàng)建目標(biāo) Destination destination = session.createTopic(topicName); //6. 創(chuàng)建一個消費(fèi)者 MessageConsumer consumer = session.createConsumer(destination); //7. 創(chuàng)建一個監(jiān)聽器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { System.out.println("接受消息:"+textMessage.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //9. 關(guān)閉連接 //connection.close(); }
}
最后創(chuàng)建項(xiàng)目源碼地址:
鏈接:http://pan.baidu.com/s/1bo1PSib 密碼:khyc
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/35878.html
摘要:時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。這個時候,可以啟動多臺積分系統(tǒng),來同時消費(fèi)這個消息中間件里面的登錄消息,達(dá)到橫向擴(kuò)展的作用。 時間:2017年07月22日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:中間件的分類基于遠(yuǎn)程過程調(diào)用的中間件?;趯ο笳埱蟠淼闹虚g件。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。 一.中間件 1.1 什么是中間件? 由于業(yè)務(wù)、機(jī)構(gòu)和技術(shù)是不斷變化的,因此為其服務(wù)的軟件系統(tǒng)必須適應(yīng)這樣的變化。在合并、添加服務(wù)或擴(kuò)展可用服務(wù)之后,公司可能無力負(fù)擔(dān)重新創(chuàng)建信息系統(tǒng)所需的成本。正是在...
摘要:通過以上分析我們可以得出消息隊(duì)列具有很好的削峰作用的功能即通過異步處理,將短時間高并發(fā)產(chǎn)生的事務(wù)消息存儲在消息隊(duì)列中,從而削平高峰期的并發(fā)事務(wù)。 該文已加入開源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項(xiàng)目,Star 數(shù)接近 16k)。地址:https://github.com/Snailclimb... 本文內(nèi)容思維導(dǎo)圖:showImg(ht...
摘要:學(xué)習(xí)消息隊(duì)列的使用之前,我們先來搞清。是操作消息的接口。消息生產(chǎn)者由創(chuàng)建,并用于將消息發(fā)送到。接收消息打印結(jié)果這是接收到的消息消費(fèi)者啟動。。。。 通過上一篇文章 《消息隊(duì)列深入解析》,我們已經(jīng)消息隊(duì)列是什么、使用消息隊(duì)列的好處以及常見消息隊(duì)列的簡單介紹。 這一篇文章,主要帶大家詳細(xì)了解一下消息隊(duì)列ActiveMQ的使用。 學(xué)習(xí)消息隊(duì)列ActiveMQ的使用之前,我們先來搞清JMS。 J...
閱讀 3062·2021-11-24 10:34
閱讀 3322·2021-11-22 13:53
閱讀 2629·2021-11-22 12:03
閱讀 3597·2021-09-26 09:47
閱讀 3005·2021-09-23 11:21
閱讀 4771·2021-09-22 15:08
閱讀 3289·2021-07-23 10:59
閱讀 1258·2019-08-29 18:31