JMS消息服务器——Message消息分析(1)

一.Message结构

Message消息是整个JMS规范最为重要的部分。一个JMS应用程序中的所有数据和事件都是使用消息进行通信的,同时JMS的其余部分也都在为消息传输服务。因此可以说,消息时一个系统的命脉所在。

一个Message对象有3个部分:消息头消息属性,最后就是消息数据内容,它称为负载或消息体

二.消息头

每条JMS消息都有一组标准的消息头。每个消息头都由一组取值函数和赋值函数所标识。这些方法名称紧随在术语setJMS**(),getJMS**()方法之后。如下图:

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

2.1 自动分配的消息头

属性 说明 方法(get)
JMSDestination 使用一个Topic或Queue对象来标识目的地,二者都是Destination类型 public abstract Destination getJMSDestination()
JMSDeliveryMode 消息传送送模式有两种类型:持久性模式和非持久性模式 public abstract int getJMSDeliveryMode()
JMSMessageID 它是一个String类型的值,唯一标识了一条消息。JMSMessageID对于JMS中消费者应用程序的历史仓库来说非常有用,它是仓库中的消息需要的唯一索引。 public abstract String getJMSMessageID()
JMSTimestamp 它包含的是JMS提供者接受消息的时间,而不是该消息实际传送的时间。这条消息头用于确认发送消息和它被消费者实际接受的时间间隔。 public abstract long getJMSTimestamp()
JMSExpiration 一个Message对象的有效期用来防止把过期的消息传送给消费者。对于那些数据仅在某一个时间段内有效的消息来说,非常有用的 public abstract long getJMSExpiration()
JMSRedelivered 表示该消息将被重新传送给消费者。如果该消息被重新传送,JMSRedelivered消息头就为true,否则为false。 public abstract boolean getJMSRedelivered()
JMSPriority 在传送一条消息时,消息生产者能够为该消息分配一个优先级。消息优先级共有两类:0~4级时普通的优先级,而5~9级则是加急优先级。 public abstract int getJMSPriority()

补充说明:

消息的两种传送模式(JMSDeliveryMode):

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

2.2 开发者分配的消息头

属性 说明 方法(get)
JMSReplyTo 一个JMS消息生产者可能会要求消费者对一条消息作出应答。JMSReplyTo消息头包含了一个javax.jms.Destination,表明JMS消费者应该应答的地址 public abstract Destination getJMSReplyTo()
JMSCorrelationID 提供了一个消息头,用于将当前的消息和先前的某些消息或应用程序特定的ID关联起来 public abstract String getJMSCorrelationID()
JMSType 是由JMS客户端设置的一个可选消息头。它的主要作用是标示消息结构和有效负载的类型。这个消息头并未指明正被发送的消息类型,而是JMS提供者使用的内部消息仓库的一个条目。 public abstract String getJMSType()

补充说明:

