JMS中的消息通信模型
1. MQ簡介:
消息隊列(Message Queue,簡稱MQ),是應(yīng)用程序與應(yīng)用程序之間的一種通信方法。應(yīng)用程序通過發(fā)送和檢索出入列隊的針對應(yīng)用程序的數(shù)據(jù) - 消息來通信,而無需專用連接來鏈接它們。程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如RPC遠程過程調(diào)用的技術(shù)。隊列的使用消除了接收和發(fā)送應(yīng)用程序需同時執(zhí)行的要求。
2. JMS基本概念
JMS(Java Message Service) 即Java消息服務(wù),是由Sun開發(fā)的。它提供標準的產(chǎn)生、發(fā)送、接收消息的接口簡化企業(yè)應(yīng)用的開發(fā)。
JMS是一系列的接口及相關(guān)語義的集合,通過這些接口和和其中的方法,JMS客戶端如何去訪問消息系統(tǒng),完成創(chuàng)建、發(fā)送、接收和讀取企業(yè)消息系統(tǒng)中消息。
它支持兩種消息通信模型:點對點模型(point-to-point、P2P)和發(fā)布者/訂閱者模型(Pub/Sub)。P2P模型規(guī)定了一個消息只能有一個接收者;Pub/Sub 模型允許一個消息可以有多個接收者。
2.1 P2P模型 - 打電話模型
對于P2P模型,消息生產(chǎn)者產(chǎn)生一個消息后,把這個消息發(fā)送到一個Queue(隊列)中,然后消息接收者再從這個Queue中讀取,一旦這個消息被一個接收者讀取之后,它就在這個Queue中消失了,所以一個消息只能被一個接收者消費。
2.2 Pub/Sub模型 - 訂報紙模型
與P2P模型不同,Pub/Sub模型中,消息生產(chǎn)者產(chǎn)生一個消息后,把這個消息發(fā)送到一個Topic中,這個Topic可以同時有多個接收者在監(jiān)聽,當一個消息到達這個Topic之后,所有消息接收者都會收到這個消息。
3. 支持JMS的開源MQ - ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實現(xiàn)。
主要特點:
注:
在查詢資料的過程中發(fā)現(xiàn),PHP與ActiveMQ整合的方式可以直接使用Rest接口調(diào)用,但更高效的方式應(yīng)該是安裝Stomp協(xié)議的PHP擴展。
Stomp 提供了客戶端和代理之間進行廣泛消息傳輸?shù)目蚣堋tomp 是一個非常簡單而且易用的通訊協(xié)議實現(xiàn),盡管代理端的編寫可能非常復雜,但是編寫一個 Stomp 客戶端卻是很簡單的事情,另外你可以使用 Telnet 來與你的 Stomp 代理進行交互。
PHP可以通過PECL編譯安裝Stomp擴展。
stomp_common.php
//connection ActiveMQ function openMQ(&$queue=FALSE) {$amq = array('url' => 'tcp://127.0.0.1:61613','id' => 'xxx','pswd' => 'xxx','queue' => '/queue/mytest','enable' => TRUE);$link = stomp_connect($amq['url'], $amq['id'], $amq['pswd']);if (!$link) {die("Can't connect MQ !!");} else {return $link;} }//send a message to the queue function sendMQ($data) {$link = openMQ();foreach ($data as $pitem) {//使用 persistent message$result = stomp_send($link, $amq['queue'], $pitem, array("persistent" => "true"));if (FALSE === $result) {//do something}} }//receive message function receiveMQ() {$link = openMQ($queue);//stomp_subscribe($link, $queue);stomp_subscribe($link, $queue, array("activemq.prefetchSize" => 1000));while (1) {if (TRUE === stomp_has_frame($link)) {$frame = stomp_read_frame($link);if (FALSE !== $frame) {stomp_ack($link, $frame['headers']['message-id']); } else {//do somethingbreak; } } else { break; } } stomp_unsubscribe($link, $queue); stomp_close($link); }stomp_sender.php
// 消息發(fā)送服務(wù)stomp_consumer.php
// 消息消費服務(wù)總結(jié)
以上是生活随笔為你收集整理的JMS中的消息通信模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到孔雀从家里飞走了是什么意思
- 下一篇: 梦到已故的亲人还活着是什么意思