社会热点

Spring如何优雅地发送异步发送通知?

电脑版   2020-11-26 14:37  

Spring如何优雅地发送异步发送通知?:题主应该想问的是在spring框架下如何开发一个“优雅的、异步的”的去执行一个功能吧?至于这个功能是发送一条MQ消息啊还:-

1

题主应该想问的是在spring框架下如何开发一个“优雅的、异步的”的去执行一个功能吧?至于这个功能是发送一条MQ消息啊还是发送一份邮件、一条短信都可以,重要的是想异步且优雅的执行这些功能。

从上面对题目的分析来看的话,题主可以参考一下我的解决办法和思路:

  1. 异步代表着你需要开启一个单独的线程去做这个事情,这个事情做完了,这个线程需要及时的释放,避免占用系统资源。

  2. 既然在Spring框架下开发,那就定义一个bean交给Spring容器去管理这个bean,保持单例的同时还可以复用这个bean,可以在想发MQ消息的时候去用这个bean,发邮件、发短信的时候也可以用,注入一下就可以了。

  3. 当这个发送通知的动作频繁且量大的时候,就需要用到线程池了,池化技术可以免去了线程临时创建、销毁的开销,还可以保持线程的复用,提升系统的性能。

下面提供在Spring框架下定义一个线程池的bean的步骤:

自己定义一个线程池类继承ThreadPoolTaskExecutor

为什么要自己定义一个呢?因为可以做一些定制的工作,比如打印线程池的一些信息啊,打印一些基础日志啊,甚至基于线程池里队列的阻塞情况做进一步的监控、报警动作也是可以的。代码如下:

定义一个线程池的bean,其他地方可以直接注入使用

实际使用过程中我们就可以直接:

上面就是我对题主问题理解的回答,如有任何问题或者需要源代码的话,大家可以直接私信我,免费提供优雅的线程池代码给大家!

我是【java架构设计】,关注我,持续为您提供Java领域优质内容!

2

Spring异步发送通知,这里面涉及两种:

1.异步去执行一个功能,如:发送短信,发送邮件,下单信息变更,支付信息变更等

2.发送消息通知,使用消息中间件:

ActiveMQ,完全支持JMS和J2EE,支持多语言和多协议

RabbitMQ,是一个开源的AMQP实现,用于在分布式系统中存储转发消息。扩展性、易用性、高可用性等方面表现不俗。支持多客户端多语言,是AMQP的完整实现,

Kafka(主要是日志服务), 一种高吞吐量的分布式发布订阅消息系统,是一个分布式的、分区的、可靠的分布式日志存储服务,它通过一种独一无二的设计提供了一个消息系统的功能。


异步去执行一个功能 :Spring Boot 之异步调用Async

@Async

public void asyncEvent() throws InterruptedException{

Thread.sleep(5000);//数据验证

Thread.sleep(6000);//保存数据

Thread.sleep(7000);//发送邮件

logger.info("异步方法执行完了");

}

1.异步调用很简单,只需要在方法上面加入注解:@Async

2.Spring Boot启动类通过 @EnableAsync注解开启异步。


发送消息通知,使用消息中间件

1.引入依赖:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

2.配置文件:

spring:

application:

name: Spring-boot-rabbitmq

rabbitmq:

host: 39.105.167.131

port: 5762

username: guest

password: guest

3.定义队列

@Configuration

public class RabbitConfig {

@Bean

public Queue Queue() {

return new Queue("hello");

}

}

4.发送者

5.接受者

6.测试

注意,发送者和接收者的 queue name 必须一致,不然不能接收。
执行测试方法,就可以发送消息了.

我们上面只是简单地做了一对一测试,还有一对多,发布与订阅,路由模式,主题模式

以上只是抛砖引玉,介绍基本流程,详细开发流程,欢迎留言交流。

本文版权归原作者所有,如需商业用途或转载请与原作者联系。

分享

相关信息
 
李靓蕾会原谅王力宏吗

2021-12-30 14:01:01