深入剖析一条JMS消息(消息头)

一个Message对象有3个部分:消息头,消息属性,最后就是消息数据自身,它称为有效负载或消息体。消息能够携带重要的数据或仅仅用于系统中的事件通知。在大多数情况下,消息同时作为通知和携带数据的工具。下面我们先来说说消息头。

每条JMS消息都有一组标准的消息头。每个消息头都由一组取值函数和赋值函数方法所标识,这些方法名称紧跟在术setJMS<HEADER>(),getJMS<HEADER>()之后。下面是一个Message接口的部分定义,它显示了JMS消息头使用的所有方法:

public interface Message {
    public Destination getJMSDestination() throws JMSException;
    public void setJMSDestination(Destination destination) throws JMSException;
    public int getJMSDeliveryMode() throws JMSException
    public void setJMSDeliveryMode(int deliveryMode) throws JMSException;
    public String getJMSMessageID() throws JMSException;
    public void setJMSMessageID(String id) throws JMSException;
    public long getJMSTimestamp() throws JMSException‘
    public void setJMSTimestamp(long timestamp) throws JMSException;
    public long getJMSExpiration() throws JMSException;
    public void setJMSExpiration(long expiration) throws JMSException;
    public boolean getJMSRedelivered() throws JMSException;
    public void setJMSRedelivered(boolean redelivered) throws JMSException;
    public int getJMSPriority() throws JMSException;
    public void setJMSPriority(int priority) throws JMSException;
    public Destination getJMSReplyTo() throws JMSException;
    public void setJMSReplyTo(Destination replyTo) throws JMSException;
    public String getJMScorrelationID() throws JMSException;
    public void setJMSCorrelationID(String correlationID) throws JMSException;
    public byte[] getJMSCorrelationIDAsBytes() throws JMSException;
    public void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException;
    public String getJMSType() throws JMSException;
    public void setJMSType(String type) throws JMSException;
}

JMS消息头可以分为两大类:自动分配的消息头和开发者分配的消息头。

1. 自动分配的消息头

大多数JMS消息头是自动分配的,在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用setJMS<HEADER>()方法分配的值就被忽略了。换句话说,对于大多数自动分配的消息头来说,使用赋值函数方法显然是徒劳的。不过,这并非意味着开发者无法控制这些消息头的值。一些自动分配的消息头可以在创建Session和MessageProducer(也就是TopicPublisher)时,由开发者通过编程方式来设置。这样的例子有JMSDeliveryMode和JMSPriority消息头,它们在随后的消息头定义中会有所解释。

JMSDeliveryMode

在JMS中,传送模式有两种类型:持久性模式和非持久性模式。一条持久性消息应该被传送“一次而且仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失; 它会在服务器恢复正常之后再次传送。一条非持久性消息最多只会传送一次,这意味着如果JMS提供者出现故障,该消息可能会永久丢失。在持久性和非持久性这两种传送模式中,消息服务器都不会将一条消息向同一消息者发送一次以上。

int deliverymode = message.getJMSDeliveryMode();
if(deliverymode = javax.jms.DeliveryMode.PERSISTENT) {        //持久化
    ......
}else {    //DeliveryMode.NON_PERSISTENT    非持久化
    ......
}

传送模式可以使用生产者(也就是 TopicPublisher 或 QueueSender)上的setJMSDeliveryMode()方法来设定。一旦为MessageProducer设置了传送模式,它就会应用到使用该生产者传送的所有消息上。默认设置为PERSISTENT(持久性):

//在消息生产者上设置JMS传送模式
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPubiisher.setDeliveryMode(DeliverMode.NON_PERSISTENT);
时间: 2024-08-26 22:49:45

深入剖析一条JMS消息(消息头)的相关文章

JMS(Java消息服务)入门教程

阅读目录 什么是Java消息服务 为什么需要JMS JMS的优势 JMS消息传送模型 接收消息 JMS编程接口 JMS消息结构 JMS使用示例 译文链接(做了部分修改~~) 什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务连接起来,可以达到解耦的效果,我

Spring整合JMS(二)——消息监听器

消息监听器 在Spring整合JMS的应用中我们在定义消息监听器的时候一共能够定义三种类型的消息监听器,各自是MessageListener.SessionAwareMessageListener和MessageListenerAdapter. 以下就分别来介绍一下这几种类型的差别. MessageListener MessageListener是最原始的消息监听器.它是JMS规范中定义的一个接口.当中定义了一个用于处理接收到的消息的onMessage方法,该方法仅仅接收一个Message參数.

JMS异步消息解决分布式应用的EhCache缓存同步问题

上篇博客中讲到了怎样用拦截器给用EJB发布的WebService添加缓存,这样可以提高WebService的响应效率.可是即使是这样做,还是要经历网络的传输的.于是决定在调用WebService的程序本地也添加EJB方法缓存,如果WebService调用的结果已经存在于本地缓存中,就直接从内存中拿数据,不用再访问WebService了. 架构图如下所示 但是另一个问题又出现了,那就是WebService中的缓存和客户程序本地缓存的同步问题,这个问题可以具体描述如下: 当提供WebService的

基于JMS的消息传送

简单的介绍下基于JMS的消息传送 Java消息队列JMS整体设计结构 基本要素:生产者(producer),消费者(consumere),消息服务(broker) 交互模型: JMS两种消息传送模式 点对点(Point-to-Point):专门用于使用队列Queue传送消息: 发布/订阅(Publish/Subscribe):专门用于使用主题Topic传送消息 两种传送方式比较 基于队列Queue的点对点消息只能被一个消费者消费,如多个消费者都注册到同一个消息队列上,当生产者发送一条消息后,而只

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

在本篇文章中,我们将讨论WCF四大契约(服务契约.数据契约.消息契约和错误契约)之一的消息契约(Message Contract).服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系. 我们知道只有可序列化的对象才能通过服务调用在客户端和服务端之间进行传递.到目前为止,我们知道的可序列化类型有两种:一种是应用了System.SerializableAttribute特性或者实现了System.Runtime.Serializat

JMS - 事务性消息

JMS 事务遵从发送操作与接收操作相互分离的约定.下图显示的是一个事务性发送,其中一组消息要么能够保证全部到达消息服务器,要么连一条消息也不能保证到达消息服务器.从发送者的角度来看,JMS 提供者为这组消息提供了高速缓存,直到执行 commit() 为止.如果发生了故障,或者执行了 rollback(),这些消息就会丢弃.在一个事务中传送给消息服务器的消息,它并不会转发给消费者,知道该生产者提交该事务为止. 生产者在会话上发布 commit() 之前,JMS 提供者不会开始向它的消费者传送消息,

JMS(java消息服务)整合Spring项目案例

转载自云栖社区 摘要: Sprng-jms消息服务小项目 所需的包: spring的基础包 spring-jms-xx包 spring-message–xx包 commons-collection-xx包 commons-pool2-xx包 aop切面的包: spring-aop,spring-aspect... Sprng-jms消息服务小项目 所需的包: spring的基础包 spring-jms-xx包 spring-message–xx包 commons-collection-xx包 c

干货--JMS(java消息服务)整合Spring项目案例

Sprng-jms消息服务小项目 所需的包: spring的基础包 spring-jms-xx包 spring-message–xx包 commons-collection-xx包 commons-pool2-xx包 aop切面的包: spring-aop,spring-aspect,aopalliance,aspectjrt.jar,aspectjweaver.jar 配置: 1.配置ConnectionFactory 2.配置jmsTemplate; 3.配置Destination 4.配置

Effective Objective-C 2.0 — 第12条:理解消息转发机制

11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制, 若对象无法响应某个选择子,则进入消息转发流程. 1,通过运行期的动态方法解析功能,可以在需要用到某个方法时再将其加入类中. 2,对象可以把其无法解读的某些选择子转交给其他对象来处理. 经过上述两步之后,如果还是没办法处理选择子,那就启动完整的消息转发机制. 动态方法解析 对象在收到无法解读的消息之后,首先调用其所属类的下列类方法 + (BOOL)