消息应答(JMSReplyTo

在使用请求/应答场景时,通过这条消息头属性可以进一步实现消息生产者和消息消费者之间的去耦。实际使用中很方便

三.消息属性

消息属性就像可以分配一条消息的附加消息头一样。它们允许开发者添加有关消息的不透明附加消息。它们还用于暴露消息选择器在消息过滤时使用的数据。message接口为读取和写入属性提供了若干个取值函数和赋值函数方法。

消息属性有3中基本类型:应用程序特定的属性、JMS定义的属性和提供者特定的属性。

3.1 应用程序特定的属性

由应用程序开发者定义的所有属性都可以作为一个应用程序特定的属性。应用程序属性在消息传送之前进行设置。并不存在预定义的应用程序属性,开发者可以自由定义能够满足它们需要的任何属性。如在聊天室程序中,可以添加一个特定的属性,该属性标示了正在发送消息的用户:

 TextMessage message = pubSession .createTextMessage();
 message.setText(userName +":" +text );
 message.setStringProperty("username" , userName );
 publisher.publish(message );

作为一个应用程序的特定属性,username一旦离开Chat应用程序就变得毫无意义。她专门用于程序根据发布者身份对消息进行过滤。

3.1 JMS定义的属性

JMS定义的属性具有和应用程序属性相同的特性,除了前者大多数在消息发送时由JMS提供者来设置之外JMS定义的属性可以作为可选的JMS消息头;对于某些另有声明的例外。各厂商可以分别选择不支持、部分支持或全部支持。下面是JMS定义的9个属性清单:

3.2 提供者特定的属性

每个JMS提供者都可以定义一组私有属性,这些属性可以由客户端或提供者自动设置。提供者特定的属性必须以前缀JMS开头,后面紧接着是属性名称。提供者特定的属性,其作用就是支持厂商的私有特性。

时间: 2024-10-03 13:46:39

JMS消息服务器——Message消息分析(1)的相关文章

JMS消息服务器——Message消息分析(2)

3 消息类型 JAVA消息服务定义了6种JMS提供者必须支持的Message接口类型.尽管JMS定义了Message接口,但它并未定义它们的实现方式.这就允许提供者以它们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口.这6个消息接口是Message和它的5个子接口:TextMessage.StreamMessage.MapMessage.ObjectMessage和ByteMessage. 3.1 Message 最简单的消息类型是javax.jms.Message

JMS消息服务器(二)——点对点消息传送模型

一.点对点模型概览 当你只需要将消息发布送给唯一的一个消息消费者是,就应该使用点对点模型.虽然可能或有多个消费者在队列中侦听统一消息,但是,只有一个且仅有一个消费者线程会接受到该消息. 在p2p模型中,生产者称为发送者,而消费者则称为接受者.点对点模型最重要的特性如下: 消息通过称为队列的一个虚拟通道来进行交换.队列是生产者发送消息的目的地和接受者消费消息的消息源. 每条消息通仅会传送给一个接受者.可能会有多个接受者在一个队列中侦听,但是每个队列中的消息只能被队列中的一个接受者消费. 消息存在先

基于SWOOLE的分布式SOCKET消息服务器架构

消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢? 要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送. 下列测试不考虑防火墙等.仅测试可行性和效率. 测试环境 消息服务器 192.168.0.201 9501 192.168.0.202

JMS消息服务器(一)——基础知识

1.概述 异构集成(heterogeneous integration)是消息传送机制在其中起关键作用的一个领域.无论它的成因是合并.并购.业务需求,或者仅仅是技术方向上的一个变化,越来越多的公司都正面临着在企业内部.跨企业集成异构系统和应用程序的问题. 消息传送机制还具有异步处理请求的能力,它为系统体系机构师和开发者提供的解决方案,能够减轻或消除系统瓶颈,并提高最终用户的生产率和系统的整体可伸缩性.由于消息传送机制能够实现组件之间的高度去耦,因此,使用这种机制的系统还具有高度的体系结构灵活性和

JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储

一,介绍 自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式.相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制. 二,KahaDB存储配置 在 conf/activemq.xml 中配置如下: <broker brokerName="broker" ... > <persistenceAdapter> <kahaDB directory="activemq-da

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

一.消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.SessionAwareMessageListener和MessageListenerAdapter.下面就分别来介绍一下这几种类型的区别. 1).MessageListener MessageListener是最原始的消息监听器,它是JMS规范中定义的一个接口.其中定义了一个用于处理接收到的消息的onMessage方法,

C# Socket基础(四)之客户端向服务器发消息

private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息 客户端发送消息 1 /// <summary> 2 /// 发送数据到服务端 3 /// </summary> 4 private void Send() 5 { 6 if (socketClient == null) 7 { 8 9 ShowMsg("服务器未启动!"); 10 return; 11 } 12 by

NATS学习 -- 概念学习之消息(Message)与发布订阅(Publish Subscribe)

1 理论篇 1.1 来自官方的介绍 NATS acts as a central nervous system for distributed systems such as mobile devices, IoT networks, enterprise microservices and cloud native infrastructure. Unlike traditional enterprise messaging systems, NATS provides an always o

拨云见日---android异步消息机制源码分析

做过windows GUI的同学应该清楚,一般的GUI操作都是基于消息机制的,应用程序维护一个消息队列,开发人员编写对应事件的回调函数就能实现我们想要的操作 其实android系统也和windows GUI一样,也是基于消息机制,今天让我们通过源码来揭开android消息机制的神秘面纱 谈起异步消息,就不能不提及Handler,在安卓中,由于主线程中不能做耗时操作,所以耗时操作必须让子线程执行,而且只能在主线程(即UI线程)中执行UI更新操作,通过Handler发送异步消息,我们就能更新UI,一