0

現在、私は Weblogic 10R3 による Java EE アプリケーション ホストを持っています。1 つのメッセージ駆動型 Bean をテストすることに興味があります。問題は、Bean がリッスンしている外部 JMS サーバーにアクセスできないことです。MDB コードは次のとおりです。

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");
    }
 }

私の計画は、Bean が JNDI によってキューをルックアップするためであり、私は Weblogic ホスティング サーバーにアクセスできます。したがって、外部 JMS サーバーを削除してから、正確な JNDI 名を保持するローカル jms キューと connectionFactory を追加できます。したがって、外部依存を分離します。

人々はそれがもっともらしいと思いますか?または誰かが別のアイデアを持っていますか? また、モッキングを使用して JMS への依存関係をまとめて分離することも考えていました。

どんな助けでも大歓迎です、ありがとう

メッセージ Bean が「ホット」スワップを処理できないことを示す Weblogic ログは次のとおりですか?

incomingSwiftFxProcessorMDB が JMS 宛先 IncomingSwiftFxQueue に接続できません。エラー: メッセージ駆動型 EJB は、JNDI 名: SwiftConnectionFactory で JMS 接続ファクトリーに接続しようとしました。ただし、JNDI 名が SwiftConnectionFactory のオブジェクトは JMS 接続ファクトリーではありません。NestedException メッセージは :weblogic.jms.client.JMSConnectionFactory> です

4

1 に答える 1

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")
})
于 2012-06-20T16:40:59.313 に答える