一: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);