深入掌握JMSWord下载.docx
《深入掌握JMSWord下载.docx》由会员分享,可在线阅读,更多相关《深入掌握JMSWord下载.docx(18页珍藏版)》请在冰豆网上搜索。
![深入掌握JMSWord下载.docx](https://file1.bdocx.com/fileroot1/2023-1/6/c7db7294-5c56-4b4b-90d9-ae7f739390b9/c7db7294-5c56-4b4b-90d9-ae7f739390b91.gif)
至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。
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
MessageConsumer
那么可能有人会问:
ConnectionFactory和Destination从哪儿得到?
这就和JMS提供者有关了.如果在一个JavaEE环境中,可以通过JNDI查找得到,如果在一个非JavaEE环境中,那只能通过JMS提供者提供给我们的接口得到了.
深入掌握JMS
(二):
一个JMS例子
前一讲简单的介绍了一下JMS的基本概念,这一讲结合一个例子让大家深入理解前一讲的基本概念.首先需要做的是选择一个JMS提供者,如果在JavaEE环境中可以不用考虑这些.我们选择ActiveMQ,官方地址:
http:
//activemq.apache.org/.网上有很多介绍ActiveMQ的文档,所以在这里就不介绍了.
按照上一讲的这个简图,
首先需要得到ConnectionFactoy和Destination,这里创建一个一对一的Queue作为Destination。
ConnectionFactoryfactory=newActiveMQConnectionFactory("
vm:
//localhost"
);
Queuequeue=newActiveMQQueue("
testQueue"
然后又ConnectionFactory创建一个Connection,再启动这个Connection:
Connectionconnection=factory.createConnection();
connection.start();
接下来需要由Connection创建一个Session:
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE)
现在暂且不用管参数的含义,以后会详细讲到.
下面就可以创建Message了,这里创建一个TextMessage。
Messagemessage=session.createTextMessage("
HelloJMS!
"
要想把刚才创建的消息发送出去,需要由Session和Destination创建一个消息生产者:
MessageProducerproducer=session.createProducer(queue);
下面就可以发送刚才创建的消息了:
producer.send(message);
消息发送完成之后,我们需要创建一个消息消费者来接收这个消息:
MessageConsumercomsumer=session.createConsumer(queue);
MessagerecvMessage=comsumer.receive();
消息消费者接收到这个消息之后,就可以得到它的内容:
System.out.println(((TextMessage)recvMessage).getText());
至此,一个简单的JMS例子就完成了。
下面是全部源码
:
importjavax.jms.Connection;
importjavax.jms.Message;
importjavax.jms.MessageConsumer;
importjavax.jms.MessageProducer;
importjavax.jms.Queue;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importorg.apache.activemq.ActiveMQConnectionFactory;
importmand.ActiveMQQueue;
publicclassMessageSendAndReceive{
publicstaticvoidmain(String[]args)throwsException{
finalSessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
System.out.println("
SendMessageCompleted!
}
}
深入掌握JMS(三):
MessageListener
消息的消费者接收消息可以采用两种方式:
1、consumer.receive()或consumer.receive(inttimeout);
2、注册一个MessageListener。
采用第一种方式,消息的接收者会一直等待下去,直到有消息到达,或者超时。
后一种方式会注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。
下面举例说明:
MessageConsumercomsumer=session.createConsumer(queue);
comsumer.setMessageListener(newMessageListener(){
@Override
publicvoidonMessage(Messagem){
TextMessagetextMsg=(TextMessage)m;
try{
System.out.println(textMsg.getText());
}catch(JMSExceptione){
e.printStackTrace();
});
深入掌握JMS(四):
实战Queue
Queue实现的是点到点模型,在下面的例子中,启动2个消费者共同监听一个Queue,然后循环给这个Queue中发送多个消息,我们依然采用ActiveMQ。
importjavax.jms.DeliveryMode;
importjavax.jms.JMSException;
importjavax.jms.MessageListener;
publicclassQueueTest{
ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory("
//创建一个Queue
//创建一个Session
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//注册消费者1
MessageConsumercomsumer1=session.createConsumer(queue);
comsumer1.setMessageListener(newMessageListener(){
Consumer1get"
+((TextMessage)m).getText());
//注册消费者2
MessageConsumercomsumer2=session.createConsumer(queue);
comsumer2.setMessageListener(newMessageListener(){
Consumer2get"
//创建一个生产者,然后发送多个消息。
for(inti=0;
i<
10;
i++){
producer.send(session.createTextMessage("
Message:
+i));
运行这个例子会得到下面的输出结果:
Consumer1getMessage:
Consumer2getMessage:
1
2
3
4
5
6
7
8
9
可以看出每个消息直被消费了一次,但是如果有多个消费者同时监听一个Queue的话,无法确定一个消息最终会被哪一个消费者消费。
深入掌握JMS(五):
实战Topic
与Queue不同的是,Topic实现的是发布/订阅模型,在下面的例子中,启动2个消费者共同监听一个Topic,然后循环给这个Topic中发送多个消息。
importjavax.jms.Topic;
importmand.ActiveMQTopic;
publicclassTopicTest{
//创建一个Topic
Topictopic=newActiveMQTopic("
testTopic"
MessageConsumercomsumer1=session.createConsumer(topic);
MessageConsumercomsumer2=session.createConsumer(topic);
MessageProducerproducer=session.createProducer(topic);
运行后得到下面的输出结果: