ホームページ  >  記事  >  Java  >  JMS Active MQ の Spring 統合の簡単な分析

JMS Active MQ の Spring 統合の簡単な分析

巴扎黑
巴扎黑オリジナル
2017-06-23 10:10:521455ブラウズ

1. Spring と統合して ptp のメッセージの同期受信を実現します

pom.xml:

   <!--  --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.3.7.RELEASE</version></dependency>
  <!--  --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>5.9.0</version></dependency>

spring-jms.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:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core

http://www.springframework.org/schema/jms

http://www.springframework.org/schema/beans
"><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/>  </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  <property name="connectionFactory" ref="connectionFactory"/>  <property name="maxConnections" value="10"/>  </bean>  <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>  </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  <property name="connectionFactory" ref="cachingConnectionFactory"/>  </bean> <!--这个是队列目的地,点对点的-->  <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  <constructor-arg index="0" value="spring-queue"/> </bean>   </beans>

ConnectionFactory は JMS サーバーへのリンクを生成するために使用されます。 SingleConnectionFactory や CachingConnectionFactory など、複数の ConnectionFactory が提供されています。 SingleConnectionFactory は、JMS サーバー リンクを確立するリクエストに対して常に同じリンクを返し、Connection の close メソッド呼び出しを無視します。 CachingConnectionFactory は SingleConnectionFactory を継承しているため、SingleConnectionFactory のすべての機能を備えており、さらに、Session、MessageProducer、および MessageConsumer をキャッシュできる新しいキャッシュ関数も追加されています。ここでは例として CachingConnectionFactory を使用します。

メッセージプロデューサー:

   = ClassPathXmlApplicationContext("spring-jms.xml"=(JmsTemplate) context.getBean("jmsTemplate"=(Destination) context.getBean("queueDestination" Message createMessage(Session session)  session.createTextMessage("Hello spring JMS"

コンシューマー:

package com.jalja.org.jms.spring;import javax.jms.Destination;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.jms.core.JmsTemplate;public class SpringJmsReceive {public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
    JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
    Destination queueDestination=(Destination) context.getBean("queueDestination");
    String msg=(String) jmsTemplate.receiveAndConvert(queueDestination);
    System.out.println(msg);
  }
}

2. PTP の非同期呼び出し

Spring でメッセージを非同期に受信するようにリスナーを直接設定します。これは Spring で設定するのと同等です。コンシューマの場合、メッセージを受信するときにコンシューマを起動する必要はありません。

spring-jms.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:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core

http://www.springframework.org/schema/jms

http://www.springframework.org/schema/beans
"><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/>  </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  <property name="connectionFactory" ref="connectionFactory"/>  <property name="maxConnections" value="10"/>  </bean>  <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>  </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  <property name="connectionFactory" ref="cachingConnectionFactory"/>  </bean> <!--这个是队列目的地,点对点的-->  <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  <constructor-arg index="0" value="spring-queue"/> </bean>   <!-- 消息监听器 -->  <bean id="myMessageListener" class="com.jalja.org.jms.spring.yb.MyMessageListener"/>  <!-- 消息监听容器 -->  <bean id="jmsContainer"  class="org.springframework.jms.listener.DefaultMessageListenerContainer">  <property name="connectionFactory" ref="cachingConnectionFactory" />  <property name="destination" ref="queueDestination" />  <property name="messageListener" ref="myMessageListener" />  </bean> </beans>

プロデューサーが指定された宛先 Destination にメッセージを送信した後の次のステップは、コンシューマーが指定された宛先でメッセージを消費することです。では、コンシューマは、プロデューサが指定された宛先にメッセージを送信したことをどのようにして知るのでしょうか?これは、Spring がカプセル化するメッセージ リスニング コンテナー MessageListenerContainer を通じて実現されます。このコンテナーは、情報を受信し、受信した情報を処理のために実際の MessageListener に配布します。各コンシューマには、宛先ごとに対応する MessageListenerContainer が必要です。メッセージをリッスンするコンテナーの場合、どの宛先をリッスンするかだけでなく、どこでリッスンするかを知る必要があります。これは、MessageConnectionFactory を挿入することによって行われます。これは、MessageConnectionFactory を構成するときに実現します。したがって、MessageListenerContainer を構成する場合、指定する必要がある 3 つの属性があり、1 つはリッスンする場所を示す ConnectionFactory、もう 1 つはリッスンする対象を示す Destination、もう 1 つはメッセージを受信した後に処理する MessageListener です。メッセージ。 Spring は、SimpleMessageListenerContainer と DefaultMessageListenerContainer という 2 種類の MessageListenerContainer を提供します。
SimpleMessageListenerContainer: SimpleMessageListenerContainer は、最初にセッションとコンシューマーを作成し、標準の JMS MessageConsumer.setMessageListener() メソッドを使用してリスナーを登録し、JMS プロバイダーにリスナーのコールバック関数を呼び出します。実行時のニーズに動的に適応したり、外部トランザクション管理に参加したりすることはありません。互換性の点では、スタンドアロン JMS 仕様に非常に近いですが、一般に Java EE の JMS 制限とは互換性がありません。

DefaultMessageListenerContainer: ほとんどの場合、SimpleMessageListenerContainer と比較して、DefaultMessageListenerContainer は実行時のニーズに動的に適応し、外部トランザクション管理に参加できます。これは、JMS プロバイダーに対する低い要件、トランザクションへの参加などの高度な機能、および Java EE 環境との互換性の間でバランスが取れています。

メッセージプロデューサー:

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
        JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
        Destination queueDestination=(Destination) context.getBean("queueDestination");
        System.out.println("异步调用执行开始");
        jmsTemplate.send(queueDestination, new MessageCreator(){
            @Overridepublic Message createMessage(Session session) throws JMSException {return session.createTextMessage("Hello spring JMS");
            }
        });
        System.out.println("异步调用执行结束");
    }

メッセージリスナー: MyMessageListener

public class MyMessageListener implements MessageListener{
    @Overridepublic void onMessage(Message message) {
        TextMessage msg= (TextMessage) message;try {
            System.out.println("你好:"+msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

リスナーの実行結果は次のようになります:

异步调用执行开始
异步调用执行结束
你好:Hello spring JMS

3. 春-jms .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:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core

http://www.springframework.org/schema/jms

http://www.springframework.org/schema/beans
"><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/>  </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  <property name="connectionFactory" ref="connectionFactory"/>  <property name="maxConnections" value="10"/>  </bean>  <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>  </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  <property name="connectionFactory" ref="cachingConnectionFactory"/>  </bean> <!--这个是队列目的地,发布订阅-->  <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">  <constructor-arg index="0" value="spring-Topic"/> </bean>   </beans>
プロデューサー:

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
        JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
        Destination topicDestination=(Destination) context.getBean("topicDestination");
        jmsTemplate.send(topicDestination, new MessageCreator(){
            @Overridepublic Message createMessage(Session session) throws JMSException {return session.createTextMessage("Hello spring JMS topicDestination");
            }
        });
    }
コンシューマー:

public class SpringJmsSubscriber {public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
        JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
        Destination topicDestination=(Destination) context.getBean("topicDestination");
        String msg=(String) jmsTemplate.receiveAndConvert(topicDestination);
        System.out.println(msg);
    }
}

以上がJMS Active MQ の Spring 統合の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。