目前项目的应用场景
发短信时使用activeMQ进行异步发送
视项目实际应用进行修改
ActiveMQ基础概念
ActiveMQ是一款基于JMS的开源消息中间件。
消息中间件有很多的用途和优点:
1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
2. 负责建立网络通信的通道,进行数据的可靠传送。
3. 保证数据不重发,不丢失
4. 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务
关于JMS的理论知识查看以下内容,在此不叙述
http://blog.csdn.net/jiuqiyuliang/article/details/46701559
ActiveMQ特性列表
- 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
- 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
- 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
- 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通过JDBC和journal提供高速的消息持久化
- 从设计上保证了高性能的集群,客户端-服务器,点对点
- 支持Ajax
- 支持与Axis的整合
- 可以很容易得调用内嵌JMS provider,进行测试
什么情况下使用ActiveMQ?
- 多个项目之间集成
(1) 跨平台
(2) 多语言
(3) 多项目 - 降低系统间模块的耦合度,解耦
(1) 软件扩展性 - 系统前后端隔离
(1) 前后端隔离,屏蔽高安全区
activeMQ和SpringBoot的整合
ActiveMQ安装运行
下载5.15.9后解压缩,双击bin目录下的activemq.bat文件或运行自己电脑版本(win64)下的activeme.bat,查看效果
如果出现了activeMQ webConsole available at http://0.0.0.0:8161/ 即运行成功,进入http://127.0.0.1:8161/,可看到如下页面
ActiveMQ配置
注意:5.15以上版本需要jdk1.8及以上支持。笔者使用的是官网上最新的5.15.9版本。SpringBoot的版本为2.1.6
首先在pom.xml中配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
然后是ActiveMQ的yml具体配置:
activemq:
user: admin
password: admin
broker-url: tcp://127.0.0.1:61616
in-memory: true
pool:
enabled: false
max-connections: 50
配置时碰到的问题
The following candidates were found but could not be injected:
- Bean method 'jmsMessagingTemplate' in 'JmsAutoConfiguration.MessagingTemplateConfiguration' not loaded because Ancestor org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration did not match
Action:
Consider revisiting the entries above or defining a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' in your configuration.
在配置的时候出现了这个报错,在网上查了很多资料,都说少一个空格,然而实际配置中并没有少。或者还有说ActiveMQ未启动的
经过多次测试,发现是activemq-pool-enabled使用了true,改成false之后就不再出现
目前的配置中,自定义消息队列的value为emailQueue:用于处理发送邮件的消息队列
启动类中注入Queue示例
@EnableJms
@SpringBootApplication
public class MQApplication{
public static void main(String[] args) {
SpringApplication.run(MQApplication.class, args);
}
@Bean
public ActiveMQQueue emailQueue() {
return new ActiveMQQueue("emailQueue");
}
}
生产者java代码
@Component
public class MQProducer implements CommandLineRunner {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
@Resource
private ActiveMQQueue queue;
@Override
public void run(String... args) {
// send("建立连接");
System.out.println("建立连接");
}
public void send(Map<String,Object> map) {
this.jmsMessagingTemplate.convertAndSend(this.queue, map);
}
}
消费者监听方法
@Component
public class MQConsumer {
@Resource
private IEmailService emailService;
@JmsListener(destination ="emailQueue")
public void receiveQueue(Map<String,Object> map){
System.out.println(JSONObject.toJSONString(map));
emailService.sendEmail(map);
}
}
将发送短信的逻辑写在receiveQueue方法中,即可完成消息队列实现发送邮件的方法
结尾
目前仅在发送邮件的功能上进行了p2p模式的业务实现,仅仅只是对ActiveMQ最浅显的使用方式。未来对功能进行扩展后才会用到ActiveMQ的其他功能,如不同系统之间的信息传递等