Spring整合JMS P2P方式

javajms  使用jms消息發送 Producer,Consumer,Listener 直接使用queue傳的消息爲點對點模式
點對點當同時存在consumer跟listener時  不存在先後順序 兩者能同時接收到消息
這裏consumer有兩種獲取消息的機制
1.使用消費者接收 consumer.receive()
2.使用綁定監聽 consumer.setMessageListener(new Listener());
當系統已有Listener與Producer(發送者)綁定的時候(如下代碼寫法),再使用Consumer.receive 獲取消息時 會報如下錯誤:

           consumer.setMessageListener(new ConsumerMessageListener());
           while (true) {
                Message message = consumer.receive();

                TextMessage textMessage = (TextMessage) message;
                if(textMessage!=null){
                     String text = textMessage.getText();

                     System.out.println("從ActiveMQ取回一條消息: " + text);
                }else{
                     break;
                }
           }

 Cannot synchronously receive a message when a MessageListener is set
此時只要確保系統只有一種方式綁定即可

當系統有多個Consumer在等候是 一個發送者發出消息,每個Consumer都能收到消息
監測客戶端 ActiveMQ 登錄地址http://localhost:8161/admin  用戶admin、密碼admin

使用Spring管理jms
這裏使用Maven構建框架
pom.xml如下:

<properties>
          <org.springframework-version>4.1.6.RELEASE</org.springframework-version>
          <spring.security.version>2.0.5.RELEASE</spring.security.version>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
           <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>

           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${org.springframework-version}</version>
                <exclusions>
                     <exclusion>
                           <groupId>commons-logging</groupId>
                          <artifactId>commons-logging</artifactId>
                     </exclusion>
                </exclusions>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.1.6.RELEASE</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-instrument</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc-portlet</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <!-- springframework end -->

           <!-- spring security start -->
           <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-acl</artifactId>
                <version>${spring.security.version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>${spring.security.version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core-tiger</artifactId>
                <version>${spring.security.version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-taglibs</artifactId>
                <version>${spring.security.version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>4.1.5.RELEASE</version>
           </dependency>

           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${org.springframework-version}</version>
           </dependency>
           <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>jsr250-api</artifactId>
                <version>1.0</version>
           </dependency>
           <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-core</artifactId>
                <version>5.7.0</version>
           </dependency>
     </dependencies>

spring配置文件applicationContext.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:context="http://www.springframework.org/schema/context"
    xmlns:jms="http://www.springframework.org/schema/jms"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">

    <context:component-scan base-package="Jms.JmsTest" />

    <!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 -->
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>

    <!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供-->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

    <!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="targetConnectionFactory"/>
    </bean>

    <!--這個是隊列目的地-->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>queue</value>
        </constructor-arg>
    </bean>
    <!-- 消息監聽器 -->
    <bean id="consumerMessageListener" class="Jms.JmsTest.ConsumerMessageListener"/>
    <!-- 消息監聽容器   將發送者監聽捆綁在一起 P2P-->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="queueDestination" />
         <property name="messageListener" ref="consumerMessageListener" />
    </bean>
</beans>
 
消息生產者

package Jms.JmsTest;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

@Component
public class ProducerServiceImpl implements ProducerService {

    private JmsTemplate jmsTemplate;

    public void sendMessage(Destination destination, final String message) {
        System.out.println("---------------生產者發了一個消息:" + message);
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }
    public JmsTemplate getJmsTemplate() {
        return jmsTemplate;
    }
    @Resource
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }
}

消息監聽

package Jms.JmsTest;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ConsumerMessageListener implements MessageListener {

    public void onMessage(Message message) {
        //這裏我們知道生產者發送的就是一個純文本消息,所以這裏可以直接進行強制轉換
        TextMessage textMsg = (TextMessage) message;
        try {
            System.out.println("監聽接收消息內容是:1111——————>" + textMsg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

消息消費者

package Jms.JmsTest;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MessageConsumer {
     public static void main(String[] args) throws JMSException {
           String jmsProviderAddress = "tcp://localhost:61616";// 地址
           ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                     jmsProviderAddress);// 連接器
           Connection connection = connectionFactory.createConnection();// 創建連接
           Session session = connection.createSession(false,
                     Session.AUTO_ACKNOWLEDGE);// 打開會話
           String destinationName = "queue";
           Destination dest = session.createQueue(destinationName);// 消息目的地
           javax.jms.MessageConsumer consumer = session.createConsumer(dest);
           connection.start();
//         consumer.setMessageListener(new ConsumerMessageListener());
//         consumer.setMessageListener(new ConsumerMessageListener2());
           while (true) {
                Message message = consumer.receive();
                TextMessage textMessage = (TextMessage) message;
                if(textMessage!=null){
                     String text = textMessage.getText();

                     System.out.println("從ActiveMQ取回一條消息: " + text);
                }else{
                     break;
                }
           }
     }
}

測試類

package Jms.JmsTest;

import javax.jms.Destination;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class ProducerConsumerTest {
     @Autowired
     private ProducerService producerService;
     @Autowired
     @Qualifier("queueDestination")
     private Destination destination;

     @Test
     public void testSend() {
           for (int i = 0; i <= 5; i++) {
                producerService.sendMessage(destination, "生產發送消息:————>" + (i + 1));
           }
     }
}

測試結果:

---------------生產者發了一個消息:生產發送消息:————>1
監聽接收消息內容是:1111——————>生產發送消息:————>1
---------------生產者發了一個消息:生產發送消息:————>2
監聽接收消息內容是:1111——————>生產發送消息:————>2
---------------生產者發了一個消息:生產發送消息:————>3
監聽接收消息內容是:1111——————>生產發送消息:————>3
---------------生產者發了一個消息:生產發送消息:————>4
監聽接收消息內容是:1111——————>生產發送消息:————>4
發佈了38 篇原創文章 · 獲贊 51 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章