1. JMS基本概念
JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。
对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
简单的讲,点到点模型和发布/订阅模型的区别就是前者是一对一,后者是一对多。
2. 几个重要概念
Destination:消息发送的目的地,也就是前面说的Queue和Topic。创建好一个消息之后,只需要把这个消息发送到目的地,消息的发送者就可以继续做自己的事情,而不用等待消息被处理完成。至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。
Message:从字面上就可以看出是被发送的消息。它有下面几种类型:
StreamMessage:Java 数据流消息,用标准流操作来顺序的填充和读取。
MapMessage:一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型。
TextMessage:普通字符串消息,包含一个String。
ObjectMessage:对象消息,包含一个可序列化的Java 对象
BytesMessage:二进制数组消息,包含一个byte[]。
XMLMessage: 一个XML类型的消息。
最常用的是TextMessage和ObjectMessage。
Session:与JMS提供者所建立的会话,通过Session我们才可以创建一个Message。
Connection:与JMS提供者建立的一个连接。可以从这个连接创建一个会话,即Session。
ConnectionFactory:那如何创建一个Connection呢?这就需要下面讲到的ConnectionFactory了。通过这个工厂类就可以得到一个与JMS提供者的连接,即Conection。
Producer:消息的生产者,要发送一个消息,必须通过这个生产者来发送。
MessageConsumer:与生产者相对应,这是消息的消费者或接收者,通过它来接收一个消息。
前面多次提到JMS提供者,因为JMS给我们提供的只是一系列接口,当我们使用一个JMS的时候,还是需要一个第三方的提供者,它的作用就是真正管理这些Connection,Session,Topic和Queue等。
通过下面这个简图可以看出上面这些概念的关系。
ConnectionFactory---->Connection--->Session--->Message
Destination + Session------------------------------------>Producer
Destination + Session------------------------------------>MessageConsumer
那么可能有人会问: ConnectionFactory和Destination 从哪儿得到?
这就和JMS提供者有关了. 如果在一个JavaEE环境中, 可以通过JNDI查找得到, 如果在一个非JavaEE环境中, 那只能通过JMS提供者提供给我们的接口得到了.
前一讲简单的介绍了一下JMS的基本概念, 这一讲结合一个例子让大家深入理解前一讲的基本概念. 首先需要做的是选择一个JMS提供者, 如果在JavaEE环境中可以不用考虑这些. 我们选择ActiveMQ, 官方地址: http://activemq.apache.org/. 网上有很多介绍ActiveMQ的文档, 所以在这里就不介绍了.
按照上一讲的这个简图,
ConnectionFactory---->Connection--->Session--->Message
Destination + Session------------------------------------>Producer
Destination + Session------------------------------------>MessageConsumer
首先需要得到ConnectionFactoy和Destination,这里创建一个一对一的Queue作为Destination。
ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Queue queue = new ActiveMQQueue("testQueue");
然后又ConnectionFactory创建一个Connection, 再启动这个Connection:
Connection connection = factory.createConnection();
connection.start();
接下来需要由Connection创建一个Session:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
现在暂且不用管参数的含义, 以后会详细讲到.
下面就可以创建Message了,这里创建一个TextMessage。
Message message = session.createTextMessage("Hello JMS!");
要想把刚才创建的消息发送出去,需要由Session和Destination创建一个消息生产者:
MessageProducer producer = session.createProducer(queue);
下面就可以发送刚才创建的消息了:
producer.send(message);
消息发送完成之后,我们需要创建一个消息消费者来接收这个消息:
MessageConsumer comsumer = session.createConsumer(queue);
Message recvMessage = comsumer.receive();
消息消费者接收到这个消息之后,就可以得到它的内容:
System.out.println(((TextMessage)recvMessage).getText());
至此,一个简单的JMS例子就完成了。下面是全部:
import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class MessageSendAndReceive {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
Queue queue = new ActiveMQQueue("testQueue");
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Message message = session.createTextMessage("Hello JMS!");
MessageProducer producer = session.createProducer(queue);
producer.send(message);
System.out.println("Send Message Completed!");
MessageConsumer comsumer = session.createConsumer(queue);
Message recvMessage = comsumer.receive();
System.out.println(((TextMessage)recvMessage).getText());
}
}
消息的消费者接收消息可以采用两种方式:
1、consumer.receive() 或 consumer.receive(int timeout);
2、注册一个MessageListener。
采用第一种方式,消息的接收者会一直等待下去,直到有消息到达,或者超时。后一种方式会注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。下面举例说明:
MessageConsumer comsumer = session.createConsumer(queue);
comsumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message m) {
TextMessage textMsg = (TextMessage) m;
try {
System.out.println(textMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
相关推荐
本实例中,"JMS实例,整合spring,含jar"表明这是一个具体的项目示例,展示了如何在Spring框架中配置和使用JMS。这通常涉及到以下步骤: 1. **添加依赖**:首先,你需要在项目的构建文件(如Maven的pom.xml或Gradle的...
通过上述分析,我们可以看到Spring与JMS结合使用的方式能够极大地简化消息的发送和接收过程。利用Spring提供的工具类和接口,开发者可以更加关注于业务逻辑的实现,而无需过多地关注JMS的具体实现细节。这种方式不仅...
本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的入门实例。 首先,我们需要理解ActiveMQ的基本概念。ActiveMQ是Apache软件基金会开发的一个开源消息代理,它实现了JMS规范,提供...
下面我们将深入探讨如何在JBoss中构建JMS应用,并通过实例来了解其工作原理。 1. **JMS基础** - **消息模型**:JMS提供了两种主要的消息模型——点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,...
本实例重点探讨了如何使用Flex作为前端,通过BlazeDS与Java后台结合JMS服务进行通信,实现数据的实时推送,从而达到页面实时刷新的效果。下面将详细介绍这一技术栈中的关键知识点: 1. **Flex**:Flex是基于...
**实例分析** 根据提供的文件名,我们可以推测这个压缩包包含以下几个部分: 1. `sqs4j.txt`:可能是`sqs4j`库的使用文档或者示例代码。 2. `Sqs4J_bin.zip`:可能是`sqs4j`库的编译后的二进制文件,包含类库和...
**JMS应用实例** 1. **订单处理**:系统接收到订单后,通过JMS将订单消息放入队列,后台处理程序按顺序取出并处理,确保处理的顺序性和一致性。 2. **事件通知**:应用发布事件到主题,其他订阅该主题的应用会收到...
通过分析这些代码,可以深入理解JMS与ActiveMQ的结合使用,以及在实际项目中的应用。 总的来说,这个Demo可以帮助我们学习如何在Java应用中使用JMS和ActiveMQ,理解消息队列的概念,以及如何实现异步处理和解耦组件...
源码分析对于理解其内部工作原理和实现自己的消息传递解决方案至关重要。 在提供的资源中,有两个CHM帮助文件——"jms_en.chm"和"jms_zh.chm",分别提供了英文和中文的API文档。这些文档详细列出了JMS 1.1接口和类...
- 编写测试代码,创建生产者和消费者实例,进行消息的发送和接收验证。 6. **高级特性** - **事务管理**:JMS 支持事务性会话,可以确保消息的一致性。 - **持久化**:消息可以被持久化存储,即使服务器崩溃也能...
标题 "一个Topic和subscriber的JMS应用" 描述了一个基于Java消息服务(JMS)的系统,该系统涉及发布/订阅模式,其中Topic是发布者...开发者通过源码分析可以深入理解JMS的工作原理,以及如何在实际项目中有效地利用它。
在不使用JNDI的情况下配置Spring JMS,我们需要直接实例化ConnectionFactory和Destination对象。ConnectionFactory是用于创建与消息服务器连接的对象,而Destination则代表我们要发送或接收消息的目标。以下是一个...
标题中的“JMS分布式例子”指的是Java消息服务(Java Message Service)在分布式环境中的应用示例。...通过分析提供的实例文件,我们可以学习到如何配置和使用JMS provider,以及编写生产者和消费者代码。
以上论文均围绕JMS技术的不同方面展开深入研究,不仅涉及了JMS的基本概念和理论基础,还探讨了其在各种具体场景下的应用实例。通过对这些论文的学习和研究,可以全面了解JMS技术的最新发展动态及其在企业级应用中的...
11. **实例分析**:博客文章可能包含实际代码示例,演示如何创建JMS生产者和消费者,以及如何配置和使用消息服务器。 通过学习这些知识点,开发者可以掌握使用JMS构建双系统应用的基础,并能够根据实际项目需求进行...
在应用中,我们可以通过依赖注入的方式获取`JmsTemplate`实例,然后使用它来发送和接收消息。例如,发送一个字符串消息: ```java @Autowired private JmsTemplate jmsTemplate; public void sendMessage(String ...
- **ConnectionFactory**: 用于创建Connection实例,它是与JMS提供者建立连接的入口。 - **Connection**: 表示与JMS提供者的网络连接,可以创建Session。 - **Session**: 是线程安全的,用于创建Producer和...
总之,这个"JMS ActiveMQ演示代码"提供了学习和实践JMS与ActiveMQ集成的起点,通过分析和运行这个示例,你可以深入理解消息中间件在分布式系统中的作用,以及如何利用JMS和ActiveMQ实现高效、可靠的异步通信。
在“jmstest”这个压缩包中,我们可能找到一个简单的JMS应用实例。通常,这样的例子会包含生产者(Producer)、消费者(Consumer)以及可能的消息中间件(Message Broker)配置。生产者是发送消息的组件,而消费者则...