構成に Akka、Akka-Camel、Spring を使用してアプリケーションを作成しています。アプリケーションは、さまざまなアプリケーション サーバーに対してスタンドアロンの JMS クライアントとして機能する必要があります。そのためには、JNDI を使用して JMS 接続ファクトリを設定する必要があります。これをjBossでテストしています。私は jBoss 5 と 6 で同じ問題を抱えています (これは jBoss とは関係なく、クライアント側の Spring の問題のようです)。
この xml を使用して Spring Bean を構成しています。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:camel="http://camel.apache.org/schema/spring"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
">
<camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" disabled="true"/>
</camelContext>
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="ConnectionFactory">
<jee:environment>
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://192.168.0.109:1099
</jee:environment>
</jee:jndi-lookup>
<bean name="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
</beans>
ご覧のとおり、次のように設定しています。
- jmsConnectionFactory と呼ばれる、JNDI を介して初期化された ConnectionFactory
- connectionFactory プロパティが前の Bean に設定された JmsComponent
この構成では、私のアプリは起動時に次のように失敗します。
java.lang.IllegalArgumentException: connectionFactory must be specified
at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:294) ~[camel-core.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.createConnectionFactory(JmsConfiguration.java:1053) ~[camel-jms.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.getConnectionFactory(JmsConfiguration.java:416) ~[camel-jms.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.createListenerConnectionFactory(JmsConfiguration.java:1062) ~[camel-jms.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.getListenerConnectionFactory(JmsConfiguration.java:435) ~[camel-jms.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.configureMessageListenerContainer(JmsConfiguration.java:889) ~[camel-jms.jar:2.10.4]
at org.apache.camel.component.jms.JmsConfiguration.createMessageListenerContainer(JmsConfiguration.java:379) ~[camel-jms.jar:2.10.4]
これは、JmsConfiguration.java の次のコードに由来します。
protected ConnectionFactory createConnectionFactory() {
ObjectHelper.notNull(connectionFactory, "connectionFactory");
return null;
}
したがって、Spring Bean の初期化が、ここで指示されているように Bean の関連付け/配線に失敗しているようです (以前に貼り付けた完全な XML Spring 構成から抽出)。
<bean name="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
また、connectionFactory プロパティを直接設定する代わりに、中間 JmsConfiguration Bean を作成し、JmsComponent の構成プロパティを設定しようとしましたが、両方のセットアップで同じ結果が得られます。
ちなみに、ビーンはコードで配線できます。私はこれを意味します:
val connFactory = springContext.getBean[javax.jms.ConnectionFactory]("jmsConnectionFactory", classOf[javax.jms.ConnectionFactory])
camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connFactory))
完全に正常に動作します。したがって、JNDI から ConnectionFactory を取得していることはわかっていますが、XML で配線するための適切な Spring 構成をヒットできないだけです。
私はこのアプリケーションを再コンパイルせずに非常に構成可能にする必要があるため、XML を機能させることは私にとって必須です。
明確でない場合の質問は次のとおりです。JNDI が取得したファクトリに設定された connectionFactory を使用して、Spring に JmsComponent Bean を設定するにはどうすればよいですか?
編集:キャメルを使用するポイントは、このコンポーネントを別のタイプの別のコンポーネントと交換できるようにすることです。今日は JMS を使っていますが、明日は TCP を使うかもしれません。これが、すべてを XML で定義できることが重要な理由です。