2011-05-12 36 views
0

嗨,我是j2ee編碼新手。我的問題是關於MDB。 我已經建立了我的weblogic 11g服務器。並且隊列已經建立。EJB3.0如何使用MDB

我已經寫了客戶端代碼,它是一個java se客戶端,向隊列發送消息。

import java.util.Hashtable; 
import java.util.Properties; 

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.Context; 
import javax.naming.InitialContext; 

public class MyMDBClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     QueueConnection cnn = null; 
      QueueSender sender = null; 
      QueueSession session = null; 
      InitialContext ctx; 
      Hashtable ht = new Hashtable(); 

      try { 
       ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
       ht.put(Context.PROVIDER_URL,"t3://localhost:7001"); 

       ctx = new InitialContext(ht); 
       Queue queue = (Queue) ctx.lookup("jms/testQueue"); 
       QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("jms/connectionFactory"); 
       cnn = factory.createQueueConnection(); 
       session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
       TextMessage msg = session.createTextMessage(); 
       msg.setText("helloworld"); 
       sender = session.createSender(queue); 
       sender.send(msg); 

       System.out.println("Message sent successfully to remote queue."); 
       session.close(); // this is important. 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
    } 
} 

我可以在我的weblogic管理控制檯上看到隊列中的消息。

但是,我的mdb在服務器端沒有被調用。

誰能告訴我什麼是錯的。我更喜歡解決方案是在Java註釋。謝謝大家閱讀這個。

這裏是我的服務器代碼:

/** 
* import 
* 
*/ 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 

import weblogic.ejbgen.*; 


/** 
* Message-Driven Bean implementation class for: MyMDB 
* 
*/ 
@MessageDriven(ejbName="mdb", destinationType="javax.jms.queue",destinationJndiName="jms/testQueue" ) 
public class mdb implements MessageListener { 

    /** 
    * Default constructor. 
    */ 
    public mdb() { 
    } 

    /** 
    * @see MessageListener#onMessage(Message) 
    */ 
    public void onMessage(Message message) { 
     TextMessage tmsg = null; 
     tmsg = (TextMessage) message; 

     System.out.println("----------------"); 
     System.out.println("Received message : ");   
     try { 
      System.out.println(tmsg.getText()); 
     } catch (JMSException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.out.println("----------------");   
    } 
} 

回答

1

這裏是我有一個MDB註釋是工作的一個例子:

@MessageDriven(
    messageListenerInterface = javax.jms.MessageListener.class, 
    name = "EventQueueListenerMDB", 
    mappedName = Constants.EVENT_QUEUE_JNDI, 
    activationConfig = { 
      @ActivationConfigProperty(
        propertyName = "connectionFactoryJndiName", 
        propertyValue = Constants.CONNECTION_FACTORY_JNDI), 
      @ActivationConfigProperty(
        propertyName = "destinationType", 
        propertyValue = "javax.jms.Queue") 
    }) 

而且,看來你的javax。 jms.queue不是javax.jms.Queue。

+0

嘿傑夫。是的,這是問題之一。另一個問題是我沒有將我的ejb項目打包到耳邊。不管怎麼說,多謝拉! :) – 2011-05-13 08:55:18

+0

要點什麼應該指向connectionFactoryJndiName?連接工廠或目標資源? – adrift 2012-06-18 14:50:11

+0

我在部署日誌時收到了類似以下內容:[#| 2012-06-18T17:54:36.537 + 0300 | WARNING | sun-appserver2.1 | javax.enterprise.resource.resourceadapter | _ThreadID = 33; _ThreadName = Thread-550; setConnectionFactoryJndiName; com.sun.messaging.jms.ra.ActivationSpec; _RequestID = 75481082-f7b6-414b-b52e-f9558d6597ff; | RAR8000:setConnectionFactoryJndiName方法不存在於類中:com.sun.messaging.jms .ra.ActivationSpec |#] – adrift 2012-06-18 14:56:15