目录
1. MQ简介:
2. JMS基本概念
2.1 P2P模型 - 打电话模型
2.2 Pub/Sub模型 - 订报纸模型
3. 支持JMS的开源MQ - ActiveMQ
首页 后端开发 php教程 JMS中的讯息通信模型

JMS中的讯息通信模型

Jun 13, 2016 pm 12:17 PM
link queue quot stomp

JMS中的消息通信模型

1. MQ简介:

JMS中的讯息通信模型

消息队列(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中消失了,所以一个消息只能被一个接收者消费。

JMS中的讯息通信模型

2.2 Pub/Sub模型 - 订报纸模型

与P2P模型不同,Pub/Sub模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。

JMS中的讯息通信模型

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

<code>//connection ActiveMQ    function openMQ(&$queue=FALSE) {    $amq = array(        &#39;url&#39; => &#39;tcp://127.0.0.1:61613&#39;,        &#39;id&#39; => &#39;xxx&#39;,        &#39;pswd&#39; => &#39;xxx&#39;,        &#39;queue&#39; => &#39;/queue/mytest&#39;,        &#39;enable&#39; => TRUE    );    $link = stomp_connect($amq[&#39;url&#39;], $amq[&#39;id&#39;], $amq[&#39;pswd&#39;]);    if (!$link) {        die("Can&#39;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[&#39;queue&#39;], $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[&#39;headers&#39;][&#39;message-id&#39;]);             } else {                //do something                break;                }            } else {                break;            }        }        stomp_unsubscribe($link, $queue);        stomp_close($link);    }    </code>
登录后复制

stomp_sender.php

<code>// 消息发送服务</code>
登录后复制

stomp_consumer.php

<code>// 消息消费服务</code>
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Laravel开发:如何使用Laravel Queue处理异步任务? Laravel开发:如何使用Laravel Queue处理异步任务? Jun 13, 2023 pm 08:32 PM

随着应用程序变得越来越复杂,处理和管理大量数据和流程是一个挑战。为了处理这种情况,Laravel为用户提供了一个非常强大的工具,即Laravel队列(Queue)。它允许开发人员在后台运行诸如发送电子邮件,生成PDF,处理图像剪裁等任务,而不会对用户界面产生任何影响。在这篇文章中,我们将深入研究如何使用Laravel队列。什么是LaravelQueue队列

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

多线程环境下Java Queue队列的安全性问题及解决方案 多线程环境下Java Queue队列的安全性问题及解决方案 Jan 13, 2024 pm 03:04 PM

JavaQueue队列在多线程环境下的安全性问题与解决方案引言:在多线程编程中,程序中的共享资源可能面临竞争条件,这可能导致数据的不一致性或者错误。在Java中,Queue队列是一种常用的数据结构,在多个线程同时操作队列的情况下,就存在安全性问题。本文将讨论JavaQueue队列在多线程环境下的安全性问题,并介绍几种解决方案,重点以代码示例的方式解释。一

Queue在Java中的应用 Queue在Java中的应用 Feb 18, 2024 pm 03:52 PM

Java中Queue的用法在Java中,Queue(队列)是一种常用的数据结构,它遵循先进先出(FIFO)原则。Queue可用于实现消息队列、任务调度等场景,能够很好地管理数据的排列和处理顺序。本文将介绍Queue的用法,并提供具体的代码示例。Queue的定义和常用方法在Java中,Queue是JavaCollectionsFramework中的一个接口

link和import的区别细说:分析它们有何不同? link和import的区别细说:分析它们有何不同? Jan 06, 2024 am 08:19 AM

深入解析:link与import的区别是什么?在开发网页或应用程序时,我们经常需要引入外部的CSS文件或JavaScript库来增强或定制我们的代码。在这个过程中,link和import是两种常用的方法。虽然它们的目的都是引入外部资源,但在具体的使用上存在一些区别。语法和位置:link:使用link标签将外部资源链接到HTML文件中,通常位于HTML文档的头

link标签和import有什么区别 link标签和import有什么区别 Aug 28, 2023 am 11:19 AM

link标签和import的区别有语法和用途、功能和特性、加载时机、兼容性和支持等。详细介绍:1、语法和用途,link标签是HTML标签,用于在HTML文档中引入外部资源,如CSS样式表、JavaScript脚本、图标等,import是ES6中的模块导入语法,用于在JavaScript文件中引入外部模块;2、功能和特性,link标签可以引入多种资源,如CSS样式表、图标等等。

import和link之间有哪些区别 import和link之间有哪些区别 Nov 24, 2023 pm 02:15 PM

import和link之间的区别:1、用途和语义;2、加载方式;3、兼容性;4、链接多个样式表;5、媒体类型;6、动态性;7、错误处理;8、嵌套;9、默认样式;10、兼容性考虑;11、性能考虑;12、使用场景。详细介绍:1、用途和语义,link是HTML标签,用于链接到外部的CSS文件或样式表,它通常位于HTML文档的head部分,import是CSS的一部分等等。

对比link和import:它们有哪些差异? 对比link和import:它们有哪些差异? Jan 06, 2024 pm 08:23 PM

link与import之争:它们有何不同之处?在开发和编程中,我们经常需要与其他文件或模块进行交互。为了实现这种交互,链接(linking)和导入(importing)是两种常用的方式。然而,许多人可能并不清楚link和import有什么不同之处以及何时使用它们。本文将详细介绍link和import的区别,并提供代码示例。首先,我们来了解link的概念。链接

See all articles