jms中topic和queue的区别

 

一:Jboss的环境配置(略)

二:开发环境jboss-4.2.2.GA+JDK1.6

三: JMS 简单介绍

1. 当你发送一个消息,你不能直接发送到对此消息感兴趣的接受者。而是你发送到一个目的地。对此消息感兴趣的接受者必须连接到目的地,得到此消息或在目的地设置订阅。

2. 在JMS中有两种域:topics 和queues 。

一个消息发送到一个topics ,可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher,消息接受者叫做subscriber。

queue 是另外一种方式,仅仅允许一个消息传送给一个客户。一个发送者将消息放在消息队列中,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能在得到它。

为了能发送和接收消息,必须得到一个JMS连接。该连接是使用JMS Provider得到连接的,在得到连接之后,建立一个会话(Session)。然后再建立publisher/sender 来发送消息或subscriber/receiver来接收消息。 运行时,如果使用topic 那么publisher或subscriber 通过一个topic来关联,如果使用queue ,则sender 或receiver通过queue来关联起来。

3. 在JMS框架中运转的方法如下:

(1) 得到一个JNDI初始化上下文(Context);

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);

(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);

(4) 通过连接来建立一个会话(Session);

(5) 查找目的地(Topic/ Queue);

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/ QueueReceiver).

四:代码分析

1) 初始化上下文

配置JNDI的一个方法是通过属性文件jndi.properties。在这个文件中使用正确的值,并且把它所在的路径包含到classpath中,它比较容获得正确初始化上下文。 jndi.properties文件的内容如下:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

把该文件放置的路径成为你的classpath的一部分。

2) 查找连接工厂

查找连接工厂的代码如下: 对于一个topic目的地

TopicConnectionFactory topicFactory = (TopicConnectionFactory) context.lookup (“ConnectionFactory”)

Queue 目的地: QueueConnectionFactory queueFactory = (QueueConnectionFactory ) context.lookup (“ConnectionFactory”)

3) 建立连接和会话。

对于topic代码如下: //建立一个连接

topicConnection = topicFactory.createTopicConnection();

//建立一个会话

topicSession = topicConnection.createTopicSession(false, //不需要事务 Session.AUTO_ACKNOLEDGE //自动接收消息的收条。);

对于queue代码如下: //建立一个连接

queueConnection = queueFactory.createQueueConnection();

//建立一个会话

queueSession = queueConnection .createQueueSession(false, //不需要事务 Session.AUTO_ACKNOLEDGE //自动接收消息的收条。 );

4) 查找目的地

对于topic 查找一个testTopic目的地

Topic topic = (Topic) context.lookup(“topic/testTopic”);

对于queue 查找一个testQueue目的地 Queue queue= (Queue) context.lookup(“queue/testQueue”);

(5)建立一个消息制造者Message Producer (topic publisher/ queue sender) 消息制造者是一个由session创建的对象,主要工作是发送消息到目的地。

对于一个topic,需要通过TopicSession来创建一个TopicPublisher。代码如下: TopicPublisher topicPublisher = TopicSession.createPublisher(topic);

对于一个queue,需要通过QueueSession来创建一个QueueSender。代码如下: QueuePublisher queuePublisher = queueSession.createSender(queue);

6) 消息发送

建立一个TestMessage并且publish 它, 代码:

TextMessage message = topicSession.createTestMessage(); message.setText(msg); topicPublishe.publish(topic, message);

建立一个TestMessage并且send它,代码:

TextMessage message= queueSession.createTestMessage(); message.setText(msg); queueSender.send(queue, message);

猜你喜欢

转载自blog.csdn.net/syq8023/article/details/89715848