diy搭建异步邮件服务

在很多用户注册的场景中,都需要使用邮件异步通知激活账户,这基本都以来于消息中间件,本次使用spring boot+spring amqp+spring mail搭建成功了。可能源于动手实践少,或者对于基本理论掌握不到位才犯下这些错误,现在来分享在这个过程中遇到的几个坑,希望能帮助到大家。

SMTP授权码

java mail服务其实已经很完善了,我们直接调用就行了,spring-boot-starter-mail就集成了相关服务。通过构建一个SimpleMailMessage实体对象,其中包含了邮件发送的单元信息,如title,sender,text等,然后通过一个自动注入的JavaMailSender发送出去就行了。但是这里容易踩坑的是在application.yml配置文件中spring.mail.password,并不是自己邮箱的密码,而是在邮件smtp设置的授权码,所以一开始已经报权限不足。

自动应答

通常作为消息的消费者,spring-amqp默认的模式是自动应答,即AcknowledgeMode.AUTO,如果我们需求是手动应答的话,我们的容器就要设置为AcknowledgeMode.MANUAL,而原来实现了MessageListener的监听者改实现ChannelAwareMessageListener,从名字就可以知道我们在处理消息的函数中会多了一个Channel的对象,这是用来给用户手动应答的方式。

注解监听

采用注解来监听是最方便的,我们不需要去理会消息体转换,不要自己声明connectFactory,MessageListenerContainer这些相关bean(这些在yml文件中定义,spring boot就默认帮你生成了,虽然很强大,但对于初学者并不是很好)。将 @RabbitListener(queues = “sm_queue”)注释到监听函数上面,就能实行监听处理了,非常方便。

消息格式转换

默认在生成者发送的convertAndSend方法中,会先将消息转换到对应的消息体格式,默认是java序列化对象格式,这种方式比较耗资源(包含太多无用的java对象原信息),我们将要传送的消息体转换成json格式可以大大挺高效率,在RabbitTemplate中将MessageConvert设置为Jackson2JsonMessageConverter,在web管理平台就马上可以看到消息体是content-type是application/json格式,然后我们的监听者就可以采用gson等json框架去处理,然后再发送出去。

rabbit的用户角色

以前使用rabbit并不去真正了解用户角色的作用,只记得有超级管理员。今天我创建一个了新的vhost,并为其分配了一个新的用户。当创建的用户的使用,有一个tag的选项,没有去理会,随便写。然后在web管理平台我想通过这个用户去登录的时候,我发现登录不了。查了资料才知道我这个用户权限不足。rabbit用户角色有[Admin] [Monitoring] [Policymaker] [Management] [Impersonator] [None]这几个,具体什么权限,可以上网查一下,但是如果用户想要登录web,至少也要management。

IpTables

我是在虚拟机中搭建的rabbit,在宿主机写代码访问,这其中需要用到端口转换技术。在搭建rebbit的使用,在虚拟机中curl正常返回信息,在宿主机telnet相关端口也通,但是在网页上15672却总是正在处理,就联想到了iptabels的问题。果然,在/etc/iptables.rules文件中添加了5672和15672端口后,再用命令iptables-restore < /etc/iptables.rules 让配置文件生效,宿主机就能正常访问了。不过iptables-restore命令在系统重启后就无效了,如果需要保持的话,需要写入的rc.local中。

猜你喜欢

转载自blog.csdn.net/jerryJavaCoding/article/details/78174534
今日推荐