Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

rabbitmq简介:

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ。

本节的内容是用户注册时,将邮箱地址先存入rabbitmq队列,之后返回给用户注册成功;之后消息队列的接收者从队列中获取消息,发送邮件给用户。

一、RabbitMQ介绍

如果之前对rabbitmq不了解,推荐先看一下RabbitMQ Quick(快速手册)。

1、rabbitmq在mac上的安装。

2、rabbitmq简单介绍。

生产者: 负责发送消息到Exchange。

Exchange: 按照一定的策略,负责将消息存入到指定的队列。

队列queue:  负责保存消息。

消费者: 负责从队列中提取消息。

binding: 负责Exchange和队列的关联映射,Exchange和queue是多对多的关系。

二、RabbitMQ在Spring中的实现

1、引入依赖包。

<dependency>
   <groupId>org.springframework.amqp</groupId>
   <artifactId>spring-amqp</artifactId>
   <version>1.6.0.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.amqp</groupId>
   <artifactId>spring-rabbit</artifactId>
   <version>1.6.0.RELEASE</version>
  </dependency> 

2、rabbitmq配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/rabbit"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!--1、配置连接工厂, 如果不配置host, port, username, passowrd, 则按默认值localhost:5672, guest/guest-->
 <!--<connection-factory id="connectionFactory" />-->
 <connection-factory id="connectionFactory"
      host="localhost"
      port="5672"
      username="everSeeker"
      password="333" />
 <!--2、配置队列queue, Exchange, 以及将他们结合在一起的binding-->
 <!--在queue以及exchange中, 有一个重要的属性durable, 默认为true, 可以防止宕机后数据丢失。-->
 <!--在listener-container中, 有acknowledge属性, 默认为auto, 即消费者成功处理消息后必须有个应答, 如果消费者程序发生异常或者宕机, 消息会被重新放回队列-->
 <admin connection-factory="connectionFactory" />
 <queue id="userAlertEmailQueue" name="user.alerts.email" durable="true" />
 <queue id="userAlertCellphoneQueue" name="user.alerts.cellphone" />  <!--durable默认为true-->
 <!--标准的AMQP Exchange有4种: Direct, Topic, Headers, Fanout, 根据实际需要选择。-->
 <!--Direct: 如果消息的routing key与bingding的routing key直接匹配的话, 消息将会路由到该队列上。-->
 <!--Topic: 如果消息的routing key与bingding的routing key符合通配符匹配的话, 消息将会路由到该队列上。-->
 <!--Headers: 如果消息参数表中的头信息和值都与binding参数表中相匹配, 消息将会路由到该队列上。-->
 <!--Fanout: 不管消息的routing key和参数表的头信息/值是什么, 消息将会路由到该队列上。-->
 <direct-exchange name="user.alert.email.exchange" durable="true">
  <bindings>
   <binding queue="user.alerts.email" />  <!--默认的routing key与队列的名称相同-->
  </bindings>
 </direct-exchange>
 <direct-exchange name="user.alert.cellphone.exchange">
  <bindings>
   <binding queue="user.alerts.cellphone" />
  </bindings>
 </direct-exchange>
 <!--3、配置RabbitTemplate发送消息-->
 <template id="rabbitTemplate"
    connection-factory="connectionFactory" />
 <!--4、配置监听器容器和监听器来接收消息-->
 <beans:bean id="userListener" class="com.everSeeker.alerts.UserAlertHandler" />
 <listener-container connection-factory="connectionFactory" acknowledge="auto">
  <listener ref="userListener"
     method="handleUserAlertToEmail"
     queues="userAlertEmailQueue" />
  <listener ref="userListener"
     method="handleUserAlertToCellphone"
     queues="userAlertCellphoneQueue" />
 </listener-container>
</beans:beans> 

如果配置connection-factory时,采用默认的guest/guest账号密码时,有可能会出现org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.的错误提示,解决办法是新建一个管理员权限的用户,并允许访问虚拟主机。

步骤如下:

1、打开http://localhost:15672/

2、Admin ——> Users, 新建用户,administrator权限。

3、Virtual Hosts,设置新建用户允许访问。

3、生产者发送消息到exchange。

@Service("userAlertService")
public class UserAlertServiceImpl implements UserAlertService {
 private RabbitTemplate rabbit;
 @Autowired
 public UserAlertServiceImpl(RabbitTemplate rabbit) {
  this.rabbit = rabbit;
 }
 public void sendUserAlertToEmail(User user) {
  //convertAndSend(String exchange, String routingKey, Object object), 将对象object封装成Message对象后, 发送给exchange
  rabbit.convertAndSend("user.alert.email.exchange", "user.alerts.email", user);
 }
} 

