2012-06-20 160 views
0

目前我有一個由Weblogic 10R3的Java EE應用程序主機,我有興趣得到1消息驅動的Bean測試。問題是,我沒有訪問該Bean是聽外來JMS服務器,這裏是MDB代碼:JMS隊列「熱」交換

import static com.citi.primefinance.utils.jms.ForeignJMSConstants.Queue.INCOMING_QUEUE_SWIFT_FX; 
@MessageDriven(name = "IncomingSwiftFxProcessorMDB", mappedName = INCOMING_QUEUE_SWIFT_FX) 
public class IncomingSwiftFxProcessorMDB extends AbstractMessageDrivenBean { 
@Override 
protected void processMessage(Serializable obj) throws Exception{ 

    debug(this.getClass().getName() + ".processMessage()"); 

    if (obj instanceof String) { 
     info(this.getClass().getName() + ": received on Message object"); 
     processSwiftFxTradeMessage((String)obj); 
    } else { 
     error(this.getClass().getName() + ": received an object " + obj + " which is not a TextMessage"); 
    } 
} 

我的計劃是因爲豆將查找隊列通過JNDI,和我有權訪問Weblogic託管服務器。所以我可以刪除外部JMS服務器,然後添加一個本地jms隊列和持有確切JNDI名稱的connectionFactory。因此隔離外部依賴性。

有人認爲這是合理的嗎?或者任何人有其他想法?我也在考慮使用Mocking將JMS的依賴關係分離出來。

任何幫助深表感謝,感謝

下面是一些Weblogic的記錄,指示信息的Bean無法處理「熱」掉呢?

incomingSwiftFxProcessorMDB無法連接到JMS目標:IncomingSwiftFxQueue。錯誤爲: 消息驅動的EJB嘗試使用JNDI名稱:SwiftConnectionFactory連接到JMS連接工廠。但是,具有JNDI名稱的對象:SwiftConnectionFactory不是JMS連接工廠。 NestedException消息是:weblogic.jms.client.JMSConnectionFactory>

+0

順便說一句,外國隊列的供應商是websphere-mq,我猜想在本地創建的隊列將是weblogic.jms.queue。我是MessageDriven Bean的新手,我想它可以處理差異? –

回答

0

最終,您應該在JMS接口的上下文之外測試您的業務邏輯。否則,是的 - 這是可行的。 WebLogic中的外部JMS服務器只是遠程JMS目標的本地JNDI表示。

但是,您不必刪除外部配置 - 只需將其從服務器/羣集中解除即可。然後,使用與當前用於訪問外部資源相同的JNDI名稱創建包含JMS隊列(和ConnectionFactory,如果適用)的JMS模塊,並且可以測試您的MDB。完成之後,您可以取消用於測試的JMS模塊,並將外部JMS服務器重新定位到適當的資源。

這可能是好的,保持了「測試」 JMS模塊周圍,所以你可以很容易地在未來再次測試:)

嘗試更新它看起來像這一點,並實現MessageListener接口:

@MessageDriven(
messageListenerInterface = javax.jms.MessageListener.class, 
name = "MyListener", 
mappedName = "jms/my/notification", 
activationConfig = { 
    @ActivationConfigProperty(
     propertyName = "connectionFactoryJndiName", 
     propertyValue = "weblogic.jms.XAConnectionFactory"), 
    @ActivationConfigProperty(
     propertyName = "destinationType", 
     propertyValue = "javax.jms.Queue") 
}) 
+0

嘿傑夫,untarget確實比刪除更好。在設置本地JMS模塊之後,Bean似乎有困難,我在我的文章中包含了一些weblogic日誌。請幫助 –

+0

它看起來像連接工廠和隊列上的JNDI名稱配置不正確。發佈您的MDB代碼給我看... –

+0

嘿傑夫,MDB代碼更新,非常感謝您的幫助 –