1

しばらく前に、JMS リスナー (メッセージを受信するため) を標準の webapps に使用しました。通常は、webapp には JSF (ICEfaces) を使用し、JMS 統合には spring、activemq などを使用します。

今、私は OpenXava アプリケーションに同じことをしようとしています。だから、これは私が現時点で行ったことです:

  • このコンテンツ (OpenXava によって web.xml に自動追加されるコンテンツ) を使用して、listeners.xml を WEB-INF (web.xml と同じ場所、OpenXava のために変更できません) に作成しました。

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>  
        classpath:applicationContext.xml
    </param-value>  
</context-param>

  • 次の内容で、applicationContext.xml を作成しました (OpenXava アプリケーションの src フォルダーと WEB-INF に配置することをテストしました)。

    <!-- Create the topic to connect to -->
    <bean id="TTCTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <property name="physicalName" value="com.comp.app.message.tags"/>
    </bean>
    
    <!-- JMS Connection Factory -->
    <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://127.0.0.1:1100"/>
    </bean>
    
    <!-- Spring Helper to listen to a JMS Destination -->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="TTCTopic" />
        <property name="messageListener" ref="messageReceiver" />
    </bean>
    

  • 次に、JMS MessageListener インターフェイスを実装し、受信したメッセージを処理するコードを含むリスナー クラス (com.comp.app.listeners.MessageReceiver) を作成しました。

  • また、OpenXava アプリケーションの WEB-INF/Lib に spring および activemq jar を配置し、各 jar のプロジェクトのクラスパスに参照を追加しました。

最後に、エラーは発生しません。

結局、問題は次のとおりです。Springコンテキストが想定どおりにOpenXava web.xmlに追加されていません...Springコンテキストが作成されていないため、JMSリスナーが作成されません。

それで、私はここで何が欠けていますか?...これを行うより良い方法はありますか?

前もって感謝します、

4

3 に答える 3

0

まあ、それは私の質問に対する本当の答えではないかもしれませんが、Spring コンテキストを OpenXava アプリケーション用に作成する方法が見つからなかったので (ActiveMQ 定義と Spring コンテナーを使用した DI に必要です)、Spring の依存関係をやめることにしました。そのままActiveMQを進めます。したがって、JMS ブローカーへの接続を作成し、特定のトピックを使用してリスナーを登録および開始する Consumer クラスの作成に進みました。このリスナーは、xml マーシャリングされたメッセージを受信し、メイン プロセス用に非マーシャリングする準備ができていました。

OpenXava のドメイン駆動設計の性質のため、構成を他のものと混同しないようにしました。Spring コンテナーを OX アプリに構成できなかったので、この新しい方法はそれほど手間をかけずに機能しました。また、一般的な (アプリケーション) コントローラーに新しい「開始時」アクションを作成しました。これは、シングルトン パターンを使用して、メッセージを待機するブローカーと JMS リスナーへの接続のセッションを維持します。

現在、そのリスナーを統合して特定の一時的なビューを OpenXava アプリケーションに更新する方法を探していますが、これはややこしいものになっています。しかし、それは新しいスレッドのためのものです。

于 2012-12-17T19:38:40.177 に答える
0

WEB-INF を明示的に指摘してみてください。

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

ただし、公式ドキュメントでは、これを web.xml に直接追加することが指摘されています。

于 2012-12-17T06:04:19.490 に答える
0

私のアドバイスは、非常に単純な OpenXava プロジェクトを作成し、Spring 統合の手順に順を追って従うことです。それが機能したら、実際のプロジェクトに対して試すことができます。

ただし、Spring を使用しないという選択肢の方が優れています。

于 2012-12-19T12:53:36.600 に答える