您好,欢迎访问一九零五行业门户网

JMS中的讯息通信模型

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 - activemqactivemq 是apache出品,最流行的,能力强劲的开源消息总线。activemq 是一个完全支持jms1.1和j2ee 1.4规范的 jms provider实现。
主要特点:
多种语言和协议编写客户端。语言: java、 c、 c++、 c#、 ruby、 perl、 python、 php。应用协议: openwire、stomp、rest、wsnotification、xmpp、amqp
完全支持jms1.1和j2ee 1.4规范 (持久化,xa消息,事务)
支持多种传送协议:in-vm,tcp,ssl,nio,udp,jgroups,jxta
支持高速的消息持久化
从设计上保证了高性能的集群,客户端-服务器,点对点
支持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
// 消息消费服务
其它类似信息

推荐信息