消息队列-OPEN MQ

Posted 小鹏_戛然而止

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列-OPEN MQ相关的知识,希望对你有一定的参考价值。

Java 消息服务 (JMS) API 是一种消息传递标准,它允许基于 Java 平台企业版 (Java EE) 的应用程序组件创建、发送、接收和读取消息。它支持松散耦合、可靠和异步的分布式通信。

是一种中间件,rabibt MQ, kafka相似。使用起来直接可以引用pom文件里,进行消息发送与接收。

打开消息队列 - 快速入门

此页面简要概述了 Open MQ 的主要功能

Open MQ 实现了可靠的消息传递机制,允许您的应用程序集成在一起,而无需依赖同步通信,并在消息生产者和消息消费者之间提供缓冲。Open MQ 提供了一个统一的构建块,可实现异步、松散耦合的集成,并提供用于管理、控制和监视的通用框架。

Open Message Queue 是一个功能齐全的面向消息的中间件 (MOM),消息服务器。Open MQ 实现了 Java 消息服务 (JMS) API 并提供企业级功能,例如:

  • 企业系统组件之间松散耦合的消息传递
  • 消息服务器的可扩展分布(代理集群)
  • 集成 SOAP/HTTP 消息传递
  • 可扩展的 JCA 1.5 兼容资源适配器
  • 企业管理功能
  • 广泛的 JMX 支持(

    Java 管理扩展JMX ) 是一种Java技术,它提供用于管理和监视应用程序、系统对象、设备(例如打印机)和面向服务的网络的工具。这些资源由称为 MBean(对于Managed Bean)的对象表示在 API 中,可以动态加载和实例化。可以使用 Java 动态管理工具包来设计和开发管理和监控应用程序。[1]

    JSR 003 [2]所述的Java社区定义JMX 1.0,1.1和1.2。JMX 2.0 是在 JSR 255 下开发的,但此 JSR 随后被撤回。[3]用于远程管理和监控的 JMX 远程 API 1.0 由 JSR 160 指定。[4]用于 Web 服务的 JMX 远程 API 的扩展正在 JSR 262 下开发。[5]

    由早期采用J2EE社区,JMX一直一部分J2SE自5.0版本。“JMX”是甲骨文公司的商标

此处提供更完整的功能列表

为什么要使用消息队列?

与应用程序之间的直接集成相比,面向消息的集成具有一些优势。首先,这允许消息传递基础结构作为主要系统组件之间的缓冲区运行。此外,消息传递可以提供一种机制,通过该机制您可以与不同的系统组件集合进行通信,而不必了解这些组件的详细信息。由于在连接的应用程序之间有一个完整的缓冲区,这些系统中的每一个都可以按自己的节奏运行,而消息传递基础设施可以以生产速度吸收消息,而它们可以以消费者能够处理这些消息的任何速率被消耗。

消息传递与 API 调用有着根本的不同,因为您的应用程序无法知道通信链路另一端的应用程序何时将接收该消息并执行该消息所暗示的任何操作。它本质上是异步的。需要紧密耦合的应用程序可能不是 MOM 中介的最佳选择。系统之间的所有操作都被抽象为一组消息,这些消息通过 JMS 服务器进行交换,作为应用程序端点之间的中介。仅仅因为应用程序是异步的,并不意味着它不能具有高吞吐量。事实上,已经实现了许多以非常高的消息交换速率执行的应用程序。

MQ 可以确保消息以正确的顺序进行操作,如果有任何交付问题,基础设施可以确定地知道最终的交付处置是什么(成功或失败)。

打开MQ安装

有几个选项可供您使用。最简单的方法是下载 GUI 安装程序包并按照安装应用程序中的说明进行操作。如果您想下载较小的软件包,您可以下载软件包存档——无需安装程序。我们称之为“基于文件”的安装。这将简单地在您选择的任何地方打开产品包装。然后,您可以运行安装脚本来配置 Open MQ 以用于最一般的使用类型。

如果您想从源代码开始,您需要一份 NetBeans(或一个配备齐全的 IDE)。我们提供了构建和运行简单测试应用程序的说明,以验证您构建的内容是否正确构建。有关如何获取此包的说明,请参阅 [下载页面](/openmq/Downloads.html)

开放式 MQ 架构和系统组件

