ActiveMQ学习(三)--结合Spring的Demo
来源:互联网 发布:艾克里里淘宝店链接 编辑:程序博客网 时间:2024/03/29 22:21
花了半天的时间搞了一个Spring+struts2+ActiveMQ的小demo,界面就直接用的inde.jsp,没有任何的样式,另外jar包也有一些多余的,不管那么多了,下面聊聊如何通过Spring去构造一个消息接收机制。
ActiveMQ在Spring中的配置
先贴一下我的案例中的配置吧,再一一解释下到底是什么鬼:
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://localhost:61616?wireFormat.maxInactivityDuration=0)&maxReconnectDelay=10000"/>
<property name="optimizedAckScheduledAckInterval" value="10000" />
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!--这个是队列目的地-->
<bean id="alarmWebQueue" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg>
<value>alarmWebQueue</value>
</constructor-arg>
</bean>
<!-- 消息监听器 -->
<bean id="webMessageListener" class="com.gh.test.mq.receive.WebMessageReceiver" />
<!-- 消息监听容器 -->
<bean id="jmsWebContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="alarmWebQueue" />
<property name="messageListener" ref="webMessageListener" />
</bean>
1. 配置ConnectionFactory
Spring提供的ConnectionFactory只是Spring用于管理ConnectionFactory的,真正产生到JMS服务器链接的ConnectionFactory还得是由JMS服务厂商提供,并且需要把它注入到Spring提供的ConnectionFactory中。我们这里使用的是ActiveMQ实现的JMS,所以在我们这里真正的可以产生Connection的就应该是由ActiveMQ提供的ConnectionFactory。
2. 配置生产者
配置好ConnectionFactory之后我们就需要配置生产者。生产者负责产生消息并发送到JMS服务器。但是我们要怎么进行消息发送呢?通常是利用Spring为我们提供的JmsTemplate类来实现的,所以配置生产者其实最核心的就是配置消息发送的JmsTemplate。对于消息发送者而言,它在发送消息的时候要知道自己该往哪里发,为此,我们在定义JmsTemplate的时候需要注入一个Spring提供的ConnectionFactory对象。
上面所说的队列目的地,其实就是一个Destination,就是我这个消息发送到哪里去,这里呢,一般有2种配置:一个是点对点的ActiveMQQueue,另一个就是支持订阅/发布模式的ActiveMQTopic。(区别后面有机会再去深入讲下),这里是配的topic。3. 配置消费者
生产者往指定目的地Destination发送消息后,接下来就是消费者对指定目的地的消息进行消费了。那么消费者是如何知道有生产者发送消息到指定目的地Destination了呢?每个消费者对应每个目的地都需要有对应的MessageListenerContainer。对于消息监听容器而言,除了要知道监听哪个目的地之外,还需要知道到哪里去监听,也就是说它还需要知道去监听哪个JMS服务器,通过配置MessageListenerContainer的时候往里面注入一个ConnectionFactory来实现的。所以我们在配置一个MessageListenerContainer的时候有三个属性必须指定:一个是表示从哪里监听的ConnectionFactory;一个是表示监听什么的Destination;一个是接收到消息以后进行消息处理的MessageListener。这里就对应上面的三个property。
部分代码分析
1. 生产者
生产者的代码有很多情况,那么我们核心的思想就是在满足一定条件的时候去生成一条消息,推送到目的地,让消费者能够看到。我这里的demo,其实就是通过页面上点击一下,出发action里面定义好的一个方法去发送消息。
@Resource
private Destination alarmWebQueue;
@Resource
private JmsTemplate jmsTemplate;
public String sendMessage() {
try{
jmsTemplate.send(alarmWebQueue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
MapMessage msg = session.createMapMessage();
msg.setString("id", "1001");
msg.setString("name", "浩浩");
msg.setString("value", "你好啊");
return msg;
}
});
msg="发送成功";
}catch(Exception e){
msg="发送失败";
e.printStackTrace();
}
return "success";
}
这里我们通过注解的方式引入了得到了Destination和JmsTemplate,直接调用jmsTemplate的send方法就行。这里的send方法也是有很多的构造方法,因为我在前面配置的时候没有给JmsTemplate引入目的地alarmWebQueue,所以我这里要传一个Destination作为参数。至于这个message,也是有多重形式的,不止有MapMessage,不过要跟你的消费者互相对应起来,不然解析不了具体的消息内容。
2. 消费者
消费者的代码其实就是一个类实现MessageListener接口,实现里面的onMessage方法,在这里面可以去实现具体的业务逻辑。
public class WebMessageReceiver implements MessageListener {
// 打印日志
private static Logger log = Logger.getLogger(WebMessageReceiver.class);
public void onMessage(Message message) {
log.info("web端发送消息接收");
try {
MapMessage mapMsg = (MapMessage) message;
log.info("消息内容中ID是:" + mapMsg.getString("id"));
log.info("消息内容中NAME是:" + mapMsg.getString("name"));
log.info("消息内容中VALUE是:" + mapMsg.getString("value"));
} catch (JMSException e) {
log.error("接受出错:"+e.getMessage());
}
}
}
代码实现起来是不难的,主要是要动手去写一下,去做一下,等你能理解了这个过程才能更好的去结合实际场景运用。
- ActiveMQ学习(三)--结合Spring的Demo
- spring boot与activemq的结合使用
- spring和activemq的结合(五)
- 基于maven的Spring+ActiveMQ整合Demo
- ActiveMQ(三):ActiveMQ的安全机制、api及订阅模式demo
- activeMQ学习之一(简单例子介绍,含spring结合)
- activeMQ学习之一(简单例子介绍,含spring结合)
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
- activeMQ+Spring-mvc结合使用
- activeMQ实践(三)---用spring-activemq实现图书的新增
- ActiveMQ(实战三) 与spring的集成
- spring activeMQ 整合(一): 一个简单的demo,测试消息的发送与接收
- activemq订阅模式和队列模式的Demo讲解(maven,spring管理)(史上最全版本)
- ActiveMQ学习(三)——MQ的通讯模式
- ActiveMQ学习(三)——MQ的通讯模式
- android中的字符长度
- 【2012.03.3普及组】寻找星座
- 提高项目31.2-将代码中的花括号换行输出
- java面向对象
- hibernate -- HQL语句总结
- ActiveMQ学习(三)--结合Spring的Demo
- 另一种阶乘问题
- nginx 负载均横
- 被人画是怎样一种体验?
- iconcls引用
- uwaGC调用
- ps编辑工具:渐隐/合并拷贝
- 字符串匹配算法综述:BF、RK、KMP、BM、Sunday
- 【2012.03.3普及组】烤饼干