JMS 教程 - Java 消息服务教程

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(324)   2023-06-26 07:54:18

Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。

JMS 提供了创建、发送和阅读消息的工具。 JMS API 减少了程序员使用消息服务/产品必须学习的概念,还提供了支持消息应用程序的功能。

JMS 有助于以松散耦合的方式在两个或多个应用程序之间建立通信。这意味着必须通信的应用程序不是直接连接的,而是通过一个共同的目的地连接的。

1. 为什么我们需要 JMS?

当一个应用程序想要以两个应用程序彼此不知道的方式向另一个应用程序发送消息时;甚至它们可能不会部署在同一台服务器上。

例如,一个应用程序 A 在印度运行,另一个应用程序 B 在美国运行,A 有兴趣向 B 发送一些更新/消息——每当 A 上发生特殊情况时。可能有 N 个这样的应用程序是对 B 的此类更新感兴趣。

在这种情况下,Java 以 JMS 的形式提供了一种解决方案——并解决了上面讨论的完全相同的问题。

当我们编写任何基于事件的应用程序(例如 聊天服务器)时,JMS 也很有用需要一个发布事件机制来在服务器和客户端之间发送消息。

请注意,JMS 与 RMI 不同,因此在发送消息时不需要目标对象在线可用。发布者发布消息并忘记它,每当接收者上线时,它将获取消息。对于当今世界非常普遍的问题,这是一个非常强大的解决方案。

2. JMS 的好处

2.1.异步

JMS 默认是异步的。因此,要接收消息,客户端不需要发起通信。消息将在可用时自动到达客户端。

2.2. 可靠

JMS 提供了确保消息将被传递一次且仅一次的设施。我们知道重复的消息会产生问题。 JMS 可以帮助您避免此类问题。

3. JMS 消息域

甚至在 JMS API 出现之前,大多数消息传递产品都支持点对点发布/订阅 消息传递方法。 JMS 还为这两种方法中的每一种提供了一个单独的域,并为每个域定义了合规性。

任何 JMS 提供者都可以实现两个域或一个域,这是他自己的选择。 JMS 提供了公共接口,使我们能够以不特定于任何域的方式使用 JMS API。

让我们更详细地了解这两种类型的消息传递域,以了解JMS 的工作原理

3.1.点对点消息传递

在点对点消息传递 域应用程序建立在消息队列、发送者和接收者的基础上。

每条消息都发送到特定的 队列。队列保留所有发送给它们的消息,直到消息被消耗或过期。

PTP消息传递有一些特点:

  1. 每条消息只有一个客户端。
  2. 消息的发送者和接收者没有时间依赖性。
  3. 接收方可以在发送方发送消息时获取消息,无论其是否正在运行。
  4. 接收方收到消息后发送确认。

点对点JMS 消息传递 <图解说明> 点对点 JMS 消息传递

3.2.发布/订阅消息

在发布/订阅消息域中,仅发布一条消息,通过 Topic 用作公告板。

发布者和订阅者一般都是匿名的,可以动态发布或订阅主题。主题负责保存和传递消息。只要将消息分发给当前客户端,主题就会保留消息。

一些特点是:

  1. 一条消息可以有多个订阅者。
  2. 发布者和订阅者具有时间依赖性。订阅主题的客户端只能使用在客户端创建订阅后发布的消息,并且订阅者必须继续处于活动状态才能使用消息。

发布订阅 JMS 消息传递 <图解说明> 发布订阅 JMS 消息传递

阅读更多:HornetQ 基本示例

4.接收消息

在JMS中,消息消费有两种方式:

4.1.同步

在同步消息消费中,订阅者/接收者通过调用 receive() 方法。

receive() 方法将阻塞直到消息到达,或者如果消息没有在给定时间内到达则超时。就像带有一些返回值的普通 java 方法调用一样。

4.2.异步

在异步消息消费中,订阅者可以注册(或订阅)为消费者的消息监听器

消息侦听器与事件侦听器相同,只要消息到达目的地,JMS 提供程序就会通过调用侦听器的 onMessage() 方法将作用于内容消息。

5. JMS 参与对象

JMS 应用程序有一些基本的构建块,它们是:

  1. 管理的对象——连接工厂和目的地
  2. 连接
  3. 会议
  4. 消息生产者
  5. 消息消费者
  6. 消息监听器

JMS API 编程模型 <图解说明> JMS API 编程模型

5.1. JMS 管理对象

JMS 应用程序提供两种类型的管理对象:

  • 连接工厂
  • 目的地

这两个管理对象是由 JMS 系统管理员在 JMS Provider 中使用 Application Server 管理控制台创建的。这两个对象都存储在应用程序服务器 JNDI 目录或 JNDI 注册表中。

5.2.连接工厂

客户端使用的对象是 连接工厂 用于创建与提供者的连接。它在 JMS 提供者和 JMS 客户端之间创建连接。

当发送者或接收者等 JMS 客户端在 JNDI 注册表中搜索此对象时,JMS 客户端将收到一个连接对象,该对象只是 JMS 提供者和 JMS 客户端之间的物理连接。使用此连接,客户端可以与目标对象进行通信,以将消息发送或接收到队列或主题中。

让我们举个例子来理解它发送消息:

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");
Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");
Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

5.3.目的地

客户端使用一个称为目标的对象,该对象用于指定它生成的消息的目标以及使用它的消息源。

JMS 应用程序使用两种类型的目的地:

  • Queue
  • Topic

创建队列或主题的代码示例:

创建队列会话

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);  //get the Queue object
Queue t = (Queue) ctx.lookup ("myQueue");  //create QueueReceiver
QueueReceiver receiver = ses.createReceiver(t);

创建主题会话

TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object
Topic t = (Topic) ctx.lookup ("myTopic");  //create TopicSubscriber
TopicSubscriber receiver = ses.createSubscriber(t);

5.4. JMS连接

该连接封装了与 JMS 提供程序的虚拟连接。连接实现了 Connection 接口,当它有一个 ConnectionFactory 对象时,我们就可以使用它来创建连接。

Connection connection = connectionFactory.createConnection();

5.5. JMS会话

session 是一个单一的- 用于生成和使用消息的线程上下文。

这些会话用于创建以下内容:

  • 消息生产者
  • 消息消费者

会话实现会话接口,在创建连接对象后,我们使用它来创建会话。

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

5.6.消息生产者

消息生产者是由会话创建的对象,用于将消息发送到目的地。这实现了 MessageProducer接口。

我们使用 Session 为目标、队列或主题对象创建一个 MessageProducer

MessageProducer producer = session.createProducer(dest);
MessageProducer producer = session.createProducer(queue);
MessageProducer producer = session.createProducer(topic);

5.7.消息消费者

消息使用者是由会话创建的对象,用于接收在目的地发送的消息。它将实现 MessageConsumer< /a> 接口。

我们使用会话为目的地、队列或主题对象创建 MessageConsumer。

MessageConsumer consumer = session.createConsumer(dest);
MessageConsumer consumer = session.createConsumer(queue);
MessageConsumer consumer = session.createConsumer(topic);

5.8.消息监听器

消息侦听器是充当消息的异步事件处理程序的对象。消息侦听器实现 MessageListener 接口,该接口包含一个方法 onMessage()

onMessage() 方法中,我们定义了消息到达时要执行的操作。通过使用 setMessageListener(),我们定义了具有特定 MessageConsumer 的消息侦听器。

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

6.消息组件

JMS 客户端使用 JMS 消息在系统之间进行通信。 JMS 消息格式简单但非常灵活,允许创建匹配不同格式的消息。

JMS消息分为三部分:

6.1. 消息头

JMS 消息头包含预定义字段的数量,这些预定义字段包含客户端和提供者用来识别和发送消息的那些值。预定义的标头是:

– JMSDestination – JMSDeliveryMode – JMSMessageID – JMSTimestamp – JMSCorrelationID – JMSReplyTo – JMSRedelivered – JMSType – JMSExpiration – JMSPriority

6.2.消息属性

在消息属性中,我们可以创建和设置消息的属性。消息属性是由应用程序设置或读取的自定义名称值对。消息属性对于支持过滤消息很有用。 JMS API 提供了提供者可以支持的一些预定义属性。消息属性是可选的。

6.3. 消息正文

在消息体中,JMS API 定义了五种消息体格式,也称为消息类型,允许我们以多种不同的形式发送和接收数据,并提供与现有的兼容性消息格式。它基本上由从 JMS 发送方发送到接收方的实际消息组成。

不同的消息类型是:

  • 文本:由javax.jms.TextMessage 表示。它用于表示一段文本。

  • 对象:由 javax.jms.ObjectMessage 表示。它用于表示一个java对象。

  • 字节数:由 javax.jms.BytesMessage 表示。用于表示二进制数据。

  • Stream:由 javax.jms.StreamMessage 表示。它用于表示 java 原始值列表。

  • 地图:由javax.jms.MapMessage 表示。它用于表示一组关键字或值对

这就是 JMS 介绍教程及其相关术语的全部内容。在下一组帖子中。我们将看到一些 JMS 示例。

快乐学习!!

标签2: JMS Java消息
地址:https://www.cundage.com/article/jms-java-message-service-tutorial.html

相关阅读

Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
在JMS 教程 中,您了解了 JMS 消息传递域点对点域和发布订阅域。在本例中,我们将通过一个这样的发布/订阅消息域示例。发布/订阅消息传递域是一种一对多模型,其中一个发布者通过 topic 将...
JMS
Java消息系统 在本文中,我将讨论面向消息的中间件 (MOM) 以及它是如何通过 JMS 在 Enterprise Java 中实现的。此外,我将讨论适合使用 JMS 的典型用例和用于讨论消息...
HornetQ是一个开源项目,构建多协议,可嵌入,非常高性能、集群、异步消息系统。 HornetQ 支持 JMS 1.1 API 并且还定义了自己的消息传递 API 以实现最佳性能和灵活性。 H...
有时需要将不同的消息代理连接在一起。在 Enterprise Messaging 中,这种情况称为桥接。它可以通过 JMS 和不同的协议(如 AMQP、ActiveMQ Artemis 核心协议...
HornetQ是一个开源项目,构建多协议,可嵌入,非常高性能、集群、异步消息系统。 HornetQ 支持 JMS 1.1 API 并且还定义了自己的消息传递 API 以实现最佳性能和灵活性。 H...
Oracle 推出了一项企业服务来帮助管理爪哇 运行时和应用程序,无论是在本地还是在任何云上。 称为 Java 管理服务 (JMS) 的 Oracle 云基础设施 (OCI) 本机服务于 6 月...
从历史上看,Apache ActiveMQ 消息代理最初是在大消息以 MB 为单位而不是像今天那样以 GB 为单位的时代创建的。 下一代代理 Apache ActiveMQ Artemis(或只...
昨天我做了一个演讲,讨论了使用消息队列的所有方面。我之前写过“你可能不需要消息队列”——现在总结有点微妙,但我仍然支持简单性论点。 该演讲介绍了使用消息队列的各种好处和用例,并讨论了典型“消息队...
HornetQ是一个开源项目,构建多协议,可嵌入,非常高性能、集群、异步消息系统。到目前为止,我们已经了解了配置 hornetq 独立服务器和设置基本消息传递功能的示例。 HornetQ 具有很...