Spring 3.0 DefaultMessageListenerContainerには尊敬されていませんか?
-
08-10-2019 - |
質問
JMSのスプリング構成をセットアップしました。物事は正常に動作しますが、怠zyな負荷をかけることができないようです(以下のコードでデフォルトの怠zyinitが真であることに注意してください)。以下の設定からJMScontainer(DMLC)にコメントすると、Lazy Loadingが予想どおりに機能します。それ以外の場合は、DMLCをインスタンス化し、キューと接続ファクトリを作成します。
何が足りないの?
jmscontext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true">
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
<prop key="java.naming.provider.url">t3:localhost:7001</prop>
</props>
</property>
</bean>
<bean id="queue" class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiTemplate-ref="jndiTemplate" p:jndiName="jms/queue"/>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiTemplate-ref="jndiTemplate" p:jndiName="jms/connectionfactory"/>
<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"
p:jndiTemplate-ref="jndiTemplate" p:cache="true" />
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:autoStartup="false"
p:destination-ref="queue"
p:destinationResolver-ref="jmsDestinationResolver"
p:connectionFactory-ref="connectionFactory"
p:messageListener-ref="queueListener" />
<bean id="queueListener" class="com.blah.QueueListener"/>
</beans>
そして、私がそれを運転するために使用しているテスト、dummytest.java:
package blah;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:jmsContext.xml")
public class DummyTest {
@Test
public void shouldDoSomething() {
}
}
JMScontainerがコメントアウトされると、上記のテストが合格します。そうでなければ、私はこれを取得します:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jmsContainer' defined in class path resource [com/blah/config/jmsContext.xml]:
Cannot resolve reference to bean 'connectionFactory' while setting bean property 'connectionFactory';
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'connectionFactory' defined in class path resource [com/blah/config/jmsContext.xml]:
Invocation of init method failed; nested exception is javax.naming.NameNotFoundException:
Exception in lookup.: `jms/connectionfactory' could not be found.
[Root exception is weblogic.corba.cos.naming.NamingContextAnyPackage.NotFound: IDL:weblogic/corba/cos/naming/NamingContextAny/NotFound:1.0]
「ConnectionFactory」Beanは、「JMScontainer」の依存関係としてインスタンス化され、失敗します。 「JMScontainer」がコメントしたため、「ConnectionFactory」はインスタンス化されません。
JMSコードは正常に動作しますが、JNDIの名前を意図的に名前に変更したので、時期がいつ始まるかがわかります。
解決
わかりました、これはかなりあいまいですが、 DefaultMessageListenerContainer
実装します Lifecycle
インターフェイス、およびこれを実装する豆は、コンテキストのライフサイクルに結び付けられます - コンテキストが起動するとき、 Lifecycle
- 実装する豆が初期化され、開始されます。これは、怠zyinit設定が本質的に無視されることを意味します。
他のヒント
解決策は、autostartupをfalseに使用することです。以下のコードを参照してください。
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
........
<property name="autoStartup" value="false"/>
</bean>
〜シャム