03.JMS深入
1.JMS API
- ConnectionFactory - 一个创建连接的连接工厂
- Destination - 消息目的地,可以是queue(队列)或者是topic(主题)
- Connection - 一个连接,用来创建Session
- Session - 客户端Session,可以创建Message、MessageProducer和MessageConsumer
- Message - 消息接口
- MessageProducer - 消息生产者,用来创建消息
- MessageConsumer - 消息消费者,用来读取消息
- QueueConnectionFactory - 继承ConnectionFactory
- Queue - 继承BaseDestination
- QueueConnection - 继承Connection
- QueueSession - 继承Session
- QueueSender - 继承MessageProducer
- QueueReceiver - 继承MessageConsumer
- TopicConnectionFactory - 继承ConnectionFactory
- Topic - 继承BaseDestination
- TopicConnection - 继承Connection
- TopicSession - 继承Session
- TopicPublisher - 继承MessageProducer
- TopicSubscriber - 继承MessageConsumer
QueueConnectionFactory queueConnectionFactory = new ActiveMQConnectionFactory(user, password, url);QueueConnection queueConnection = queueConnectionFactory.createQueueConnection("admin", "admin");
QueueSession queueSession = queueConnection.createQueueSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
- boolean transacted - 用来表明Session对象是不是事务性的
- int acknowledgeMode - 设置Session收到消息后的消息签收(确认)模式
- Session.AUTO_ACKNOWLEDGE - 消息自动签收
- Session.CLIENT_ACKNOWLEDGE - 客户端调用Message.acknowledge()方法手动签收
- Session.DUPS_OK_ACKNOWLEDGE - 自动批量确认。不必必须签收,消息可能会重复发送。在第二次重新传递消息的时候,消息头的JmsDelivered会被置为true标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制
- Session.SESSION_TRANSACTED - 事务提交并确认
- MessageAck.DELIVERED_ACK_TYPE - 消息"已接收",但尚未处理结束
- MessageAck.STANDARD_ACK_TYPE - "标准"类型,通常表示为消息"处理成功",broker端可以删除消息了
- MessageAck.POSION_ACK_TYPE - 消息"错误",通常表示"抛弃"此消息,比如消息重发多次后,都无法正确处理时,消息将会被删除或者DLQ(死信队列)
- MessageAck.REDELIVERED_ACK_TYPE - 消息需"重发",比如consumer处理消息时抛出了异常,broker稍后会重新发送此消息
- MessageAck.INDIVIDUAL_ACK_TYPE - 表示只确认"单条消息",无论在任何ACK_MODE下
- MessageAck.UNMATCHED_ACK_TYPE - BROKER间转发消息时,接收端"拒绝"消息
Queue queue = queueSession.createQueue("TOOL.DEFAULT");//创建 DestinationQueueSender queueSender = queueSession.createSender(queue);//创建 MessageProducerTextMessage textMessage = queueSession.createTextMessage("测试消息");//创建 MessageQueueReceiver queueReceiver = queueSession.createReceiver(queue);//创建 MessageConsumer
QueueBrowser queueBrowser = queueSession.createBrowser(queue);Enumeration<TextMessage> enumeration = queueBrowser.getEnumeration();while (enumeration.hasMoreElements()){TextMessage message = enumeration.nextElement();System.out.println("QueueBrowser - " + message.getText());}System.out.println("QueueBrowser 完成!");
2.JMS消息基本结构
- JMSDestination - 消息的目的地,Topic或者是Queue
- JMSDeliveryMode - 消息的发送模式:persistent或nonpersistent,设置是否存储消息到硬盘
- JMSTimestamp - 当调用send()方法的时候,JMSTimestamp会被自动设置为当前事件。
- JMSExpiration - 表示一个消息的有效期。只有在这个有效期内,消息消费者才可以消费这个消息。默认值为0,表示消息永不过期。
- JMSPriority - 消息的优先级。0-4为正常的优先级,5-9为高优先级。
- JMSMessageID - 一个字符串用来唯一标示一个消息。
- JMSReplyTo - 有时消息生产者希望消费者回复一个消息,JMSReplyTo为一个Destination,表示需要回复的目的地。当然消费者可以不理会它。
- JMSCorrelationID - 通常用来关联多个Message。例如需要回复一个消息,可以把JMSCorrelationID设置为所收到的消息的JMSMessageID。
- JMSType - 表示消息体的结构,和JMS提供者有关。
- JMSRedelivered - 如果这个值为true,表示消息是被重新发送了。因为有时消费者没有确认他已经收到消息或者JMS提供者不确定消费者是否已经收到。
- 自动分配的消息头:大多数JMS消息头是自动分配的,在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用setJMS<HEADER>()方法分配的值就被忽略了。换句话说,对于大多数自动分配的消息头来说,使用赋值函数方法显然是徒劳的。不过,这并非意味着开发者无法控制这些消息头的值。一些自动分配的消息头可以在创建Session和MessageProducer(也就是TopicPublisher)时,由开发者通过编程方式来设置。
- 发者分配的消息头:开发人员通过赋值方式设置的消息头信息。
//在消息生产者上设置JMS传送模式TopicPublisher topicPublisher = topicSession.createPublisher(topic);topicPubiisher.setDeliveryMode(DeliverMode.NON_PERSISTENT);
TopicPublisher topicPublisher = topicSession.createPublisher(topic);//将生存时间设置为1小时(1000毫秒 *60 *60)topicPublisher.setTimeToLive(3600000);
TopicPublisher topicPublisher = TopicSession.createPublisher(someTopic);topicPublisher.setPriority(9);
TextMessage message = pubSession.createTextMessage();message.setText(text);message.setStringProperty("username",username); //自定义属性publisher.publish(message);
- JMSXUserID
- JMSXAppID
- JMSXProducerTXID
- JMSXConsumerTXID
- JMSXRcvTimestamp
- JMSXDeliveryCount
- JMSXState
- JMSXGroupID
- JMSXGroupSeq
message.setStringProperty("JMSXGroupID","ERF-001");message.setIntProperty("JMSXGroupSeq",3);
3.JMS消息类型
- Message - 这种类型不含有效负载。它可以用于简单的事件通知。
- TextMessage - 这种类型携带了一个java.lang.String作为有效负载。它可以用于简单的文本消息交换,还可以用于更复杂的字符数据交换,比如XML文档等。
- ObjectMessage - 这种类型携带了一个可序列化Java对象作为有效负载。它可以用于Java对象交换。
- BytesMessage - 这种类型携带了一组原始类型字节流作为有效负载。
- StreamMessage - 这种类型携带了一个Java原始数据类型流(int ,double,char等)作为有效负载。它提供了一套将格式化字节流映射为java原始数据类型的简便方法。
- MapMessage - 这种类型携带了一组名/值对作为有效负载。有效负载类似于一个java.util.Properties对象,除了有效负载值必须是java原始类型或它们的包装器之外。
TextMessage textMessage = queueSession.createTextMessage("测试消息-TextMessage");queueSender.send(textMessage);User object = new User("LZW", 20, true);ObjectMessage objectMessage = queueSession.createObjectMessage(object);queueSender.send(objectMessage);BytesMessage bytesMessage = queueSession.createBytesMessage();bytesMessage.writeBytes("测试消息-BytesMessage".getBytes());queueSender.send(bytesMessage);QueueReceiver queueReceiver = queueSession.createReceiver(queue);for (int i = 0; i < 3; i++){Message message = queueReceiver.receive(1000 * 1);if (message instanceof TextMessage){System.out.println(((TextMessage)message).getText());}if (message instanceof ObjectMessage){System.out.println(((ObjectMessage)message).getObject());}if (message instanceof BytesMessage){bytesMessage = (BytesMessage)message;byte[] data = new byte[(int)bytesMessage.getBodyLength()];bytesMessage.readBytes(data);System.out.println(new String(data));}}
-------------------------------------------------------------------------------------------------------------------------------
03.JMS深入的更多相关文章
- Java屌炸天学习路线图
第一阶段:Java基础篇 编号 课程 课程目录 打包下载地址 讲师 01 J2SE(40课时) http://www.java1234.com/zy001.html http://pa ...
- 异步消息总线hornetq学习-03客户端连接hornet进行jms消息的收发-非jndi方式连接
在上节中介绍了通过jndi方式连接到hornetq服务器上,有时候由于某些原因,我们不希望通过jndi方式连接,hornetq也支持这种方式进行 以第2章节的例子为模板,我们编写了另一个获取Conne ...
- Simple guide to Java Message Service (JMS) using ActiveMQ
JMS let’s you send messages containing for example a String, array of bytes or a serializable Java o ...
- JMS开发(三):JMS消息的确认方式
这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...
- JMS开发(一):基础理论认知
JMS全称是Java Message Service.其是JavaEE技术规范中的一个重要组成部分,是一种企业消息处理的规范.它的作用就像一个智能交换机,它负责路由分布式应用中各个组件所发出的消息. ...
- 大型系统中使用JMS优化技巧–Sun OpenMQ
我们先来看看在Sun OpenMQ系统中 一个持久.可靠的方式传送消息的步骤是怎么样的,如图所示: 查看大图请点击这里 在传送过程中,系统处理JMS消息分为以下两类: ■ 有效负荷消息,由生成方发 ...
- 【转载】大型系统中使用JMS优化技巧
[本文转自:http://www.javabloger.com/article/sun-openmq-jms-large-scale-systems.html] 我们先来看看在Sun OpenMQ系统 ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
随机推荐
- chrome 常用快捷键(可以摆脱鼠标哦)
Ctrl+N 打开新窗口. Ctrl+T 打开新标签页. Ctrl+Sh ...
- 面向移动端的轻量级神经网络模型mobilenet、ShuffleNet
翻译: http://baijiahao.baidu.com/s?id=1565832713111936&wfr=spider&for=pc http://baijiahao.baid ...
- (转)YUV420存储格式
YUV格式有两大类:planar和packed.对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y,U ...
- 1077. Kuchiguse (20)【字符串处理】——PAT (Advanced Level) Practise
题目信息 1077. Kuchiguse (20) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The Japanese language is notorious f ...
- asp.net管线
- Linux(Ubuntu)下搭建ASP.NET Core环境
今天来学习一下ASP.NET Core 运行在Ubuntu中.无需安装mono . 环境 Ubuntu 14.04.4 LTS 服务器版 全新安装系统. 下载地址:http://mirrors.neu ...
- PHP中替换换行符方法总结
<?php header("content-type:text/html;charset=utf-8"); $str = "aaaa bbbb cccc dddd& ...
- ChemDraw 16最新版本发布 更效率科研的首选
ChemDraw一直是全球领先的科学绘图软件,致力于为科学家.教师以及学生提供最新的智能应用程序.ChemDraw 16版本相较于15版本做出了较大的改进,大大缩短科研时间,提高科研效率.扩展Name ...
- XML高速入门
XML是什么 Extensible Markup Language 自己定义标签: 用来数据传输: 可扩展标记语言,是一种类似超文本标记语言的标记语言. 与HTML的比較: 1.不是用来替代HTML的 ...
- Java精选笔记_面向对象(构造方法、this关键字、static关键字、内部类)
构造方法constructor构造器 构造方法的定义 [修饰符] 类名 (形式参数列表){ //语句 } 构造器用于构造该类的实例.作用:用来初始化对象!一般由系统在创建对象(即类的 ...