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

 更新时间:2016年07月21日 11:19:38   转载 作者:everSeeker  
这篇文章主要介绍了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)发送邮件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java基础学习笔记之类加载器

    java基础学习笔记之类加载器

    java中的类加载器:java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以必须有第一个类加载器不是java类
    2016-02-02
  • 简单谈谈Java中的方法和方法重载

    简单谈谈Java中的方法和方法重载

    下面小编就为大家带来一篇简单谈谈Java中的方法和方法重载。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告的教程图解

    去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告的教程图解

    本文通过图文并茂的形式给大家介绍了去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告的教程,需要的朋友可以参考下
    2018-06-06
  • Java编程Nashorn实例代码

    Java编程Nashorn实例代码

    这篇文章主要介绍了Java编程Nashorn实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java实现归并排序算法

    java实现归并排序算法

    归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 本文我们就来详细的探讨下。
    2015-04-04
  • Java线程中的notifyAll唤醒操作(推荐)

    Java线程中的notifyAll唤醒操作(推荐)

    这篇文章主要介绍了Java线程中的notifyAll唤醒操作,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Java实现猜数字小游戏(有次数限制)

    Java实现猜数字小游戏(有次数限制)

    这篇文章主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java截取中英文混合字符串的方法

    Java截取中英文混合字符串的方法

    这篇文章主要为大家详细介绍了Java截取中英文混合字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Java NIO和IO的区别

    Java NIO和IO的区别

    这篇文章主要介绍了Java NIO和IO的区别,需要的朋友可以参考下
    2014-06-06
  • 详解SpringBoot restful api的单元测试

    详解SpringBoot restful api的单元测试

    本篇文章主要介绍了详解SpringBoot restful api的单元测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论