第二章 Message组成详解
Message组成详解
1.1JMS message组成说明
JMS message包含两部分,头和承载体. 头中提供被客户端和provider使用的元数据, 承载体包含着实际的数据.
客户端send方法定义的
- JMS Destination 消息送的目的地
- JMS DeliveryMode--传送模式.总共分两种:持久化和非持久化的.默认是采用持久化的模式
persist: 能确保发送失败的时候不会丢失,会多次发送直到成功,但是需要额外的存储空间开销,并且是可靠的
non-persist:只会发送一次不论成功与否
- JMS Expiration---message会过期,headers用来确保发送的消息不会是过期的消息。设置过期值可以用 MessageProducer.setTimeToLive()来设置全局的过期时间或者用 MessageProducer.send()来为每个消息单独设置过期时间(默认消息是不会过期的,设置过期时间为0消息也不会过期)
- JMS MESSAGEID ---message的唯一标示符.使用messageId会招致额外的开销,消息生产者可以建议MQ不需要依赖headers的值通过使用 MessageProducer.setDisableMessageID()方法,此时messageID必须设置成NULL
- JMS Priority--优先级.用来说明消息的重要性的级别.一旦被设置,那么这个producer的所有消息都适用.JMS提供10个级别从0-9(最高).MQ不需要实现消息排序,尽管很多都有排序.它们只需要保证高优先级的消息先发送出去即可.
- JMS Timestamp---用来纪录被发送的时间戳。可以用方法MessageProducer.setDisableMessageTimestamp()来禁用.
客户端定义的
- JMS Correlation ID --用来关联当前的message和之前的message。例如一个请求message和一个应答message。它的值可以是以下几种:一个特定于提供程序的消息ID, 应用程序特定的字符串 ,字节数组值。
- JMS ReplyTo----有些情况下,一个JMS消息生产者可能会要求消费者对一条消息做出应答。JMSReplyTo消息头包含了一个javax.jms.Destination,标明了JMS消费者应该应答的地址。在使用请求/应答场景时,通过这条消息头属性可以进一步实现消息生产者和消息消费者之间的去耦
- JMS Type -----定义message的类型.类型和具体的provider来定义.
MQ定义的
- JMS Redelivered----JMSRedelivered消息头表示会重新发送给消费者。如果该消息被重新传送,JMSRedelivered消息头就为true,否则为false。如果一个消费者未能确认先前传送的消息,或者JMS提供者并不确定消费者是否已经接收到该消息时,就可以将这条消息标记为重新传送
以下是Message接口定义
public interface Message {
...
boolean getBooleanProperty(String name) throws JMSException;
byte getByteProperty(String name) throws JMSException;
short getShortProperty(String name) throws JMSException;
int getIntProperty(String name) throws JMSException;
long getLongProperty(String name) throws JMSException;
float getFloatProperty(String name) throws JMSException;
double getDoubleProperty(String name) throws JMSException;
String getStringProperty(String name) throws JMSException;
Object getObjectProperty(String name) throws JMSException;
...
Enumeration getPropertyNames() throws JMSException;
boolean propertyExists(String name) throws JMSException;
...
void setBooleanProperty(String name, boolean value) throws JMSException;
void setByteProperty(String name, byte value) throws JMSException;
void setShortProperty(String name, short value) throws JMSException;
void setIntProperty(String name, int value) throws JMSException;
void setLongProperty(String name, long value) throws JMSException;
void setFloatProperty(String name, float value) throws JMSException;
void setDoubleProperty(String name, double value) throws JMSException;
void setStringProperty(String name, String value) throws JMSException;
void setObjectProperty(String name, Object value) throws JMSException;
.. }
getPropertyNames用来返回一个枚举列表,通过它可以迭代这个message的所有属性.propertyExists()方法用来判断这个message是否包含属性
你可以获得到三种类型的属性:用户属性. JMS自定义属性,MQ特殊属性.
- 用户属性可以自由定义.通过getBooleanProperty()/setBooleanProperty() , getStringProperty()/setStringProperty这些方法
- JMS自定义属性.
- JMSXAppID —标识发送消息的应用程序
- JMSX ConsumerTXID —被消费的事务标识符内的事务
- JMSXDeliveryCount—消息发送的次数
- JMSXGroupID —这个消息属于哪个消息组
- JMSXGroupSeq—这个消息在消息组中的序号
- JMSXProducerTXID —生产的事务标识符内的事务
- JMSXRcvTimestamp —把消息发送给消费者的时间戳
- JMSXState—用于定义特定于提供程序的状态
- JMSXUserID —发送消息的用户ID
标红的两个属性是比较有用的,使用它们,可以对消息进行分组和排序.
- MQ特殊属性.
1.2 消息选择器
下面来看看一个条件过滤的例子
public void sendStockMessage(Session session, MessageProducer producer, Destination destination, String payload,String symbol, double price) throws JMSException {TextMessage textMessage = session.createTextMessage();textMessage.setText(payload);textMessage.setStringProperty("SYMBOL", symbol);textMessage.setDoubleProperty("PRICE", price);producer.send(destination, textMessage);}
...
//String selector = "SYMBOL = 'AAPL'";(过滤表达式)
String selector = "SYMBOL = 'AAPL' AND PRICE > "
+ getPreviousPrice();
String selector = "SYMBOL IN ('AAPL', 'CSCO') AND PRICE > "
+ getPreviousPrice() + " AND PE_RATIO < "
+ getCurrentAcceptedPriceToEarningsRatioThreshold();
MessageConsumer consumer =
session.createConsumer(destination, selector);
...
以下是选择器的语法
1.3message承载体
jms定义了6种java类型的消息体
- Message — 基础消息类型.没有信息载体,只发送header和properties.通常用于简单的事件通知.
- TextMessge —带有 字符串类型的消息载体.用于发送简单文本和xml数据
- MapMessage —带有一系列键值对的消息载体.key是string类型,value是java基本类型
- ByteMessage —用于包含一个字节数组
- StreamMessage ---用java基本类型来填充的字符流作为消息载体
- ObjectMessage---可序列化的java对象作为载体,也支持java 集合
1.4消息接受模式
- 点对点模式:生产者生产的信息只能被一个消费者消费.可以使用MessageConsumer.receive()从队列同步的接受消息或者使用MessageConsumer.setMessageListener()异步的接受消息.队列会储存消息知道被消费.
- 发布订阅模式:生产者生产的信息能被多个消费者消费.Topic不保存消息(除非通过订阅)
虽然jms没提供请求/应答模式,但是它提供了一些message headers和两个类(QueueRequestor,TopicRequestor)来处理基础的请求/应答消息.请求/应答消息传递是一种 异步反复会话模式,利用点对点或者发布订阅通过结合JMSReplyTo和JMSCorrelationID的消息头和临时目的地来达到目的。
第二章 Message组成详解相关推荐
- 第二章 关系映射详解
本章学习目标 generator 主键策略 对象关系映射之一对多映射 cascade 和 inverse 配置详解 对象关系映射之多对多映射 对象关系映射之一多一映射 1. generator主键策略 ...
- 第二章 计算机网络应用层详解
文章目录 一.应用层协议原理 网络应用程序体系结构 进程通信 客户和服务器进程 进程与计算机网络之间的接口 进程寻址 可供应用程序的运输服务 可靠数据传输 吞吐量 定时 安全性 因特网的运输服务 TC ...
- Flutter修仙传第二章:路由详解
兄弟们,咱们又见面了. 在上一章中,咱们入门学习了Flutter神功,会了些皮毛,知道了输入框,单选复选等这些基础组件的使用,小生并没有讲解按钮这种基础组件的使用,像这种easy的不能再easy的组件 ...
- J2EE 快速入门之第二章 Set集合详解
一:Collection.remove()与ArrayList.remove()方法的不同 1. Collection中只能根据元素移除 2.ArrayLi ...
- 第二章 Python数据类型详解
基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...
- 大学物理第二章 质点动力学详解
牛顿运动定律 一.牛顿第一定律 惯性参考系 定义: 任何物体都要保持其静止或匀速直线运动状态,直到外力破迫使它改变运动状态为止 物体的这种运动状态通常称为惯性运动,而物体保持原有运动状态的特性称之为惯 ...
- delphi 串口通信发送_STM32第五章串口通讯详解
点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...
- 第十六章 ConvNeXt网络详解
系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网 ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
最新文章
- Internet Explorer 8 Beta 2十大看点
- Python 爬虫进阶篇-4行代码实现爬取指定网站中的全部图片实例演示及原理剖析
- NYOJ 49 开心的小明
- 词法分析(3)---DFA
- aee快递查询 在php_第48课 thinkphp5添加商品库
- Xcode误删Images.xcassets文件夹的恢复办法(Assets.xcassets)
- PostgreSQL 在Ubuntu下如何修改postgres默认密码
- Python(二):基本数据类型、序列的基本操作
- vlan为什么能隔离广播域_【思唯网络学院】VLAN是二层技术还是三层技术?
- dicom worklist下载病例程序/dicom worklist scu (c#版本)
- Keil MDK5的安装及破解详细步骤
- 基于DDS的信号源设计
- 14个优化网站性能提高网站访问速度技巧
- LED背光源和LED背光灯区别
- 基于stm32单片机的空气质量检测仿真(仿真+源码+全套资料)
- 中国AI行业走向:新人胜旧人还是 BAT 牢牢掌握价值链顶端? | 新智元投资领袖论坛...
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin
- 《O N E 影视厅》管理系统——WAMP架构win10+apache+mysql+php
- vue使用mintUI踩坑——不显示样式/导入mui.css报错/build不了
- qiankun微前端实践
热门文章
- html语言面向对象,自学html5教程之JavaScript面向对象
- SSRF (Server Side Request Forgery;服务端请求伪造)
- 音视频学习之rtsp学习rtp协议的理解(rtp)
- python单选按钮控件_Python Tkinter Radiobutton单选按钮
- OpenCV 中的轮廓-轮廓的层次结构
- [paper]Interpretable Representation Learning for Healthcare via Capturing Disease Progression
- PHPCMS模板里面使用自定义函数
- Siamese系列文章
- [英语阅读]法国:丈夫辱骂妻子将涉嫌违法
- 前端基础_HTML(DAY03)