这是一个框图,可让您了解 Open MQ 的主要系统组件

 

 

打开 MQ 消息代理

Message Brokers是 Open MQ 的基本work-horses。这些服务器端应用程序管理正在生成和使用消息的客户端之间的所有消息交换。消息代理负责管理消息目的地的集合。客户端可以向消息目的地生成消息或从消息目的地消费消息。消息目的地可以配置为消息队列或主题目的地。当您希望以精确的顺​​序处理消息以及需要确保交付得到保证时,可以使用队列。主题目的地在“发布和订阅”消息传递中很有用。Pub-Sub 消息传递对于将消息分发给多个消费者很有用(尽管没有理由不能只有一个消费者)。而消息“队列”

代理可以“集群”以实现服务和数据冗余。消息代理集群管理“集群节点”之间的内部簿记,以确保遵循交付规则。

打开 MQ 管理

Open MQ 提供了一个简单的内置管理 GUI。此用户界面提供常见任务,例如启动和停止消息队列代理、创建目标和简单任务。对于更复杂的应用程序,我们提供了丰富的 Java 管理扩展 (JMX) API。通过 JMX API,您几乎可以监视和管理 Open MQ 系统的任何方面。此外,您可以通过此 API 开发自己的管理控件。如果您的项目包括 Java Enterprise System,那么 Java Enterprise System Monitoring Framework 可用于 Open MQ。同样,Java Composite Application Suite —— 和 GlassFish Server 应用服务器也使用 JMX API 来控制和管理 Open MQ 操作。

打开 MQ 消息存储选项

Open MQ 支持两种基本类型的消息存储。您可以使用嵌入式“文件存储”,也可以使用 JDBC 数据源。如果您不对默认设置进行更改,则使用嵌入式文件存储。这针对与开放式 MQ 一起使用进行了优化,并且在大多数应用程序中将为您提供最高的系统性能。每个 Open MQ Broker 管理自己的文件存储。使用嵌入式文件存储时有一些用于消息分发的工具,但是,在代理失败的情况下,这些工具不能提供持续的可用性。

许多站点更喜欢使用基于 SQL 的公共数据存储层。对于这些站点,Open MQ 通过 JDBC 支持数据库。JDBC 没有为 Messaging 使用提供高水平的优化。此外,所有可用的优化都必须在数据库中实现,作为该产品管理实用程序的一部分。通常,在使用嵌入式文件存储时,您可以期待更高的初始吞吐量。

为了高可靠性和高可用的使用,必须使用高可用的JDBC数据库。Open MQ 使用 jdbc 数据库来存储数据,它实现了一个低容量的代理到代理通信协议来解决任何不适合数据库内的运行时操作问题。可以将 Open MQ 配置为与任何 JDBC 数据库一起使用 HA,但为了获得最大可用性,您需要使用具有故障恢复能力的数据库进行部署,并提供完整的内部数据一致性和冗余。示例 HA 数据库包括: HADB——包含在 Oracle GlassFish Server(又名 Sun Java System Application Server 9.1)中的 JDBC 数据存储;mysql 集群版(带 ndb 存储);和甲骨文。

打开 MQ Java 客户端

Open MQ 为开发 Java 应用程序提供了丰富的客户端 API。如果您正在编写独立应用程序,您可以通过 Java 客户端 API 直接与 Open MQ 集成。API 太丰富了,无法在此详述。安装产品时,它包含完整的 javadoc。而且,您可以阅读 MQ文档集中的详尽手册对于所有文档的索引,您还可以浏览到 [下载页面](/openmq/Downloads.html) 的文档部分。

打开 MQ C 客户端

许多项目希望与基于 C 的客户端交互。对于 C 语言,对于 JMS,没有标准。这已经被讨论为一种可能的扩展,但到目前为止,还没有采取任何坚定的行动来创建 C 标准。因此,每个产品都有一个稍微独特的 c-api,它们用来模拟Java JMS 标准。同样,在这里记录太丰富了。您应该阅读 MQ文档集合中提供的 c-api 程序员指南,或通过 Open MQ [下载页面](/openmq/Downloads.html) 上的链接。

通过 HTTP 打开 MQ JMS