4、配置消费者来接收消息。

public class UserAlertHandler {
 public void handleUserAlertToEmail(User user) {
  System.out.println(user);
}

三、通过javax.mail来发送邮件

1、引入依赖包。

<dependency>
 <groupId>javax.mail</groupId>
 <artifactId>mail</artifactId>
 <version>1.4.7</version>
</dependency> 

2、配置邮件服务器信息。

@Bean
public MailSender mailSender(Environment env) {
 JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
 //如果为普通邮箱, 非ssl认证等, 比如163邮箱
 mailSender.setHost(env.getProperty("mailserver.host"));
 mailSender.setPort(Integer.parseInt(env.getProperty("mailserver.port")));
 mailSender.setUsername(env.getProperty("mailserver.username"));
 mailSender.setPassword(env.getProperty("mailserver.password"));
 mailSender.setDefaultEncoding("utf-8");
 //如果邮件服务器采用了ssl认证, 增加以下配置, 比如gmail邮箱, qq邮箱
 Properties props = new Properties();
 props.put("mail.smtp.auth", "true");
 props.put("mail.smtp.starttls.enable", "true");
 props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
 props.put("mail.smtp.socketFactory.port", "465");
 mailSender.setJavaMailProperties(props);
 return mailSender;
} 

3、发送邮件。

@Component("userMailService")
public class UserMailServiceImpl implements UserMailService {
 private MailSender mailSender;
 @Autowired
 public UserMailServiceImpl(MailSender mailSender) {
  this.mailSender = mailSender;
 }
 public void sendSimpleUserMail(String to, User user) {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setFrom("xxxxxxxx@qq.com");
  message.setTo(to);
  message.setSubject(user.getUsername() + "信息确认");
  message.setText(user.toString());
  mailSender.send(message);
 }
} 

4、消费者调用发送邮件方法即可。

1、参考文献:Spring实战(第4版)。

2、完整代码在github,地址:https://github.com/everseeker0307/register

以上所述是小编给大家介绍的Spring学习笔记3之消息队列(rabbitmq)发送邮件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 消息队列 RabbitMQ 与 Spring 整合使用的实例代码

    一.什么是 RabbitMQ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然. RabbitMQ 是由 Erlang 语言开发,安装 RabbitMQ 服务需要先安装 Erlang 语言包. 二.如何与 Spring 集成 1. 我们都需要哪些 Jar 包? 抛开单独使用 Spring 的包不说,

  • Spring Boot整合RabbitMQ实例(Topic模式)

    1.Topic交换器介绍 Topic Exchange 转发消息主要是根据通配符. 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息. 在这种交换机模式下: 路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等. 路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.*

  • spring boot整合RabbitMQ(Direct模式)

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. 1.新建一个Spring Boot工程,命名为:"rabbitmq-hello". 在pom.xml中引入如下依赖内容,其中spring-boot-starter-amqp用于支持RabbitMQ. <dependency> <groupId>org.springframework.boo

  • 详解Spring Boot 配置多个RabbitMQ

    闲话 好久没有写博客了,6月份毕业,因为工作原因,公司上网受限,一直没能把学到的知识点写下来,工作了半年,其实学到的东西也不少,但是现在回忆起来的东西少之又少,有时甚至能在同个问题中踩了几次,越来越觉得及时记录一下学到的东西很重要. 好了,闲话少说,写下这段时间学习的东西,先记录一下用spring Boot配置多个RabbitMQ的情况... 最近公司新启动一个新平台的项目,需要用微服务这个这几年很火的概念来做,所以就学习了Spring Boot方面的知识,给同事展示Spring Boot的一些

  • rabbitmq结合spring实现消息队列优先级的方法

    1.1项目背景:做一个灾情预警的消息平台,灾情检查系统需要向消息平台里面推送消息,这里是典型的异构系统的消息传递,我们需要选择一个中间件作为消息队列,调研分析了rabbitmq,zeromq,activemq,kafka等消息中间件,综合性能,安全,可持久化等角度果断选择了rabbitmq作为我们的消息中间件 (其实这里是因为rabbitmq 是spring官方支持的,开发起来方便).需求上我们有多种类型的消息,这里有紧急推送的和一般的等区分,高并发时,就会有对消息进行优先推送的情况出现,于是r

