`
diecui1202
  • 浏览: 97925 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JMS规范之JMS消息

阅读更多

[注]:本文已在黄金档 上发布,原文链接见http://www.goldendoc.org/2011/08/jms_spec_message/

 

JMS ,即 Java Message Service ,它为 Java 应用程序提供了一种通用的用于创建、发送、接收以及读取消息的方式;

 

JMS 体系架构

1、 JMS Provider

面向消息中间件的, JMS 接口的一个实现。提供者可以是 Java 平台的 JMS 实现,也可以是非 Java 平台的面向消息中间件的适配器;

2、 JMS Client

生产或消费基于消息的 Java 的应用程序或对象;

3、 JMS Producer

创建并发送消息的 JMS Client

4、 JMS Consumer

接收消息的 JMS Client

5、 JMS Message

包括可以在 JMS Client 之间传递的数据的对象;

6、 JMS Queue

一个容纳那些被发送的等待阅读的消息的区域;
7 JMS Topic

一种支持发送消息给多个订阅者的机制;

 

JMS 消息

JMS 消息由以下三部分组成:

1 消息头 :所有消息的消息头都具体相同的字段,用于 JMS Client 以及 JMS Provider 对它们进行区别以及进行消息路由;

下面分别对几个重要的消息头字段及其作用和含义进行说明;

1) JMSDestination

消息发送的目的地(队列或主题);创建消息时可以设置 JMSDestination ,但是在发送完成时其值会更新为发送方所指定的 JMSDestination ,也就是说发送前该字段会被忽略;当消息被消费时,该字段的值与在它被发送时被设置的值是相同的;

如下面的例子(文中的例子都是基于 Apache Active MQ ):

 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建2个目的地
Destination destination = session.createQueue("JMS.DEMO");
Destination destination2 = session.createQueue("JMS.DEMO2");

// 创建生产者
MessageProducer publisher = session.createProducer(destination);

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);

// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 设置消息的目的地为destination2
message.setJMSDestination(destination2);

// 发送消息
publisher.send(message);

System.out.println(message.getJMSDestination());
 

代码中,通过 message.setJMSDestination(destination2); 设置了 message JMSDestination 消息头属性值,我们再看看其输出结果:

 

queue://JMS.DEMO
 

通过这个例子可以看出,虽然在发送前设置了消息的目的地,但是发送后消息的目的地被重置了;

 

2) JMSDeliveryMode

指明消息的传输模式,有两种:

DeliveryMode.PERSISTENT :保证消息仅传一次, JMS Provider 服务停止后消息不会丢失;

DeliveryMode.NON_PERSISTENT :消息最多传一次,消息会因 JMS Provider 停止后丢失;

JMSDestination 一样,在发送前设置的会被忽略;

看下面的例子:

 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");

// 创建生产者
MessageProducer publisher = session.createProducer(destination);

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 发送PERSISTENT消息
publisher.send(session.createTextMessage("PERSISTENT MESSAGE"));

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 发送PERSISTENT消息
publisher.send(session.createTextMessage("NON_PERSISTENT MESSAGE"));
 

例子中分别发送了一条 PERSISTENT 的消息和一条 NON_PERSISTENT 的消息;当 Active MQ 重启后,启动消费端,收到的消息如下:

 

PERSISTENT MESSAGE
 

该例子说明,在 JMS Provider 重启后, NON_PERSISTENT 消息丢失了,而 PERSISTENT 消息能正常被消费者消费;

 

3) JMSMessageID

JMS Provider 指定的消息的唯一标识符;同上面的字段一样,在发送前设置的会被忽略,在发送完成时,由 JMS Provider 重置该字段;

 

4) JMSReplyTo

发送端在发送消息时,可以指定该属性(为一个 JMSDestination ),表示期望收到客户端的响应;是否响应由消费端决定;

如下面的例子:

发送端:

 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
Destination destination2 = session.createQueue("JMS.DEMO3");

// 创建生产者
MessageProducer publisher = session.createProducer(destination);

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);

// 创建消息
TextMessage message = session.createTextMessage("Test Message");
message.setJMSReplyTo(destination2);
// 发送消息
publisher.send(message);
 

接收端(可以根据情况决定是否需要回复):

 

public void onMessage(Message message) {
    try {
        System.out.println("Receive message: " + message);
        if (message.getJMSReplyTo() != null) {
            session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This is a reply to"
                                                                                           + message.getJMSReplyTo()));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 

5) JMSRedelivered

当消费者收到带有 JMSRedelivered 的消息头时,表明该消息在过去传输过但没有被确认;

JMS Provider 必须对该字段进行设置,当为 true 时即告知消费者该消息是重传的,消费者需要自行处理重复的消息;

 

6) JMSExpiration

消息的过期时间,其值为当前时间加上存活时间(毫秒);当存活时间设置为 0 时,该字段的值也被设置为 0 ,表示永不过期;

消费端在一般情况下都不会接收到过期的消息,但 JMS Provider 并不保证这一点;

下面的例子说明了如何设置消息的过期时间:

 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");

// 创建生产者
MessageProducer publisher = session.createProducer(destination);

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);

// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 发送消息
publisher.setTimeToLive(5000);
publisher.send(message);
 

7) JMSPriority

消息的优先级, 0 代表最低优先级, 9 代表最高优先级;

一般 0~4 为普通优先级, 5~9 为加快优先级;

JMS 规范里并没有要求 JMS Provider 严格按这个优先级来实现,但是尽可能实现加快优先级消息的传输在普通消息的前面;

JMSDestination 一样,该字段在发送前被忽略,在发送完成时重置;

 

2 消息属性 :除了前面提到的消息头以外, JMS 消息还提供了对“属性值对”的支持,以对消息头进行扩展;消息属性主要用于消息选择器 (message selector 详见下文 )

1) 属性名:

属性名必须服务消息选择器的命名规则;

2) 属性值:

可以是基本类型及其对象类型以及 Map List String

下面的例子中,消息带 HashMap 的属性:

 

 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");

// 创建生产者
MessageProducer publisher = session.createProducer(destination);

// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);

// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 发送消息
message.setObjectProperty("myProp", new HashMap() {

    {
        this.put("key1", "value1");
        this.put("key2", "value2");
    }
});
publisher.send(message);
 

3) 清除属性:

JMS 不能清除单个属性,但可以通过 Message.clearProperties() 方法清除所有消息属性;

 

3 消息体 JMS 提供了 5 种类型的消息体:

1) StreamMessage :消息体是 Java 流,写入和读出都是顺序的;

2) MapMessage :消息体包含 key-value 对, key String value 为基本类型,可以通过迭代器访问;

3) TextMessage :消息体是 String

4) ObjectMessage :消息体是可序列化的 Java 对象;

5) BytesMessage :消息体是字节数组;

 

可以通过 message.clearBody() 来清除消息体;但在消费端,消息体是只读的,针对消息的写操作都会抛出 MessageNotWritableException 异常;

分享到:
评论

相关推荐

    JMS1.1规范(中文)

    JMS1.1规范是该API的一个版本,提供了标准接口,使得不同的消息中间件(Message Oriented Middleware,MOM)提供商能够实现互操作性,确保应用程序可以在不同平台之间无缝地发送和接收消息。 JMS1.1规范的核心概念...

    JMS规范1.1

    JMS规范中还定义了一些新的特性,它们包括对消息确认和选择机制的改进,以及对消息持久性和消息域继承方法的增强。例如,JMS1.1版本提供了更多控制消息选择器和消息确认选项的功能,使得开发人员可以更灵活地处理...

    jms规范2.0(中英文都有)

    JMS规范2.0版是这个领域的最新标准,它为开发者提供了在分布式环境中可靠地发送和接收消息的接口。这个压缩包包含了JMS 2.0的中英文文档以及相关的JavaDoc,有助于开发者深入理解和使用JMS API。 首先,我们来详细...

    JMS规范教程pdf

    通过以上解析,我们可以看到JMS规范教程详细介绍了JMS的基本概念、消息模型以及通用设施,为开发者提供了构建和理解JMS应用程序所需的关键知识。JMS不仅提供了消息传递的基础结构,还涵盖了消息的管理和控制,使得...

    JMS 规范(英文)

    ### JMS规范详解 ...总之,JMS规范为Java开发者提供了一套强大且灵活的消息处理框架,极大地促进了分布式系统的构建和优化。无论是初学者还是有经验的开发人员,深入理解JMS规范都是提高项目效率和质量的关键。

    JMS规范PDF

    综上所述,JMS规范1.1(中文版)详细阐述了Java消息服务的核心概念、架构设计、接口定义及其实现方式。对于Java开发者而言,理解JMS的基本原理和应用场景对于构建高效、可靠的企业级应用至关重要。

    JMS规范教程(中文)

    JMS消息模型是整个JMS规范的核心,它定义了消息的结构、消息头、消息属性、消息类型和消息体等。JMS消息的头部字段可以包含目的地、消息ID、时间戳、相关ID等信息。消息属性则提供了一个键值对的方式,让客户端可以...

    activemq中间件视频 jms规范

    通过这个视频系列,你不仅能够掌握ActiveMQ的基本操作,还能深入理解JMS规范,从而在实际项目中更有效地利用消息中间件进行解耦和异步通信。此外,了解ActiveMQ的性能调优和故障排查技巧也是提升系统稳定性的关键,...

    JMS规范培训教程

    SUN MQ(Sun Microsystems的Message Queue)是早期支持JMS规范的实现之一,现已被Oracle集成到WebLogic Server中。 **JMS核心概念** 1. **消息(Message)**:JMS中的基本传输单元,包含发送者想要传递的数据。...

    JMS规范培训教程 中文版

    在JMS规范中,消息服务器通常被称为消息代理或消息队列,例如ActiveMQ、RabbitMQ和IBM WebSphere MQ等。这些代理提供了对消息存储、路由和传输的支持。消息队列(Queue)和主题(Topic)是JMS中的关键组件。队列遵循...

    JMS标准规范培训教程

    《JMS规范培训教程》这份文档很可能是深入理解JMS标准和实际应用的指南,它可能涵盖了JMS的基本概念、API用法、消息模型的比较、事务处理、消息持久化、故障恢复策略等内容。通过学习这份教程,开发者能够熟练地在...

    JMS消息模型 JMS学习.doc

    JMS规范由JavaSoft(现为Oracle公司的一部分)制定,目的是促进不同消息中间件(MOM,Message-Oriented Middleware)之间的互操作性。MOM通过数据消息的传递,使得不同系统之间能够高效地进行通信,抽象了通信传输...

    JMS消息队列机制及案例

    在实际应用中,开发者可以结合ActiveMQ的特性和JMS规范,构建高效、可靠的分布式消息系统,解决系统间的同步问题,提升系统性能和稳定性。通过深入理解和实践,我们可以掌握如何利用JMS和ActiveMQ实现异步处理、系统...

    weblogic中使用JMS发送和接受消息

    WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持Java Message Service (JMS) 规范,允许在分布式环境中可靠地发送和接收消息。JMS是Java平台上的标准接口,用于实现应用程序间的异步通信。本文将...

    javax.jms包,sun的JMS接口规范包

    `javax.jms`包是JMS规范的核心部分,包含了各种与消息传递相关的接口和类,这些接口和类为开发人员提供了一种在分布式环境中进行异步通信的标准方式。 1. **JMS接口**:`javax.jms`包中定义了几个关键接口,包括`...

    JMS规范教程.docx

    总之,JMS规范是构建可扩展、健壮的分布式系统的关键工具,通过提供统一的消息接口,促进了不同系统之间的无缝通信。理解并熟练运用JMS的原理和实践,对于Java开发者在企业级应用开发中是至关重要的。

    《JMS 1.1 规范》-电子文档下载(PDF)(中文)

    作者:卫建军 Java 是当前 IT 领域中比较流行的技术之一。J2EE 是当前比较流行的企业级应用架构。 本人一直致力于 J2EE 架构的学习和研究,但是总是对英文文档...持久化规范》和《JMS1.1 规范》。希望对大家有所帮助。

Global site tag (gtag.js) - Google Analytics