没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
目录
深入掌握 JMS(一):JSM 基础 .......................................................................................................... 2
深入掌握 JMS(二):一个 JMS 例子 ................................................................................................. 3
深入掌握 JMS(三):MessageListener ............................................................................................. 4
深入掌握 JMS(四):实战 Queue ...................................................................................................... 5
深入掌握 JMS(五):实战 Topic ........................................................................................................ 7
深入掌握 JMS(六):消息头 .............................................................................................................. 9
深入掌握 JMS(七):DeliveryMode 例子 ......................................................................................... 10
深入掌握 JMS(八):JMSReplyTo .................................................................................................. 13
深入掌握 JMS(九):Selector .......................................................................................................... 15
深入掌握 JMS(十):JMSCorrelationID 与 Selector ....................................................................... 17
深入掌握 JMS(十一):TemporaryQueue 和 TemporaryTopic ....................................................... 19
深入掌握 JMS(十二):MDB ........................................................................................................... 21
深入掌握 JMS(一):JSM 基础
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 例子
前一讲简单的介绍了一下 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());
}
}
深入掌握 JMS(三):MessageListener
消息的消费者接收消息可以采用两种方式:
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(四):实战 Queue
Queue 实现的是点到点模型,在下面的例子中,启动 2 个消费者共同监听一个 Queue,然后循环给这个 Queue
中发送多个消息,我们依然采用 ActiveMQ。
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
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 QueueTest {
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
//创建一个 Queue
Queue queue = new ActiveMQQueue("testQueue");
//创建一个 Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//注册消费者 1
MessageConsumer comsumer1 = session.createConsumer(queue);
comsumer1.setMessageListener(new MessageListener(){
public void onMessage(Message m) {
try {
System.out.println("Consumer1 get " + ((TextMessage)m).getText());
} catch (JMSException e) {
剩余22页未读,继续阅读
资源评论
jhdjhdjhd
- 粉丝: 1
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功