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开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
随机推荐
- 结合使用 Oracle 和 Ruby on Rails 的补充
本文是对此文的补充: 结合使用 Oracle 和 Ruby on Rails http://www.oracle.com/technetwork/cn/tutorials/rubyrails-0959 ...
- 关于Unity中的碰撞检测和管理(2D)
创建Unity3D项目和Unity2D项目的区别. 1.3D项目有摄像机和太阳光,2D项目只有摄像机 2.3D项目使用的贴图类型是Texture纹理,2D项目使用的贴图类型是Sprite 2D/UI ...
- Ubuntu之命令壁纸
- Spring in Action 4th 学习笔记
约定: 一.@Xxx Class 表示被@Xxx注解的类.同理还有@Xxx注解的字段或方法. 例如:@Bean Method. 二.@Component Class 同时代指 @Controller. ...
- Blend for Visual Studio 2013
软件开发中为了使设计师和程序员“并行”工作并直接参与到程序的开发中来. 1.在网络程序开发团队中,草图设计后,设计师们可以使用HTML.CSS.JavaScript直接生成UI,程序员则在这个UI产生 ...
- JavaScript 学习笔记之最终篇
JavaScript 的学习算是最后一篇了...把JS基础已经核心的部分彻底的进行了学习... 唯一的缺陷就是自己在运用上并不是特别的熟练...今天是JS的最后一章内容了..也是JS 中最常用的内 ...
- js中onclick中文参数传输方式
添加单引号或双引号即可,例: var type = "'"+n.bankCard.type+"'"; var number = "'"+n. ...
- MFC ADO数据库操作
MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...
- vs2013配置opencv3.2.0
工具/原料 l VS2013 l OpenCV3.20http://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.2.0/op ...
- Windows绘图中的GDI映射模式
对Windows编程新手来说,GDI编程中最困难的部分就是映射模式(Mapping Mode). 什么是映射模式? 我们知道,GDI画图是在设备描述表这个逻辑意义上的显示平面上进行,其使用的是逻辑坐标 ...