  • spring boot整合RabbitMQ实例详解(Fanout模式)

    1.Fanout Exchange介绍 Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略. 如上图所示,即当使用fanout交换器时,他会将消息广播到与该交换器绑定的所有队列上,这有利于你对单条消息做不同的反应. 例如存在以下场景:一个web服务要在用户完善信息时,获得积分奖励,这样你就可以创建两个对列,一个用来处理用户信息的请求,另一个对列获取这条消息是来完成积分奖励的任务. 2.代码示例 1).

  • 详解spring boot集成RabbitMQ

    RabbitMQ作为AMQP的代表性产品,在项目中大量使用.结合现在主流的spring boot,极大简化了开发过程中所涉及到的消息通信问题. 首先正确的安装RabbitMQ及运行正常. RabbitMQ需啊erlang环境,所以首先安装对应版本的erlang,可在RabbitMQ官网下载 # rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm 使用yum安装RabbitMQ,避免缺少依赖包引起的安装失败 # yum install rabbitmq-s

  • Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

    rabbitmq简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ. 本节的内容是用户注册时,将邮

  • Spring整合消息队列RabbitMQ流程

    目录 搭建生产者工程 创建工程 添加依赖 配置整合 发送消息 搭建消费者工程 创建工程 添加依赖 配置整合 消息监听器 搭建生产者工程 创建工程 添加依赖 修改pom.xml文件内容为如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.

  • Spring学习笔记1之IOC详解尽量使用注解以及java代码

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4. 一.准备工作. 1.m

  • springboot整合消息队列RabbitMQ

    前言: RabbitMQ常用的三种Exchange Type:fanout.direct.topic. fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中. direct:把消息投递到那些binding key与routing key完全匹配的队列中. topic:将消息路由到binding key与routing key模式匹配的队列中. 这里基于springboot整合​​消息队列​​,测试这三种Exchange. 启动RabbitMQ 双击运行rabbitmq-s

  • Spring学习笔记2之表单数据验证、文件上传实例代码

    在上篇文章给大家介绍了Spring学习笔记1之IOC详解尽量使用注解以及java代码,接下来本文重点给大家介绍Spring学习笔记2之表单数据验证.文件上传实例代码,具体内容,请参考本文吧! 一.表单数据验证 用户注册时,需要填写账号.密码.邮箱以及手机号,均为必填项,并且需要符合一定的格式.比如账号需要32位以内,邮箱必须符合邮箱格式,手机号必须为11位号码等.可以采用在注册时验证信息,或者专门写一个工具类用来验证:来看下在SpringMVC中如何通过简单的注释实现表单数据验证. 在javax

  • 利用Python操作消息队列RabbitMQ的方法教程

    前言 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发

  • Python操作RabbitMQ服务器实现消息队列的路由功能

    Python使用Pika库(安装:sudo pip install pika)可以操作RabbitMQ消息队列服务器(安装:sudo apt-get install rabbitmq-server),这里我们来看一下MQ相关的路由功能. 路由键的实现 比如有一个需要给所有接收端发送消息的场景,但是如果需要自由定制,有的消息发给其中一些接收端,有些消息发送给另外一些接收端,要怎么办呢?这种情况下就要用到路由键了. 路由键的工作原理:每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键.发送

  • php+redis消息队列实现抢购功能

    本文实例为大家分享了php+redis消息队列实现抢购的具体代码,供大家参考,具体内容如下 实现功能: 1. 基于redis队列,防止高并发的超卖 2. 基于mysql的事务加排它锁,防止高并发的超卖 基于redis队列工作流程: 1. 管理员根据goods表中的库存,创建redis商品库存队列 2. 客户端访问秒杀API 3. web服务器先从redis的商品库存队列中查询剩余库存重点内容 4. redis队列中有剩余,则在mysql中创建订单,去库存,抢购成功 5. redis队列中没有剩余

  • Spring学习笔记之bean生命周期

    前言 上一篇文章主要学习了下bean的配置.注入.自定义属性编辑器,今天来熟悉bean的生命周期. 任何一个事物都有自己的生命周期,生命的开始.生命中.生命结束.大家最熟悉的应该是servlet 的生命周期吧.和 servlet 一样 spring bean 也有自己的生命周期. 在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的.关于bean的生命周期我在网上也找了好多,基本都差不多.这里我主要是想通过代码来验证,毕竟学的知识都是一样的,都是学的Java,最重要的是动手练习

随机推荐