前言
在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件、发送短信、微信推送等,公司内部消息平台再去调用第三发消息平台。消息服务平台的接口有两种:同步和异步,同步需求一般是需要返回调用第三方平台是否成功,否则都采用异步的。
公司内部消息服务平台
调用内部消息服务平台,使用消息中间件
发送消息一般都会做消息模板,调用的时候传模板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解析异常出错。
会员服务:
消息服务平台:
此时消息服务平台发送邮件成功!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/216683/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)