0

JBoss 5.1 サーバー上で実行されるSpring 3.0.5フレームワークに基づくアプリケーションがあります。

このチュートリアルに従おうとしましたが、 JBossMQ (デフォルトの JBoss 5.1 ブローカー)の代わりにActiveMQブローカーを使用します。

JBoss 構成 (destinations-service.xml) でMyQueueというキューを既に設定しています。

<mbean code="org.jboss.jms.server.destination.QueueService"
  name="jboss.messaging.destination:service=Queue,name=MyQueue"
  xmbean-dd="xmdesc/Queue-xmbean.xml">
  <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  <depends>jboss.messaging:service=PostOffice</depends>

残りの構成は以下で確認できます。私は何が欠けていますか?キューの JNDI 名と接続ファクトリーを指定するにはどうすればよいですか? また、サーバー アドレス ([ConnectionFactory] ​​Connector bisocket://localhost:4457) はどうでしょうか。

applicationContext.xml の私の設定は次のとおりです。

<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" />

<bean id="messageDestination" class="javax.jms.Queue" />

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="receiveTimeout" value="10000" />
</bean>

<bean id="springJmsProducer" class="myPackage.QueueProducer">
    <property name="destination" ref="messageDestination" />
    <property name="jmsTemplate" ref="jmsTemplate" />
</bean> 

<bean id="messageListener" class="myPackage.QueueConsumer" />

私のプロデューサー


 public class QueueProducer {

    private JmsTemplate jmsTemplate;

    private Queue queue;

    public void setConnectionFactory(ConnectionFactory cf) {
        this.jmsTemplate = new JmsTemplate(cf);
    }

    public void setQueue(Queue queue) {     
        this.queue = queue;
    }

    public void send(Object object) {
        this.jmsTemplate.send(this.queue, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
              return session.createTextMessage("my text to send");
            }
        });
    }
}

私の消費者




public class QueueConsumer implements MessageListener {

    @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                System.out.println(((TextMessage) message).getText());
            }catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
        else {
            throw new IllegalArgumentException("Message must be of type TextMessage");
        }

    }
}
4

1 に答える 1

1

あなたが望むのは、最も可能性が高いjndiTemplateです。jmsTemplateまた、 Bean を正しく配線していません。これは、Spring applicationContext で必要なものを 1 つずつ説明したものです。

JBoss JNDI 実装を注入するには、jndiTemplate をセットアップする必要があります。

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">
                org.jnp.interfaces.NamingContextFactory
            </prop>
            <prop key="java.naming.provider.url">
                jnp://localhost:1099
            </prop>
            <prop key="java.naming.factory.url.pkgs">
                org.jboss.naming:org.jnp.interfaces
            </prop>
        </props>
    </property>
</bean>

次に、上記の JNDI 構成を指すように ConnectionFactory を構成します。

<!-- spring JMS definition -->
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="ConnectionFactory" />
</bean>

上記の ConnectionFactory を使用してトランザクション マネージャーを構成します。

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

宛先を jndiTemplate および jndiName に関連付けます。

<!-- jms destination already defined in jboss -->
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="queue/MyQueue" />
</bean>

最後に、ConnectionFactory を指すように jmsTemplate 自体を構成すると、コードで JmsTemplate を使用する準備が整います。

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

また、メッセージ リスナー コンテナー構成でコンシューマーを実行する必要があります。「jmsexample.ExampleListener」を MessageListener を含むクラスの名前に置き換えます。

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="jmsexample.ExampleListener" />

<!-- 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="myQueue"/>
    <property name="messageListener" ref="messageListener" />
</bean>
于 2016-08-24T20:20:31.700 に答える