0

MDB を使用して、WebLogic 11b (10.3.4) 上に構築されたアプリケーションがあります。これらをSpring MDPに変換しようとしています。問題の MDB は次のとおりです。

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "ejbName", propertyValue = "RecipientEventRouterBean"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable") })
public class RecipientEventRouterBean extends TraxMessageRouter {

    @Resource
    private int appInstance;

    @Resource
    private String appName;

    @Resource(mappedName = "jms/TraxErrorQ")
    private Queue errorQueue;

    @Resource(name = "TraxCF")
    private ConnectionFactory errorQueueConnectionFactory;

    @EJB
    private Logger loggingService;

    @Resource
    private int maxJMSXDeliveryCount;

    @Resource
    private boolean validate;

    @EJB
    protected RecipientRegistrationService recService;

    @Override
    @PostConstruct
    public void init() {

        if (appName == null) {
            throw new EJBException("appName is null");
        }

        try {
            super.traxFactory = TraxFactory.getInstance(Application.fromValue(appName));
            super.processor = new ObjectFactory().createApplicationInstance();
            super.processor.setName(appName);
            super.processor.setInstance(this.appInstance);
            super.errorQueueConnectionFactory = this.errorQueueConnectionFactory;
            super.errorQueue = this.errorQueue;
            super.maxJMSXDeliveryCount = this.maxJMSXDeliveryCount;
            super.validate = this.validate;
            super.loggingService = this.loggingService;
        } catch (Exception e) {
            throw new EJBException(e);
        }

        super.init();
    }

    @Override
    protected TraxMessageService getTraxMessageService() {

        return recService;
    }

}

MDB の親である TraxMessageRouter は、MessageListener インターフェイスを実装します。

jms-applicationContext.xml で MDP Bean を作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- Spring JMS Destination Resolver -->
    <bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
        <property name="cache" value="true" />
    </bean>


    <!-- Spring JMS Queue Connection Factory leveraging a single connection -->
    <!-- SingleConnectionFactory will return the same Connection on all createConnection calls and ignore calls to close -->
    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jms/TraxCF" />
    </bean>

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destinationResolver" ref="jmsDestinationResolver" />
    </bean>

    <bean id="jmsSender" class="com.mycompany.web.service.jms.JMSSender">
        <property name="jmsTemplate" ref="jmsTemplate" />
    </bean>

    <bean id="jmsReceiver" class="com.mycompany.web.service.jms.JMSReceiver">
        <property name="jmsTemplate" ref="jmsTemplate" />
    </bean> 

    <bean id="jmsQueue" class="javax.jms.Topic" />  

    <!-- this is the Message Driven POJO (MDP) -->
    <bean id="messageListener" class="com.mycompany.messaging.RecipientEventRouterBean" />

    <!-- and this is the message listener container -->
    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="jmsQueue"/>
        <property name="messageListener" ref="messageListener" />
    </bean>
</beans>

@MessageDriven アノテーションを適切な Spring 構文に変換するにはどうすればよいですか? 今コメントアウトしてもいいですか?

さらにいくつかの EventRouterBeans があります。それらはすべて jms-ApplicationContext.xml で Bean 宣言を取得しますか、それとも親の TraxMessageRouter を xml に追加できますか?

構成ファイルに対して他にどのような変更を行う必要がありますか? MDB から MDP への移行方法に関する適切なガイドはありますか? EJB 3 から Spring への移行方法に関する適切なガイドはありますか?

4

1 に答える 1

1

私にはほとんど問題ないように見えます。いくつかのヒントを次に示します。

  • はい、@MessageDrivenコンテナーを既に構成しているため、注釈を削除できます
  • あなたの豆jmsQueueは間違っています。weblogic を使用しているため、JNDI を使用してキューを検索するか (接続ファクトリの場合と同様)、プロパティを使用してキューの (jndi) 名を指定する必要があります (これは aではなく adestinationNameを受け入れます) 。Stringjavax.jms.Destination

デプロイするメッセージ リスナーごとに 1 つの宣言が必要です。これらの設定を共有するには、おそらく xml 名前空間ルートを使用する必要がありますか?

<jms:listener-container connectionFactory="connectionFactory" 
                        destinationResolver="jmsDestinationResolver">
    <jms:listener ... />
    <jms:listener ... />
</jms:listener-container>

これにより、2 つのリスナー コンテナが作成されます (つまり、jms:listenerエントリごとに 1 つのコンテナ)。

また、Spring 4.1 では、任意の Spring 管理 Bean のメソッドにアノテーションを付けることができる、より優れた宣言型アプローチが提供されることにも注意してください。詳細については、このブログ投稿を確認してください。4.1.0.RC2 がリリースされたので、今すぐ試すことができます。

于 2014-08-20T11:14:01.950 に答える