您可以使用 Open MQ 通过 HTTP 直接使用 JMS。这允许您使用跨越传统防火墙的远程客户端。这在Java Client Developers Guide 的第 5 章“使用 SOAP 消息”中有详细说明

产品手册

我们有大量的手册来描述这些概念以及更多内容。从 MQ 4.4 更新 2 开始,所有 MQ 文档现在都包含在相关的 GlassFish Server 文档中。GlassFish 3.0.1 文档可在此处获得可以在此链接中找到所有先前版本的旧文档

如果您不熟悉 JMS 消息传递,您可能需要阅读概述指南以了解产品。您可以与管理员联系。概述和快速入门教程,在管理指南的第 1 部分,MQ 管理简介——它将指导您完成基本的管理功能,然后是一个教程。之后,您可能会发现MQ 技术概述对于规划和组织您希望如何处理 JMS 项目很有用。

本网站的其他地方也有许多提示和提示。

包含开放消息队列的产品

Open Message Queue 已集成到多个社区和商业类产品中。它是 Project GlassFish 的 Java EE Java Message Service (JMS) 提供程序,也是 Java Platform, Enterprise Edition 的参考实现 JMS Provider。

如果您对使用受支持的 Open Message Queue 版本感兴趣,您应该查看Oracle GlassFish Server 产品页面Sun Microsystems 可提供试用版下载和服务合同。请记住,商业类产品中的功能可能与 Open MQ 有所不同。

Oracle GlassFish Server -- 包括您可以购买支持合同的 Open Message Queue 的商业版本
如有错误,恳求读者指出,发送到wu13213786609@outlook.com。

POSIX的IPC方式:消息队列共享内存


POSIX IPC名字限定:

  • 必须以/打头,并且后续不能有其它/,形如/somename;
  • 长度不能超过NAME_MAX

1. POSIX 消息队列

#include <mqueue.h>

mq_open 函数

功能:用来创建和访问一个消息队列

原型:
- mqd_t mq_open(const char *name, int oflag);
- mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);

参数:
- name:某个消息队列的名字;
- oflag:与open函数类似,可以是O_RDONLY、O_WRONLY、O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_NONBLOCK等;
- mode:如果oflag指定了O_CREAT,需要设置mode;

返回值:成功返回消息队列文件描述符;失败返回-1

POSIX消息队列创建在虚拟文件系统中,可使用如下命令将消息队列挂载到根目录上:

  • mkdir /dev/mqueue,创建挂载点;
  • mount -t mqueue none /dev/mqueue,将消息队列挂载至该目录;
  • cat /dev/mqueue/mymq,查看消息队列状态;

具体的POSIX message queue相关的概述见man 7 mq_overview


mq_close/mq_unlink 函数

功能:关闭消息队列

原型:
- mqd_t mq_close(mqd_t mqdes);

参数:
- mqdes:消息队列描述符;

返回值:成功返回0,失败返回-1
功能:删除消息队列

原型:
- mqd_t mq_unlink(const char *name);

参数:
- name:消息队列名字

返回值:成功返回0,失败返回-1

mq_getattr/mq_setattr 函数


功能:获取/设置消息队列属性

原型:
- mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);
- mqd_t mq_setattr(mqd_t mqsed, struct mq_attr *newattr, struct mq_attr *oldattr);

返回值:成功返回0,失败返回-1

mq_send/mq_receive 函数

mq_send
mq_receive

mq_notify 函数

mq_notify
mq_notify注意点,类似于linux的信号机制


2. POSIX 共享内存

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

具体的POSIX message queue相关的概述见man 7 shm_overview


shm_open/ftruncate 函数

shm_open
ftruncate

共享内存也需要挂载到根目录树上才能够进行查看,共享内存的挂载点和挂载操作由系统自动完成,挂载在/dev/shm目录下了。


fstat/shm_unlink/mmap 函数

fstat
shm_unlink
mmap
mmap内容见:[mmap()共享内存详解](https://blog.csdn.net/yueguangmuyu/article/details/118256035)

以上是关于消息队列-OPEN MQ的主要内容,如果未能解决你的问题,请参考以下文章

POSIX的IPC方式:消息队列共享内存

消息队列 mq 发送错误。错误的文件描述符

POSIX 中的消息队列

mq消息队列永远不清理吗

消息队列(mq)是啥?

消息队列(mq)是啥?