消息中间件常用的两个是activeMq以及rabbitmq,这里介绍的只是springBoot整合activeMq实现邮件发送的一个方式
activeMq的项目主要有两个部分,一个是消费者另一个就是消息的生成者,生成者也就是项目中的消费者部分进行的业务逻辑处理的部分,通过将这部分数据发送到activeMq中进行队列或者主题排队,依次分发队列或者统一分发给每一个队列,进行数据消费,实现业务处理功能
安装好activeMq之后,只需要在SpringBoot中进行配置好连接信息,对于发送邮件的其他使用规则,可以参考本人的邮件发送使用(springMVC整合的)虽然是springMVC的,但是使用规则与在SpringBoot中也是差不多的,我这里也会附上代码,供大家参考
activeMq的消费者端代码(consumer)
package com.active.consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.stereotype.Component;
import javax.jms.*;
/**
* @description: 队列消息消费端 (点对点消费端)
* @author: liuhui
* @createDate: 2020/3/27
* @version: 1.0
*/
@Component
public class Consumer {
// @JmsListener(destination = "${my_queue}")
// public void receive(String msg){
// System.out.println("点对点模式成功获取消息 msg:"+msg);
// }
// @Autowired
// JavaMailSender javaMailSender; /*邮件发送类*/
// @JmsListener(destination = "${my_topic}")
// public void receive(String msg){
// if(StringUtils.isEmpty(msg)) return;
//// 转json
// JSONObject jsonObject = new JSONObject().parseObject(msg);
//// 获取json数据
// String userName = jsonObject.getString("userName");
// String email = jsonObject.getString("email");
// sendEmail(userName,email);
// System.out.println("发布订阅模式成功获取消息 msg:"+msg);
// }
// /*邮件发送工具类*/
// public void sendEmail(String userName,String email){
// /*邮件内容*/
// SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// simpleMailMessage.setFrom("[email protected]"); /*邮件发送者*/
// simpleMailMessage.setTo(email); /*邮件接受者*/
// simpleMailMessage.setSubject("晖哥测试邮件发送,不要迷恋哥哥"); /*邮件标题*/
// simpleMailMessage.setText("恭喜你,"+userName+"!你见证了我的学习成果!"); /*邮件内容*/
// /*邮件发送*/
// javaMailSender.send(simpleMailMessage);
// System.out.println("邮件发送成功");
// }
/*
* activeMq默认是自动签收的
* 现在改为手动签收模式和事务模式(这里用的是点对点,发布订阅是一样的书写规范)
* 这是测试代码,开发情况可在配置文件中配置)
* 生成者以事务进行生成消息,消费者也需使用事务消费消息
* 生成者以手动签收发送消息,消费者就需要通过手动签收回应生产者消息消费成功
* 签收方式是在消费者中进行设置,生成者中无需改变
* 消费者无需关闭队列连接
*/
// 连接地址
private static String url = "tcp://192.168.42.123:61617";
// 队列名称
private static String queueName = "text_queue";
public static void main(String[] args) {
// 1.建立连接工厂 密码默认是admin admin 这里可以设置密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("admin","123456",url);
Connection connection = null;
try {
// 2.创建连接
connection = activeMQConnectionFactory.createConnection();
connection.start(); /*启动连接*/
// 3.创建会话,参数1 设置事务提交是否开启、参数2 消息方式是否采用自动签收
//Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); /*事务签收*/
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); /*手动签收*/
// 4.创建队列
Queue queue = session.createQueue(queueName);
// 5.创建消费者
MessageConsumer consumer = session.createConsumer(queue);
// 6.监听消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 7.获取消息
TextMessage textMessage = (TextMessage) message;
System.out.println("消费者获取内容:"+textMessage);
try {
/*手动签收消息回应生成者*/
textMessage.acknowledge();
// 8.事务提交
// session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} catch (JMSException e) {
e.printStackTrace();
}
}
}
这里分别提供了activeMq的4中方式,有点对点的发送方式,有发布订阅的发送方式,有手动签收的接收方式同时也有事务的接收方式,代码中都有具体的注释,可以参考使用在activeMq中默认的方式是自动签收的,所有对于自动签收的方式就不需要设置了
activeMq的提供端(Producer )
package com.activemq.activemq.producer;
import com.alibaba.fastjson.JSONObject;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import javax.jms.*;
/**
* @description: 消息生成者 向activemq中发送消息
* @author: liuhui
* @createDate: 2020/3/26
* @version: 1.0
*/
@Configuration
public class Producer {
/**
* 点对点模式
*/
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate; /*队列模板*/
@Autowired
private Queue queue;
/*通过定时任务,每隔5s钟向activemq中发送一个消息*/
@Scheduled(fixedDelay = 5000) /*定时任务,每隔5s发送一个消息 单位是ms 5000ms = 5s */
public void send(){
String msg = System.currentTimeMillis()+"";
jmsMessagingTemplate.convertAndSend(queue,msg);
System.out.println("采用点对点模式+msg:"+msg);
}
/**
* 发布订阅模式
*/
// @Autowired
// private Topic topic;
// 通过定时任务,每隔5s钟向activemq中发送一个消息
// @Scheduled(fixedDelay = 5000) //定时任务,每隔5s发送一个消息 单位是ms 5000ms = 5s
// public void send(){
// String userName = "郭鹏丽";
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("userName",userName);
// jsonObject.put("email","[email protected]");
// String msg = jsonObject.toJSONString();
// jmsMessagingTemplate.convertAndSend(topic,msg);
// System.out.println("采用发布订阅模式+msg:"+msg);
// }
/*
* activeMq默认是自动签收的
* 现在改为手动签收模式和事务模式(这里用的是点对点,发布订阅是一样的书写规范)
* 这是测试代码,开发情况可在配置文件中配置)
* 生成者以事务进行生成消息,消费者也需使用事务消费消息
* 生成者以手动签收发送消息,消费者就需要通过手动签收回应生产者消息消费成功
*/
// 连接地址
private static String url = "tcp://192.168.42.123:61617";
// 队列名称
private static String queueName = "text_queue";
public static void main(String[] args) throws JMSException {
// 1.建立连接工厂 密码默认是admin admin 这里可以设置密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("admin","123456",url);
Connection connection = null;
try {
// 2.创建连接
connection = activeMQConnectionFactory.createConnection();
connection.start(); /*启动连接*/
// 3.创建会话,参数1 设置事务提交是否开启、参数2 消息方式是否采用自动签收
// Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); /*事务签收*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /*手动签收*/
// 4.创建队列
Queue queue = session.createQueue(queueName);
// 5.创建生成者
MessageProducer producer = session.createProducer(queue);
// 6.设置消息持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 10 ; i++) {
// 7.生成消息
TextMessage textMessage = session.createTextMessage("发送消息:"+i);
// 8.发送消息
producer.send(textMessage);
// 9.事务提交 (手动签收模式,无需开启事务提交)
// session.commit();
System.out.println("消息发送成功!"+textMessage);
}
} catch (JMSException e) {
e.printStackTrace();
}finally {
// 关闭连接
connection.close();
}
}
}
在使用activeMq的时候,我们也需要进行书写一个bean,通过bean注入到spring的容器中,通过容器进行使用对activeMq的队列发送消息,这里还采用一个定时任务进行数据的发送,用来模拟消息不断生成的环境,在项目实践中,可以不用使用这个定时任务,开启定时任务还需要在SpringBoot中的启动类中进行配置
package com.activemq.activemq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling /*开启定时任务*/
public class ActivemqApplication {
public static void main(String[] args) {
SpringApplication.run(ActivemqApplication.class, args);
}
}
activeMq的配置类(config)
package com.activemq.activemq.utils;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.jms.Queue;
/**
* 队列消息提供者
*/
/**
* @description: activemq 配置类 这里配置队列信息
* @author: liuhui
* @createDate: 2020/3/26
* @version: 1.0
*/
@Configuration /*标注为配置类*/
public class ConfigQueue {
/*点对点模式*/
@Value("${my_queue}")
private String myQueue;
/*1.将队列注入到SpringBoot容器中*/
@Bean
public Queue queue(){
return new ActiveMQQueue(myQueue);
}
// /*发布订阅模式*/
// @Value("${my_topic}")
// private String myTopic;
// /*1.将队列注入到SpringBoot容器中*/
// @Bean
// public Topic queue(){
// return new ActiveMQTopic(myTopic);
// }
}
配置类也主要是进行配置activeMq的两种队列发送发送方式,点对点模式,发布订阅模式
到这里,activeMq代码就已经书写完成,下面贴上配置文件,和email发送用的配置文件,就可将代码复制下来启动试验了
provide端的yml文件配置
server:
port: 9896
spring:
activemq:
broker-url: tcp://192.168.42.123:61617?jms.optimizeAcknowledge=true&jms.optimizeAcknowledgeTimeOut=30000&jms.redeliveryPolicy.maximumRedeliveries=10
user: admin
password: 123456
# 点对点模式
my_queue: springBoot1.5.9_my_queue
#发布订阅模式
#my_topic: springBoot1.5.9_my_topic
consumer端的yml文件配置
server:
port: 9895
spring:
activemq:
broker-url: tcp://192.168.42.123:61617?jms.optimizeAcknowledge=true&jms.optimizeAcknowledgeTimeOut=30000&jms.redeliveryPolicy.maximumRedeliveries=10
user: admin
password: 123456
# SpringBoot在整合activemq的发布订阅模式默认没有开启,需要手动开启
jms:
pub-sub-domain: true
mail:
# 163邮件服务
host: smtp.163.com
# 发送邮件账号
username: *****
# 邮箱授权码
password: ***********
# 编码格式
default-encoding: utf-8
# 点对点
#my_queue: springBoot1.5.9_my_queue
#发布订阅
my_topic: springBoot1.5.9_my_topic
password是邮箱的授权吗,具体使用,可以看上面推荐的博客进行配置
最后贴上pom文件,进行jar包管理下载
<!--email jar start-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!--email end-->
<!--json格式转换包 start-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<!--json格式转换包 end-->
<!--json格式转换包 start-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<!--json格式转换包 end-->
那个email的jar包只需要在consumer中进行配置