EJB3 中Message-Driven Bean的開發過程及其工作原理

nym2 12年前發布 | 2K 次閱讀 CCleaner Windows Node.js

        JBoss6.0 + EJB3 中Message-Driven Bean 的"HelloWorld" 實現。

        目的:了解 EJB3 中Message-Driven Bean的開發過程及其工作原理。

        開發步驟:

                1)開發服務端。編寫Message-Driven Bean類。

                2)配置并發布Message-Driven Bean到JBoss服務器。

                3)開發消息客戶端。

        項目結構預覽:

                1)服務端項目結構:

                         EJB3 中Message-Driven Bean的開發過程及其工作原理

                2)客戶端項目結構:

                              EJB3 中Message-Driven Bean的開發過程及其工作原理

        開發過程及詳細代碼:

                1)DMBQueueBean


package com.ejb;

import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage;

@MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue") }) public class MDBQueueBean implements MessageListener {

@Override
public void onMessage(Message message) {
    try {
        TextMessage textMessage = (TextMessage)message;
        System.out.println("MDBQueueBean被調用=====收到消息: "+textMessage.getText());
        } catch (JMSException e) {
        e.printStackTrace();
    }
}

}</pre>


                2)DMBTopicBean


package com.ejb;

import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage;

@MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName="destination",propertyValue="topic/mytopic") }) public class DMBTopicBean implements MessageListener {

@Override
public void onMessage(Message message) {
    try {
        TextMessage textMessage = (TextMessage)message;
        System.out.println("MDBTopicBean被調用=====收到主題: "+textMessage.getText());
        } catch (JMSException e) {
        e.printStackTrace();
    }
}

}</pre>


                3)在JBoss6.0安裝目錄下(如:D:\jboss\server\default\deploy\hornetq)找到hornetq-jms.xml文件,并把如下內容添加到該配置文件中。


      


                4)DMBQueueBeanTest

                

package com.ejb.messagedriven;

import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.naming.InitialContext;

public class DMBQueueBeanTest {

public static void main(String[] args) throws Exception {
    InitialContext ctx = new InitialContext();

    // 獲取ConnectionFactory對象
    QueueConnectionFactory factory = (QueueConnectionFactory) ctx
            .lookup("ConnectionFactory");

    // 創建QueueConnection對象
    QueueConnection connection = factory.createQueueConnection();

    // 創建QueueSession對象,第一個參數表示事務自動提交,第二個參數標識一旦消息被正確送達,將自動發回響應
    QueueSession session = connection.createQueueSession(false,
            QueueSession.AUTO_ACKNOWLEDGE);

    // 獲得Destination對象
    Queue queue = (Queue) ctx.lookup("queue/myqueue");

    // 創建文本消息
    TextMessage msg = session.createTextMessage("你好,這是一個隊列消息! ");

    // 創建發送者
    QueueSender sender = session.createSender(queue);

    // 發送消息
    sender.send(msg);

    // 關閉會話
    session.close();

    connection.close();

    System.out.println("消息已發送!");
}

}</pre>

                5)DMBTopicBeanTest



package com.ejb.messagedriven;

import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.naming.InitialContext;

public class DMBTopicBeanTest {

public static void main(String[] args) throws Exception {
    InitialContext ctx = new InitialContext();

    // 獲取ConnectionFactory對象
    TopicConnectionFactory factory = (TopicConnectionFactory) ctx
            .lookup("ConnectionFactory");

    // 創建TopicConnection對象
    TopicConnection connection = factory.createTopicConnection();

    // 創建TopicSession對象,第一個參數表示事務自動提交,第二個參數標識一旦消息被正確送達,將自動發回響應
    TopicSession session = connection.createTopicSession(false,
            TopicSession.AUTO_ACKNOWLEDGE);

    // 獲得Destination對象
    Topic topic = (Topic) ctx.lookup("topic/mytopic");

    // 創建文本消息
    TextMessage msg = session.createTextMessage("你好,這是一個主題消息! ");

    // 創建發布者
    TopicPublisher publisher = session.createPublisher(topic);

    // 發送消息
    publisher.publish(msg);

    // 關閉會話
    session.close();

    connection.close();

    System.out.println("消息已發送!");
}

}</pre>


                6)jndi.properties

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

              

              7)測試:

                        1.測試DMBQueueBean

                                控制臺中客戶端輸出:

2012-10-30 18:56:03  INFO  createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0
消息已發送!

                                控制臺中服務端輸出:

18:55:50,487 INFO  [org.jboss.ejb3.EJBContainer] STARTED EJB: com.ejb.MDBQueueBean ejbName: MDBQueueBean
18:55:50,487 WARN  [org.jboss.ejb3.TimerServiceContainer] EJBTHREE-2193: using deprecated TimerServiceFactory for restoring timers
18:56:05,231 INFO  [STDOUT] MDBQueueBean被調用=====收到消息: 你好,這是一個隊列消息!

                         2.測試DMBTopicBean

                                控制臺中客戶端輸出:

2012-10-30 18:57:14  INFO  createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0
消息已發送!

                                控制臺中服務端輸出:

18:57:54,235 INFO  [STDOUT] MDBTopicBean被調用=====收到主題: 你好,這是一個主題消息!



 本文由用戶 nym2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!