国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JMS中的消息通信模型

2019-11-15 02:07:26
字體:
來源:轉載
供稿:網友
JMS中的消息通信模型1. MQ簡介:

消息隊列(Message Queue,簡稱MQ),是應用程序與應用程序之間的一種通信方法。應用程序通過發送和檢索出入列隊的針對應用程序的數據 - 消息來通信,而無需專用連接來鏈接它們。程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用于諸如RPC遠程過程調用的技術。隊列的使用消除了接收和發送應用程序需同時執行的要求。

2. JMS基本概念

JMS(java Message Service) 即Java消息服務,是由Sun開發的。它提供標準的產生、發送、接收消息的接口簡化企業應用的開發。

JMS是一系列的接口及相關語義的集合,通過這些接口和和其中的方法,JMS客戶端如何去訪問消息系統,完成創建、發送、接收和讀取企業消息系統中消息。

它支持兩種消息通信模型:點對點模型(point-to-point、P2P)和發布者/訂閱者模型(Pub/Sub)。P2P模型規定了一個消息只能有一個接收者;Pub/Sub 模型允許一個消息可以有多個接收者。

2.1 P2P模型 - 打電話模型

對于P2P模型,消息生產者產生一個消息后,把這個消息發送到一個Queue(隊列)中,然后消息接收者再從這個Queue中讀取,一旦這個消息被一個接收者讀取之后,它就在這個Queue中消失了,所以一個消息只能被一個接收者消費。

2.2 Pub/Sub模型 - 訂報紙模型

與P2P模型不同,Pub/Sub模型中,消息生產者產生一個消息后,把這個消息發送到一個Topic中,這個Topic可以同時有多個接收者在監聽,當一個消息到達這個Topic之后,所有消息接收者都會收到這個消息。

3. 支持JMS的開源MQ - ActiveMQ

ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS PRovider實現。

主要特點:

  1. 多種語言和協議編寫客戶端。語言: Java、 C、 C++、 C#、 Ruby、 Perl、 Python、 php。應用協議: OpenWire、Stomp、Rest、WSNotification、XMPP、AMQP
  2. 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
  3. 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
  4. 支持高速的消息持久化
  5. 從設計上保證了高性能的集群,客戶端-服務器,點對點
  6. 支持Ajax

注:

在查詢資料的過程中發現,PHP與ActiveMQ整合的方式可以直接使用Rest接口調用,但更高效的方式應該是安裝Stomp協議的PHP擴展。

Stomp 提供了客戶端和代理之間進行廣泛消息傳輸的框架。Stomp 是一個非常簡單而且易用的通訊協議實現,盡管代理端的編寫可能非常復雜,但是編寫一個 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 queuefunction 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 messagefunction 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 something                break;                }            } else {                break;            }        }        stomp_unsubscribe($link, $queue);        stomp_close($link);    }    

stomp_sender.php

// 消息發送服務

stomp_consumer.php

// 消息消費服務

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 登封市| 红原县| 德保县| 鄱阳县| 彭山县| 安庆市| 融水| 娄底市| 石林| 江阴市| 蕉岭县| 延长县| 司法| 翼城县| 太原市| 罗山县| 泰州市| 建始县| 湛江市| 民勤县| 达拉特旗| 嘉黎县| 广河县| 德阳市| 田林县| 虞城县| 格尔木市| 拉孜县| 武清区| 丰原市| 三原县| 琼中| 乳山市| 大方县| 霍山县| 太湖县| 新丰县| 铜川市| 普陀区| 鲁山县| 普安县|