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实现。
主要特点:
- 多种语言和协议编写客户端。语言: 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 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 something
break;
}
} else {
break;
}
}
stomp_unsubscribe($link, $queue);
stomp_close($link);
}
stomp_sender.php
// 消息发送服务
stomp_consumer.php
// 消息消费服务
JMS中的消息通信模型的更多相关文章
- IBM MQ消息中间件jms消息中RHF2消息头的处理
公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- JMS发布/订阅消息传送例子
前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...
- JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)
最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...
- 如何在优雅地Spring 中实现消息的发送和消费
本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个 ...
- NATS—消息通信模型
消息通信模型 NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去:订阅者接收到消息,进行解码,再处理.订阅者处理NATS消息可以是同步的或异步的. * 异步处理 异步处 ...
- spring JMS在接收消息的时候总是报错
spring JMS在接收消息的时候总是报错 org.springframework.jms.UncategorizedJmsException: Uncategorized exception oc ...
- JMS(Java消息服务)
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM:指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来 ...
- NATS_02:NATS消息通信模型
消息通信模型 NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去:订阅者接收到消息,进行解码,再处理.订阅者处理NATS消息可以是同步的或异步的. * 异步处理 异步处 ...
随机推荐
- JS判断鼠标移入元素的方向
最终效果 这里的关键主要是判断鼠标是从哪个方向进入和离开的 $("li").on("mouseenter mouseleave",function(e) { v ...
- Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件(原创)
回到目录 对于redis-sentinel我在之前的文章中已经说过,它是一个仲裁者,当主master挂了后,它将在所有slave服务器中进行选举,选举的原则当然可以看它的官方文章,这与我们使用者没有什 ...
- Atitit ocr识别原理 与概论 attilax总结
Atitit ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...
- 好友录v1.2.7_Build(7790)
<好友录>是使用.net Framework4.0+sqlite开发的,属于WingKu(谷毅科技)系列软件之一.它是一款外观时尚.美观,操作简单.易用,功能强大的个人通讯信息管理软件.它 ...
- python学习 操作mysql 环境搭建
MySqlDB官网只支持Python3.4,这里Python3.5使用第三方库PyMysql连接Mysql数据库. 环境: window7.python3.5 下载PyMysql库:https://p ...
- Python基础语法
学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组.链表.Map.Set等: ...
- Form的enctype="multipart/form-data"作用
<form class="form-horizontal" role="form" method="post" action=&quo ...
- 有关try..catch..finally处理异常的总结
//看一下下面的程序,你能正确的写出不同的testEx2()方法时,程序的最终打印出来的数据吗....先不要看下面的答案 public class ExceptionTest { public Exc ...
- 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...
- 面试准备 - 最大堆的Csharp实现
面试中最常见的问题之一...在N个数中间寻找前K大个元素 最常见的解法就是最大堆 时间复杂度O(N*log(K)) 空间复杂度O(k) 实现了一个最简单的最大堆,每次有元素进来都和堆顶元素比较一下,如 ...