前一段时间公司的产品中使用了ActiveMQ作为消息通知的工具,也简要记录了一些概念,整理后与大家分享一下(部分内容摘自网络,详见参考资料一栏)。
一、ActiveMQ是一个JMS规范的一个实现。
在JMS中间主要定义了2种消息模式Point-to-Point (点对点)和Publich/Subscribe Model(发布/订阅者)。
其中在Publich/Subscribe模式下又有Nondurable subscription(非持久化订阅)和durable subscription(持久化订阅)2种消息处理方式。
1、Queue(队列):
(1)一条消息仅能被一个消费者收到,如果在message发送的时候没有可用的消费者,它将被保存一直到能处理该message的消费者,如果一个消费者收到消息后却不响应它,这条消息将被转到另一个消费者那里。一个队列有很多消费者,并且可用的消费者可以负载均衡。
(2)点对点模型中,每个消息都有一个发送者和一个接收者,消息中介(broker)收到发送者的消息,会
将消息放入队列中,而接收者请求并接收队列中的一条消息后,这条消息就会从队列中删除。消息队列中的每条消息只能投递给一个接收者,但并不意味着只能使用一个接收者从队列中取消息,根据业务需要,可以使用多个接收者同时从队列中请求消息,分担处理压力。但是需要注意的是,单个接收者收到的消息是按照发送顺序的,多个接收者因为多线程的关系,并不能保证收到的消息一定是原序的。
2、Topic(主题):
(1)Topic通过publish和subscribe实现.
一条消息被publish,他将发布到一个主题上,可以有多个订阅者去访问该消息.消息将一直维持在主题中,直到该主题的所有订阅者都取走消息的一个副本.也可以设置消息的耐久性(消息在主题中停留的时间).
二、在JMS1.1规范中,定义了五种消息类型,分别为:
1.StreamMessage :消息体是 Java 流,写入和读出都是顺序的.
2.MapMessage :消息体包含 key-value 对, key 为 String , value 为基本类型,可以通过迭代器访问.
3.TextMessage :消息体是 String.
4.ObjectMessage :消息体是可序列化的
Java 对象.
5.BytesMessage
:消息体是字节数组可以通过 message.clearBody() 来清除消息体;但在消费端,消息体是只读的,针对消息的写操作都会抛出MessageNotWritableException异常.
三、消息发送的目的地:JMSDestination
消息发送的目的地(队列或主题);创建消息时可以设置 JMSDestination ,但是在发送完成时其值会更新为发送方所指定的 JMSDestination ,也就是说发送前该字段会被忽略;当消息被消费时,该字段的值与在它被发送时被设置的值是相同的.
四、消息的传输模式:JMSDeliveryMode
分为两种:
DeliveryMode.PERSISTENT :保证消息仅传一次,
JMS Provider 服务停止后消息不会丢失;
DeliveryMode.NON_PERSISTENT :消息最多传一次,消息会因
JMS Provider 停止后丢失;
同 JMSDestination 一样,在发送前设置的会被忽略.
在 JMS Provider 重启后, NON_PERSISTENT 消息丢失了,而 PERSISTENT 消息能正常被消费者消费。
五、消息响应:JMSReplyTo
发送端在发送消息时,可以指定该属性(为一个JMSDestination),表示期望收到客户端的响应;是否响应由消费端决定。
发送端:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
Destination destination2 = session.createQueue("JMS.DEMO3");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
message.setJMSReplyTo(destination2);
// 发送消息
publisher.send(message);
接收端(可以根据情况决定是否需要回复):
public void onMessage(Message message) {
try {
System.out.println("Receive message: " + message);
if (message.getJMSReplyTo() != null) {
session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This is a reply to"
+ message.getJMSReplyTo()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
六、消息的过期:JMSExpiration
消息的过期时间,其值为当前时间加上存活时间(毫秒);当存活时间设置为 0 时,该字段的值也被设置为 0 ,表示永不过期;消费端在一般情况下都不会接收到过期的消息,但 JMS Provider 并不保证这一点;
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 发送消息
publisher.setTimeToLive(5000);
publisher.send(message);
不断更新中...
附参考资料:
http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html JMS 规范
分享到:
相关推荐
尽管描述中并未给出具体信息,但我们可以推断这篇博文可能详细介绍了如何使用JMS与ActiveMQ结合来实现文件传输。博主可能讨论了如何配置ActiveMQ服务器,以及如何通过JMS API创建消息,将文件内容封装到消息中,然后...
ActiveMQ是Apache软件基金会的一个开源项目,它是实现JMS规范的消息中间件。ActiveMQ 5.4.2是其早期的一个稳定版本,尽管现在可能已经更新到更高版本,但当时它提供了许多特性,包括: 1. **多协议支持**:ActiveMQ...
ActiveMQ是Apache软件基金会开发的一款开源、高性能、跨语言的消息中间件,它实现了JMS规范。ActiveMQ支持多种协议,如OpenWire、AMQP、STOMP、XMPP和MQTT,使得不同平台和语言的应用能够轻松地集成。ActiveMQ还提供...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它是Java消息服务(Java Message Service,简称JMS)的一个实现。JMS是一种为分布式应用提供异步消息传递的API,它定义了一种标准接口,使得不同的消息系统...
整合Spring与ActiveMQ,首先需要在Spring配置文件中定义一个JMS模板,这是一个便捷的工具类,可以用来发送和接收消息。例如: ```xml <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> ...
总结来说,这个压缩包文件提供了全面的学习资源,涵盖了理论讲解(PPTX)、实践操作指导(Readme)以及可运行的示例代码(Eclipse工程),对于想要了解和掌握JMS与ActiveMQ的开发者来说,是一个非常宝贵的资源。...
**JMS学习笔记(一)——JMS简介与ActiveMQ安装** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的标准接口。它为应用程序提供了一种标准的方式,用来创建、发送、接收和读取...
ActiveMQ 是Apache出品,最流行的,能力强劲的开源jms...ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
总结,这个压缩包提供的案例涵盖了使用JMS与ActiveMQ进行消息传递的基本步骤和测试方法,对于理解JMS规范和ActiveMQ的实际运用具有很好的学习价值。开发者可以通过这个案例学习如何在实际项目中利用消息队列来提升...
ActiveMQ是Apache软件基金会开发的一个开源JMS消息代理,它实现了多种消息协议,如OpenWire、STOMP、AMQP和MQTT,为开发者提供了高度可扩展且可靠的跨语言消息传递服务。 在Java开发中,JMS和ActiveMQ的结合使用能...
例如,Apache ActiveMQ就是一个流行的开源JMS服务提供者,它符合JMS规范,并提供了多种消息传递模式。 2. **消息管理对象**:主要包括ConnectionFactory和Destination。ConnectionFactory用于创建与JMS服务提供者的...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循Java消息服务(JMS)规范,为分布式系统提供高效、可靠的消息传递。本教程通过视频形式深入讲解了ActiveMQ的使用和JMS规范的相关知识。 Java消息服务...
JMS简明教程+JMS规范教程+activemq以及activemq和tomcat的整合+整合实例代码+持久化消息配置以及工程+tomcat服务器的配置+整合需要的lib文件+部署多个tomcat服务器方案等
本文将深入探讨如何在Spring 3.0中整合JMS与ActivemQ,以及它们在实际应用中的关键知识点。 首先,我们要了解Spring对JMS的支持。Spring通过其`org.springframework.jms`包提供了丰富的JMS抽象,简化了JMS的使用。...
总结:JMS ActiveMQ结合了JMS规范和ActiveMQ的强大功能,为分布式系统提供了可靠的异步通信解决方案。理解和掌握JMS和ActiveMQ的基本概念、组件及高级特性,对于构建高效、可扩展的分布式应用至关重要。
在提供的“一头扎进JMS之ActiveMQ视频教程”中,你将学习如何配置和使用ActiveMQ,包括安装和启动服务、创建和管理消息队列、使用生产者和消费者发送与接收消息、理解不同消息模式的工作原理,以及如何利用ActiveMQ...
详细内容: SpringJMS整合ActiveMQ.doc 详细说明文档 apache-activemq-5.8.0-bin.zip ActiveMQ安装包 JMSTest.rar MyEclipse8.5下web工程
**JMS与ActiveMQ入门实例详解** Java消息服务(Java Message Service,简称JMS)是Java平台中用于创建、发送、接收和阅读消息的应用程序接口。它为应用程序提供了标准的接口,可以跨越多种消息中间件产品进行通信。...
这些都是基于JMS规范的MQ实现,允许Java应用程序通过统一的JMS API与不同的消息队列进行交互。 ActiveMQ是一个开源的消息代理,它实现了JMS规范,并且支持多种传输协议和语言。作为JMS的一个实现,ActiveMQ提供了与...