1

スタンドアロン環境でSpring3.1を使用しています。

私はこのようにjmsテンプレートでトピックを設定しました:

<bean id="mm1sessionsTopicSendingTemplate" class="org.springframework.jndi.JndiObjectFactoryBean"
    depends-on="jmsServerManagerImpl">
    <property name="jndiName">
        <value>/topic/mm1sessionsTopic</value>
    </property>
</bean>

このトピックでは、DefaultMessageListenerContainerを使用してMDBを次のように設定します。

<bean id="mm1sessionDispatcherListener"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="pubSubDomain" value="true" />
        <property name="concurrentConsumers" value="1" />
        <property name="destination" ref="mm1sessionsTopicSendingTemplate" />
        <property name="messageListener" ref="mm1SessionMDB" />
        <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
    </bean>

このように、xmlを介してmm1SessionMDBを高度に設定する必要があります。

<bean id="mm1SessionMDB" class="com.mdb.SessionMDB">
        <property name="feedPropertiesDTO" ref="feedListenerMarketMaker1Properties" />

    </bean>

ただし、プログラムでMDBインスタンスを作成するにはアプリケーションが必要です。

つまり、コードを介してmdbを作成する必要があります。これは、各MDBが、ト​​ピックから(feedPropertiesDTOを介して)取得するメッセージに対して異なる検証値を持つためです。

基本的に、同じロジックのMDBのプールがありますが、それぞれに異なるプロパティがあります。MDBの作成時間は実行時でなければなりません。

それは可能ですか?

ありがとう、レイ。

4

1 に答える 1

0

MDB Beanをインスタンス化するためのファクトリメソッドを使用して、メソッドを使用できると思います

Object getBean(String name, Object... args) throws BeansException;

コード内のApplicationContextを使用して、Beanをフログラム的にインスタンス化します。

私が知っているように、このメソッドを使用すると、引数をファクトリメソッドにパスできます。

このメソッドのJavadocで言われていることは次のとおりです。

指定されたBeanのインスタンス(共有または独立)を返します。

Bean定義で指定されたデフォルトの引数(存在する場合)をオーバーライドして、明示的なコンストラクター引数/ファクトリメソッド引数を指定できます。

私はこのアプローチを使用したことはありませんが、あなたの場合はうまくいくと思います。

編集。

これは私が話していることを示す例です(それは非常に単純ですが、もっと複雑に書くのに十分な時間がありません)。

インターフェイスと2つの実装があるとします。

public interface StringMakerInterface {

    // Just return simple String depending on concrete implementation.
    String returnDummyString();

}

public class StringMakerImpl1 implements StringMakerInterface {

    public String returnDummyString() {
        return "test bean impl 1";
    }


}

public class StringMakerImpl2 implements StringMakerInterface{

    public String returnDummyString() {
        return "test bean impl 2";
    }

}

そして、このインターフェースの具体的な実装を使用し、具体的な実装を動的に注入する必要があるクラスが1つあります。

public class StringPrinter {

    private StringMakerInterface stringMaker;

    public StringMakerInterface getStringMaker() {
        return stringMaker;
    }

    public void setStringMaker(StringMakerInterface stringMaker) {
        this.stringMaker = stringMaker;
    }

    public StringPrinter() {

    }

    // Just print dummy string, returned by implementation
    public void printString() {
        System.out.println(stringMaker.returnDummyString());
    }
}

これが私の例の構成クラスです。

@Configuration
public class TestFactoryMethodConfig {

    @Bean(name = "stringMaker1")
    public StringMakerImpl1 stringMaker1() {
        return new StringMakerImpl1();
    }

    @Bean(name = "stringMaker2")
    public StringMakerImpl2 stringMaker2() {
        return new StringMakerImpl2();
    }

    @Bean(name = "stringPrinter")
    @Scope(value = "prototype")
    public StringPrinter stringPrinter(@Qualifier("stringMaker1") StringMakerInterface stringMaker) {
        StringPrinter instance = new StringPrinter();
        instance.setStringMaker(stringMaker);

        return instance;
    }
}

そして、これが実行時のダイナミカルインジェクションを示すテストケースです。

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestFactoryMethodConfig.class})
public class TestFactoryMethod {

    @Autowired
    private ApplicationContext applicationContext;

    @Resource(name = "stringMaker1")
    private StringMakerInterface stringMaker1;

    @Resource(name = "stringMaker2")
    private StringMakerInterface stringMaker2;

    @Test
    public void testFactoryMethodUsage() {

        StringPrinter stringPrinter1 = (StringPrinter) applicationContext.getBean("stringPrinter", stringMaker1);

        StringPrinter stringPrinter2 = (StringPrinter) applicationContext.getBean("stringPrinter", stringMaker2);

        stringPrinter1.printString();
        stringPrinter2.printString();
    }

}
于 2012-07-12T08:37:04.973 に答える