前言
在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件、发送短信、微信推送等,公司内部消息平台再去调用第三发消息平台。
消息服务平台的接口有两种:同步和异步,同步需求一般是需要返回调用第三方平台是否成功,否则都采用异步的。
公司内部消息服务平台
调用内部消息服务平台,使用消息中间件
发送消息一般都会做消息模板,调用的时候传模板id
图片来源:蚂蚁课堂
整合Eamil实现异步发送邮件信息
采用163邮件接口,先注册163邮箱,并开通pop3协议,此时会有一个授权码,发送内容不能带有广告,否则会被163拦截,导致发送失败。
场景:会员服务调用内部消息服务平台发送邮件
会员服务(生产者)
- Maven依赖
<!-- SpringBoot整合web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ActiveMQ依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- FastJson工具包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>LATEST</version>
</dependency>
- YML配置文件
spring:
activemq:
broker-url: tcp://127.0.0.1:61616 # ActiveMQ消息中间件服务器通讯地址
user: admin # 用户名
password: admin #密码
queue: springboot-queue #自定义队列名,等下程序中会用到
server:
port: 8080
- 配置类
@Configuration
public class QueueConfig {
//获取队列名
@Value("${queue}")
private String queue;
//注册bean
@Bean
public Queue logQueue() {
return new ActiveMQQueue(queue);
}
}
- 创建Producer
@Component
@EnableScheduling
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
//每隔5秒向消息队列发送消息
@Scheduled(fixedDelay = 5000)
public void send(){
//用户名,封装邮件内容时使用
String userName = "张三"+ new Random().nextInt(20);
//指定发送到哪个邮箱 (邮件接收者邮箱)
String email = "593****77@qq.com";
JSONObject jsonObject = new JSONObject();
jsonObject.put("userName",userName);
jsonObject.put("email",email);
//将发送的消息转换为Json字符串
String msg = jsonObject.toJSONString();
System.out.println("生产者向消费者发送内容:" + msg);
jmsMessagingTemplate.convertAndSend(queue,msg);
}
}
- 启动类
@EnableScheduling
@SpringBootApplication
public class ActivemqQueueApplication {
public static void main(String[] args) {
SpringApplication.run(ActivemqQueueApplication.class, args);
}
}
消息服务平台(消费者)
- Maven依赖
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- activemq依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- SpringBoot 整合Emai -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 工具包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>LATEST</version>
</dependency>
- YML配置文件
spring:
activemq:
# ActiveMQ消息中间件服务器通讯地址
broker-url: tcp://127.0.0.1:61616
user: admin # 用户名
password: admin #密码
# 发送邮件配置
mail:
# 邮件服务器地址
host: smtp.163.com
# 邮箱用户名(邮件发送者)
username: *********@163.com
# 授权码,163邮箱开通协议时设置的那个授权码,不是登录密码
password: wx1**********3
enable: true
smtp:
auth: true
starttls:
enable: true
required: true
#自定义队列名属性,等下程序中会用到(以生产者的队列名一致)
queue: springboot-queue
server:
port: 8081
- 创建Consumer
@Component
public class Consumer{
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}") //发送方邮箱
private String toEmail;
@JmsListener(destination = "${queue}") //监听的队列,配置文件中的queue属性
public void receive(String msg){
if(StringUtils.isEmpty(msg)){
return;
}
System.out.println("收到生产者消息:"+msg);
JSONObject jsonObject = JSONObject.parseObject(msg);
String userName = jsonObject.getString("userName");
String eamil = jsonObject.getString("eamil");
//发送邮件
sendEmail(userName,toEmail);
}
/**
* 发送简单邮件
* @param userName 用户名,用户封装邮件内容
* @param toEmail 通过哪个邮箱发送
* @return
*/
public String sendEmail(String userName,String toEmail){
//发送消息对象
SimpleMailMessage message = new SimpleMailMessage();
//发送者
message.setFrom(toEmail);
//接收者
message.setTo(toEmail);
//主题(标题)
message.setSubject("尊敬的"+userName);
//内容
message.setText("欢迎使用您使用本公司的产品!"); //发送html,发送html格式源码
javaMailSender.send(message);
System.out.println("邮件发送完成:"+ JSONObject.toJSONString(message));
return "send success!";
}
}
- 启动类
@SpringBootApplication
public class ActivemqQueueConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ActivemqQueueConsumerApplication.class, args);
}
}
测试
- 启动会员服务和消息服务平台服务
- 注意:启动前保证消息队列里面没有消息,有的话则先删除该队列,否则容易造成数据类型不一致导致Json解析异常出错。
会员服务:
消息服务平台:
此时消息服务平台发送邮件成功!
--------------------------------------- 学习不易,需要坚持 ---------------------------------------