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");//创建 Destination
QueueSender queueSender = queueSession.createSender(queue);//创建 MessageProducer
TextMessage textMessage = queueSession.createTextMessage("测试消息");//创建 Message
QueueReceiver 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开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
随机推荐
- Windoows窗口程序一
编写窗口程序的步骤: .定义WinMain入口函数 .定义窗口处理函数(处理消息)WindowProc .注册窗口类RegisterClass .创建窗口(在内存中创建窗口)CreateWindow ...
- 关于Cocos2d-x中addchild和removeChild方法的参数的解析
一.addchild virtual void addchild( Node * child , int localZOrder , int tag )添加一个子节点到容器中,有Z轴顺序和一个标记. ...
- 【转】 PreTranslateMessage作用和使用方法
PreTranslateMessage作用和使用方法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...
- Java JNI初探
---说明,之前直接百度出来的例子,照猫画虎.没想到的是这例子居然直接来自百度百科,写着写着就囧了.. ---anyway,写完了就当是给自己看吧. 同事求助,就看了一下,照猫画虎一番,略有所得. J ...
- linux -- 进程管理和作业控制
一. 作业控制 1. 直接将命令放到后台"执行": & [root @test /root ]# command & 范例: [root @test /root] ...
- 基于Linux的智能家居的设计(4)
3 开发环境的搭建 本次课题使用的开发环境比較特殊.没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,并且假设没有这个开发环境本次课题就无法进行. 因此.在进 ...
- fastx tookit 操作fasta/fastq 文件 (1)
准备测试文件 test.fq, 包含4条fastq 文件,碱基编码格式为phred64; @FC12044_91407_8_200_406_24 NTTAGCTCCCACCTTAAGATGTTTA + ...
- linux下安装dovecot
Dovecot是一个开源的,为Linux/Unix-like系统提供IMAP,POP3服务的软件.主要是为了安全产生的,不管大小应用,Dovecot都是一个非常优秀的选择.它非常快,配置简单,不需要专 ...
- VS2010配置HTML5智能提示
步骤: 1.首先去这里下载安装文件: http://visualstudiogallery.msdn.microsoft.com/d771cbc8-d60a-40b0-a1d8-f19fc393127 ...
- MathType中常见的两种符号的运用
想要让公式编辑得快速又高效,MathType数学公式编辑器这个神助攻是少不了的.MathType是一款专用的数学公式编辑器,用它来编辑公式非常方便实用,并且排版也非常简单.下面介绍两种常见符号的应用. ...