php用什么办法实现异步任务?
php实现异步任务的方法:
通用的异步执行文件 exec.phpsleep(8);
$data = "--- type " . date("Y-m-d H:i:s") . " ---\n";
file_put_contents("../log.txt", $data, FILE_APPEND);
popen
通过 popen() 函数打开进程文件指针,从而能异步执行脚本文件。(只在linux下有效)pclose(popen("php exec.php &", 'r'));
echo 1;
Spring如何优雅地发送异步发送通知?
题主应该想问的是在spring框架下如何开发一个“优雅的、异步的”的去执行一个功能吧?至于这个功能是发送一条MQ消息啊还是发送一份邮件、一条短信都可以,重要的是想异步且优雅的执行这些功能。
从上面对题目的分析来看的话,题主可以参考一下我的解决办法和思路:
异步代表着你需要开启一个单独的线程去做这个事情,这个事情做完了,这个线程需要及时的释放,避免占用系统资源。
既然在Spring框架下开发,那就定义一个bean交给Spring容器去管理这个bean,保持单例的同时还可以复用这个bean,可以在想发MQ消息的时候去用这个bean,发邮件、发短信的时候也可以用,注入一下就可以了。
当这个发送通知的动作频繁且量大的时候,就需要用到线程池了,池化技术可以免去了线程临时创建、销毁的开销,还可以保持线程的复用,提升系统的性能。
下面提供在Spring框架下定义一个线程池的bean的步骤:
自己定义一个线程池类继承ThreadPoolTaskExecutor
为什么要自己定义一个呢?因为可以做一些定制的工作,比如打印线程池的一些信息啊,打印一些基础日志啊,甚至基于线程池里队列的阻塞情况做进一步的监控、报警动作也是可以的。代码如下:
定义一个线程池的bean,其他地方可以直接注入使用
实际使用过程中我们就可以直接:
上面就是我对题主问题理解的回答,如有任何问题或者需要源代码的话,大家可以直接私信我,免费提供优雅的线程池代码给大家!
我是【java架构设计】,关注我,持续为您提供Java领域优质内容!
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 必须一致,不然不能接收。
执行测试方法,就可以发送消息了.
我们上面只是简单地做了一对一测试,还有一对多,发布与订阅,路由模式,主题模式
以上只是抛砖引玉,介绍基本流程,详细开发流程,欢迎留言交流。