在SprinBoot中,通过ActiveMQ实现消息队列,进行邮件发送

目前项目的应用场景

发短信时使用activeMQ进行异步发送
视项目实际应用进行修改

ActiveMQ基础概念

ActiveMQ是一款基于JMS的开源消息中间件。
消息中间件有很多的用途和优点:
1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
2. 负责建立网络通信的通道,进行数据的可靠传送。
3. 保证数据不重发,不丢失
4. 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务
关于JMS的理论知识查看以下内容,在此不叙述
http://blog.csdn.net/jiuqiyuliang/article/details/46701559

ActiveMQ特性列表

  1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
  2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
  3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
  4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
  5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
  6. 支持通过JDBC和journal提供高速的消息持久化
  7. 从设计上保证了高性能的集群,客户端-服务器,点对点
  8. 支持Ajax
  9. 支持与Axis的整合
  10. 可以很容易得调用内嵌JMS provider,进行测试

什么情况下使用ActiveMQ?

  1. 多个项目之间集成
    (1) 跨平台
    (2) 多语言
    (3) 多项目
  2. 降低系统间模块的耦合度,解耦
    (1) 软件扩展性
  3. 系统前后端隔离
    (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/,可看到如下页面在SprinBoot中,通过ActiveMQ实现消息队列,进行邮件发送_第1张图片

ActiveMQ配置
注意:5.15以上版本需要jdk1.8及以上支持。笔者使用的是官网上最新的5.15.9版本。SpringBoot的版本为2.1.6
首先在pom.xml中配置依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-activemqartifactId>
        dependency>
        <dependency>
            <groupId>org.apache.activemqgroupId>
            <artifactId>activemq-poolartifactId>
        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的其他功能,如不同系统之间的信息传递等

你可能感兴趣的:(Java)