maven搭建ssm分模块框架+activeMQ (myeclipse版) (四)

隔了好几天,才继续更新,拖延症又犯了
今天是整合在ssmDemo框架中整合进MQ
可以参考一下这个地址http://blog.csdn.net/wilsonke/article/details/42776057
MQ分为3种方式:
1、publish-subscribe发布订阅通过topic,一对多的方式
2、P2P,使用消息队列queue,一对一的方式
3、request-response,请求-应答方式并不是JMS规范系统默认提供的一种通信方式,而是通过在现有通信方式的基础上稍微运用一点技巧实现的

我这边的Demo使用的是第二种方式,消息队列queue的方式
当然我们也需要先下载一个activeMQ,让它可以在本地跑起来。
http://activemq.apache.org/download-archives.html
我这里使用的是5.9.0的版本
跟zookeeper一样,解压后在bin目录下启动activemq.bat就可以了
启动之后,可以访问localhost:8161/admin,帐号密码可以在conf文件夹下的users.properties可以查看或是修改密码
接下来还是以分工程的形式来写
首先是ssmDemo父工程的pom.xml

        <!-- active mq start -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
                <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>5.9.0</version>
        </dependency>
        <!-- active mq end -->

我这里没有使用activemq-all,因为我发现它的jar包里面和slf4j-log4j12一直冲突,我即使是将activemq-all排除掉了slf4j的jar也还是报错,出于下下策,我就换成了core 另外使用core的话 还需要spring-jms 这个在前面已经添加上去了

接着就是
ssmDemo-web层 添加一个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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
     <bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
         <property name="connectionFactory">
             <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                 <property name="brokerURL">
                     <value>failover:(tcp://localhost:61616)</value>
                 </property>
             </bean>
         </property>
     </bean>
     <!-- 发送消息的目的地(一个队列) -->
     <bean id="userMQ" class="org.apache.activemq.command.ActiveMQQueue">
         <!-- 设置消息队列的名字 -->
         <constructor-arg index="0" value="activeMQQueue" />
     </bean>
     <!-- 配置JMS模版 -->
     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
         <property name="connectionFactory" ref="connectionFactory" />
         <!-- 如果为True,则是Topic;如果是false或者默认,则是queue -->
         <property name="pubSubDomain" value="false"></property>
     </bean>
  </beans>

原来的spring-mvc.xml文件的扫包范围也要改一下

    <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->  
    <context:component-scan base-package="cn.com.test" />  

因为我发现直接在controller发MQ消息的时候 报了一个错
Supported message payloads are: String, byte array, Map, Serializa…的错
好像是需要实例化,所以我就把调用MQ发送消息的方法单独写了一个java
MQService.java

@Component
public class MQService {
    @Autowired
    private JmsTemplate jmsTemplate;
    @Autowired
    @Qualifier("userMQ")
    private Destination destination;

    public void sendMQ(final String msg) {
        jmsTemplate.send(destination, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });

    }
}

另外创建了一个MqController.java

@Controller
@RequestMapping("/mq")
public class MqController {

    @Autowired
    private MQService mqService;

    @RequestMapping("/send")
    public String sendMq(){
        System.out.println("发送mq消息");
        final String msg="test";
        mqService.sendMQ(msg);
        return "mqPage";
    }

}

web.xml文件 需要引入spring-jms.xml

        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:spring-mvc.xml,classpath:dubbo-consumer.xml,**classpath:spring-jms.xml**</param-value>  
        </init-param>  

接着就是ssmDemo-servicec层
添加一个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: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.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
     <bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
         <property name="connectionFactory">
             <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                 <property name="brokerURL">
                     <value>failover:(tcp://localhost:61616)</value>
                 </property>
             </bean>
         </property>
     </bean>
    <!-- 配置JMS模版 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
    </bean>
    <bean id="receiveMq" class="cn.com.test.mq.MqReceive"></bean>
    <!-- jms:listener-container 的destination-type属性默认值为queue,如果是Topic需要显示指定 -->
<jms:listener-container container-type="default" destination-type="queue" connection-factory="connectionFactory" acknowledge="auto">
    <jms:listener destination="activeMQQueue" ref="receiveMq" method="onMessage" />
</jms:listener-container>
</beans>

创建了一个MqReceive.java文件

public class MqReceive {
    public void onMessage(String msg){
        System.out.println("接收到mq的消息");
            System.out.println("消息为"+msg);
    }
}

最后就是TestMain.java文件

public class TestMain {

    public static void main(String[] args){
// String[] xmls=new String[]{"classpath:spring-mybatis.xml","classpath:dubbo-provider.xml"};
        String[] xmls=new String[]{"classpath:spring-mybatis.xml","classpath:spring-jms.xml"};
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(xmls);
          context.start();
            try {
                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            } // 按任意键退出
    }
}

测试是否成功的话,就是先启动activeMq文件bin目录下的activemq.bat
然后将web层跑起来,TestMain方法也run as起来
页面访问localhost:8080/mq/send
最后就是看后台的日志有没有打印出system.out.println输入的值
也可以查看Localhost:8161/admin里面的queue 看有没有消息队列

我的代码也是通过查找网上的资料 然后自己整合起来的

代码地址:
http://download.csdn.net/detail/i_popular/9534767
该代码里面也包含了dubbo,只是在TestMain里面我没有添加dubbo-provider.xml的读取
当然要把dubbo和mq都一起使用的话,需要zookeeper和mq都启动起来的

你可能感兴趣的:(框架,activemq)