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 那么publishersubscriber 通過一個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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM