spring--mybatis--activeMQ集成(一)

来源:互联网 发布:中国股市现状 知乎 编辑:程序博客网 时间:2024/05/18 00:33

1.功能描述

实现两个消息队列,

(1)adapterQueue队列为发送消息给server服务器的队列 

(2)defaultResponseQueue队列为server发送消息给客户端

客户端程序为spring+mybatis+activeMQ的j2ee Web框架

服务端为spirng+mybatis+activeMQ的java application应用

2.  客户端spring.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">  
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties" />
<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.ssmm" />
<!-- 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://192.168.12.57: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="adapterQueue" class="org.apache.activemq.command.ActiveMQQueue">  
        <constructor-arg>  
            <value>adapterQueue</value>  
        </constructor-arg>  
    </bean>      
  
<!-- 默认的消息回复队列 -->  
<bean id="defaultResponseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
    <constructor-arg>  
        <value>defaultResponseQueue</value>  
    </constructor-arg>  
</bean>  
  
<!-- defaultResponseQueue对应的监听器 -->  
<bean id="defaultResponseQueueListener" class="com.ssmm.server.DefaultResponseQueueListener"/>  
  
<!-- defaultResponseQueue对应的监听容器 -->  
<bean id="defaultResponseQueueMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
    <property name="connectionFactory" ref="connectionFactory"/>  
    <property name="destination" ref="defaultResponseQueue"/>  
    <property name="messageListener" ref="defaultResponseQueueListener"/>  
</bean>  
</beans>

2.  客户端发送消息类

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
@Component
public class ProducerService  {
    @Autowired  
    private JmsTemplate jmsTemplate;  
  
      
    public void sendMessage(Destination destination, final String message) {  
        System.out.println("---------------WEB生产者发送消息-----------------");  
        System.out.println("---------------WEB生产者发了一个消息:" + message);  
        jmsTemplate.send(destination, new MessageCreator() {  
            public Message createMessage(Session session) throws JMSException {  
                TextMessage textMessage = session.createTextMessage(message);  
                //textMessage.setJMSReplyTo(responseDestination);  
                return textMessage;  
            }  
        });  
    }  
   


}

4、客户端接收消息和发送消息队列类


发送消息队列

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
 * @author quanyiming
 *
 */
public class ResponseQueueListener implements MessageListener {  
  
    public void onMessage(Message message) {  
        if (message instanceof TextMessage) {  
            TextMessage textMessage = (TextMessage) message;  
            try {  
                System.out.println("WEB adptque接收的内容是:" + textMessage.getText());  
            } catch (JMSException e) {  
                e.printStackTrace();  
            }  
        }  
    }
}  

接收消息队列

import javax.jms.JMSException;  
import javax.jms.Message;  
import javax.jms.MessageListener;  
import javax.jms.TextMessage;  
   
public class DefaultResponseQueueListener implements MessageListener{  
   
    public void onMessage(Message message) {  
        if (message instanceof TextMessage) {  
            TextMessage textMessage = (TextMessage) message;  
            try {  
                System.out.println(textMessage.getText().substring(textMessage.getText().length()-5, textMessage.getText().length())+"default WEB接收消息是:" + textMessage.getText());  
            } catch (JMSException e) {  
                e.printStackTrace();  
            }  
        }  
    }   
}  

5. 测试类

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;
import com.ssmm.server.ProducerService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring.xml","classpath:spring-mybatis.xml" })
public class ProducerConsumerTest {
    @Autowired
    private ProducerService producerService;  
    @Qualifier("adapterQueue")  
    @Autowired  
    private Destination adapterQueue;      
    @Test
    public void testMessageListenerAdapter() {  
        producerService.sendMessage(adapterQueue, "my first");  
    }  
}

6.pom.xml中添加 以下依赖

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-pool -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>5.7.0</version>
</dependency>

7.服务端spring.xml配置(服务端请建立基于maven的java application工程,不是WEB工程)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">  
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties" />


<!-- 自动扫描(自动注入) -->
<context:component-scan base-package="com.ssmm" />
<!-- 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://192.168.12.57: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="adapterQueue" class="org.apache.activemq.command.ActiveMQQueue">  
        <constructor-arg>  
            <value>adapterQueue</value>  
        </constructor-arg>  
    </bean> 
<!-- 消息监听适配器 -->  
<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
    <!-- <constructor-arg>  
        <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>  
    </constructor-arg> -->  
    <property name="delegate">  
        <bean class="com.ssmm.server.ResponseQueueListener"/>  
    </property>  
</bean>  
  
<!-- 消息监听适配器对应的监听容器 -->  
<bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
    <property name="connectionFactory" ref="connectionFactory"/>  
    <property name="destination" ref="adapterQueue"/>  
    <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 -->  
</bean>  
  
<!-- 默认的消息回复队列 -->  
<bean id="defaultResponseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
    <constructor-arg>  
        <value>defaultResponseQueue</value>  
    </constructor-arg>  
</bean>  
</beans>

8. 服务端pom.xml请添加以下配置

<plugins>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <goals>
                <goal>exec</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>-classpath</argument>
            <classpath>
            </classpath>
            <argument>com.ssmm.server.testPlatform</argument>
        </arguments>
    </configuration>
</plugin> 


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.ssmm.server.testPlatform</mainClass>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
        <classesDirectory>
        </classesDirectory>
    </configuration>
</plugin>
</plugins>

9. 服务端编译方法

(1)在maven Build 的run configuration中的Goals栏填入:dependency:copy-dependencies -DoutputDirectory=target/lib 进行编译

(2)接(1)继续在maven Build 的run configuration中新建一编译配置项,Goals中填入:compile package,并进行编译。

最后使用命令java -jar xxxx.jar即可运行服务端,客户端发送消息后,服务端会响应并做出反馈消息。


0 0
原创粉丝点击