http://blog.youkuaiyun.com/a953713428/article/details/71190769
1. Spring对jms的支持
因为Spring已经将JMS集成到框架里面了,对jms做了自己的封装,我们使用起来更加方便,在Spring中使用jms比较麻烦的就是配置,在Spring中配置JMS大体需要8个部分:
- ConnectionFactory: 和jms服务器的连接, 可以是外部的jms server, 也可以使用embedded ActiveMQ Broker;
- Destination: 有topic和queue两种方式;
- JmsTemplate: spring提供的jms模板;
- MessageConverter: 消息转换器;
- MessageProducer: 消息生产者;
- MessageConsumer: 消息消费者;
- MessageListener: 消息监听器;
- MessageListenerContainer: 消息监听容器。
下面我把完整的配置文件按照上面的步骤拆开分别讲解:
1.1首先我们配置ConnectionFactory:
- 1
- 2
- 3
- 4
brokerURL是指要连接的activeMQ server的地址,该配置即使用activemq独立的消息存储环境,即使服务器重启消息也不会丢失。
- 1
- 2
- 3
- 4
- 5
- 6
我们从Spring给我们提供的connectionFactory中获取Connection,并且把该connectionFactory注册到上面定义的activemq server中。
1.2 Destination:
由前面我们知道Destination有两种形式:P2P和Pub/Sub。那么在配置中表示就是:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
或:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
1.3 JmsTemplate:
将connectionFactory和defaultDestination注入JmsTemplate中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在Java相关处理文件中添加(这里用的是@Inject注解,当然也可以用@Autowired):
- 1
- 2
- 3
- 4
1.4 MessageConverter
MessageConverter实现的是org.springframework.jms.support.converter.MessageConverter接口, 提供消息的转换功能。
- 1
1.5 MessageProducer和MessageConsumer
此处灵活使用,可以以服务的形式提供也可以以工具类的形式提供,详情见下面的示例代码。
1.6 MessageListener
消息的消费者应有的有对应的Listener。
- 1
- 2
1.7 MessageListenerContainer
MessageListenerContainer即Listener的容器,用来对Listener坐一些配置,每一个listener都对应着一个Container:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Spring为我们听过了两种类型的MessageListenerContainer:SimpleMessageListenerContainer和DefaultMessageListenerContainer。
- SimpleMessageListenerContainer会在一开始的时候就创建一个会话Session和消费者Consumer,并且会适用标准的JMS的MessageConsumer.setMessageListener()方法注册监听器让JMS提供调用监听器的回调函数。它不会动态的适应运行时需要和参与外部的事务管理。兼容性方面,它非常接近于独立的JMS规范,但一般不兼容J2EE的JMS限制。大多数情况下,我们还是使用DefaultMessageListenerContainer。
- DefaultMessageListenerContainer,与SimpleMessageListenerContainer相比,它会动态的适应运行时的需求,并且能够参与外部的事务管理。
上面就是mq的配置文件部分,如果从上到下的配置部分都清楚地话使用起来肯定没有问题,我们再做一个简要的总结:
- 可以有一个或者多个消息生产者向同一个destination发送消息;
- queue类型的只能有一个消息消费者;
- topic类型的可以有多个消息消费者;
- 每个消费者对应一个MessageListener和一个MessageListenerContainer。
下面我们看一下整合的全部代码:
首先上pom.xml看一下依赖的jar包:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
然后是我们的Spring配置文件applicationContext.xml:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
activemq的配置文件applicationContext-ActiveMQ.xml:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
配置的介绍在上面我已经讲过了,不明白的地方翻到上面去看看。
web.xml文件的配置如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
我们的工程目录结构如下:
上service的代码:
ProducerService.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
ProducerServiceImpl.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
ConsumerService.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
ConsumerServiceImpl.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
QueueMessageListener.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
接下来是controller:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
代码就是上面这些,我们先启动acticemq server,然后下启动工程,在地址栏中输入:http://localhost:8080/SendMessage?msg=nihao,
代码很简单我就没有写前台页面啦,msg部分你可以随便写。回车之后我们去看一下控制台消息就发送出去了。