隔了好几天,才继续更新,拖延症又犯了
今天是整合在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都启动起来的