PTP 与 Pub/Sub 接口之间的关系 |
||
JMS 通用 |
PTP 域 |
Pub/Sub 域 |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
下面对这些 JMS 概念进行简单定义。有关更多信息,请参阅 JMS 规范的 PTP 和 Pub/Sub 章节。
- ConnectionFactory - 客户端用于创建 Connection 的管理对象
- Connection - 到 JMS 提供者的活动连接
- Destination - 封装消息目的地标识的管理对象
- Session - 发送和接收消息的单线程上下文
- MessageProducer - Session 创建的对象,用于将消息发送到目的地
- MessageConsumer - Session 创建的对象,用于接收发送到目的地的消息
使用ActiveMQ
部署ActiveMQ
首先我们可以到官方下载页去下载最新的ActiveMQ的部署程序(http://activemq.apache.org/download-archives.html)
将程序解压后如果已经配置了java环境可以直接运行安装目录/bin下的activemq.bat来启动activemq程序
activemq使用了jetty服务器来进行管理,可以在conf/jetty.xml文件中对其配置,conf/activemq.xml文件中对activemq进行配置
在Java项目中使用activemq
在java工程中导入ActiveMQ需要的包
需要如下包:
· activemq-core.jar
· activeio-core.jar
· *kahadb.jar (if you wish to use persistence,如果要使用持久化需要此jar包)
· slf4j-api.jar
· J2EE Jars
- geronimo-spec-jms.jar
- geronimo-spec-jta.jar
- geronimo-spec-j2ee-management.jar
也可以使用默认的activemq-all.jar,下载地址http://mvnrepository.com/artifact/org.apache.activemq/activemq-all)
生产消息过程
示例代码:
消费消息过程
示例代码:
消息消费者有两种消息接收方式
1. 上面示例中的调用receive方法,使用阻塞的方式获取消息
2. 使用MessageConsumer对象的setMessageListener方法设置监听的方式,设置监听后如果关闭Consumer、session或connection将终止监听
JMS消息类型
JMS API 定义了五种消息正文类型:
- Stream(流)- StreamMessage 对象的消息正文包含 Java 编程语言原始值流(“Java 基本类型”)。按顺序填充和读取。
- Map(映射)- MapMessage 对象的消息正文包含一组名称-值对,其中名称是 String 对象,值是 Java 基本类型。可以根据名称按顺序或随机访问这些条目。条目的顺序是不确定的。
- Text(文本)- TextMessage 对象的消息正文包含 java.lang.String 对象。此消息类型可用于传输纯文本消息和 XML 消息。
- Object(对象)- ObjectMessage 对象的消息正文包含 Serializable Java 对象。
- Byte(字节)- BytesMessage 对象的消息正文包含未解释的字节流。此消息类型可以按字面意义编码正文,以匹配现有的消息格式。在大多数情况下,可以使用更易用的其他正文类型。尽管 JMS API 允许将消息属性用于字节消息,但一般不使用它们,因为包含属性可能会影响格式。
ACK_MODE确认模式
确认模式用来指示会话如何确认收到消息,在使用Connection的createSession方法时需要指定此选项,在JMS的Session接口中包含下面四个选项
· AUTO_ACKNOWLEDGE = 1 自动确认
当会话从对 receive
的调用成功返回时,或在会话已调用的用于处理消息的消息侦听器成功返回时,会话会自动确认客户端的消息接收。
· CLIENT_ACKNOWLEDGE = 2 客户端手动确认
通过此确认模式,客户端通过调用消息的 acknowledge 方法确认已使用的消息。 确认已使用的消息将确认该会话已使用的所有消息。
· DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
此确认模式指示会话延迟确认消息的传送。这可能在 JMS 提供者失败的情况下导致传送某些重复消息,因此只有能允许重复消息的使用方才应使用此模式。使用此模式可以通过最大限度地减少会话为防止重复所做的工作,从而减少会话开销。
· SESSION_TRANSACTED = 0 事务提交并确认
如果会话是事务的则使用此模式,忽略设置的其他模式值
在事务开启之后,和session.commit()之前,所有消费的消息,要么全部正常确认,要么全部redelivery。这种严谨性,通常在基于GROUP(消息分组)或者其他场景下特别适合。
所有评论仅代表网友意见