Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 从@Schedule方法调用@Async方法_Asynchronous_Spring Boot_Scheduler - Fatal编程技术网

Asynchronous 从@Schedule方法调用@Async方法

Asynchronous 从@Schedule方法调用@Async方法,asynchronous,spring-boot,scheduler,Asynchronous,Spring Boot,Scheduler,我有一个调度器,它每1秒侦听一次队列(Priorityqueue,不像mq/jms),一旦我得到我感兴趣的消息,我就想执行一些逻辑 所以我有一个每秒钟运行一次的调度器,从那个时起,我调用了带有@Async注释的方法,假设一旦我调用了该方法,调度器将以其间隔重新运行 下面是示例代码,不确定我是否使用了正确的模式或建议。这个想法是,一旦我们有了消息,我们就不应该等待prev处理,我们可以让多个线程来处理它 我用的是弹簧靴 @Scheduled(fixedDelayString = "1000", i

我有一个调度器,它每1秒侦听一次队列(Priorityqueue,不像mq/jms),一旦我得到我感兴趣的消息,我就想执行一些逻辑

所以我有一个每秒钟运行一次的调度器,从那个时起,我调用了带有@Async注释的方法,假设一旦我调用了该方法,调度器将以其间隔重新运行

下面是示例代码,不确定我是否使用了正确的模式或建议。这个想法是,一旦我们有了消息,我们就不应该等待prev处理,我们可以让多个线程来处理它

我用的是弹簧靴

@Scheduled(fixedDelayString = "1000", initialDelay = 10000)
public void startScheduler() {

   Message msg = queue.peek();

   if(msg!=null){
      doProcessing(msg);
   }

}


@Async
public void doProcessing(Message msg){
// Do processing
// May take 5 seconds.
}   

忘了提到这是不起作用的,它会等到doProcessing完成。Spring AOP使用代理,因此内部方法调用不会通过代理,因此
@Async
不起作用。它必须是一个外部方法调用。与其把自己的解决方案拼凑在一起,不如使用spring消息传递抽象(它提供了这一点,而且是开箱即用的)。目前,也可以通过发布自定义事件,然后用@Async注释侦听器来实现。