Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java 如何在spring中启动服务器时启动守护程序_Java_Spring - Fatal编程技术网

Java 如何在spring中启动服务器时启动守护程序

Java 如何在spring中启动服务器时启动守护程序,java,spring,Java,Spring,我想在tomcat服务器启动时启动一个守护程序邮件服务线程。因此,我用@Async注释了一个方法 我有一个实现ApplicationListener接口的类。当我从这个类调用异步方法时,它从不异步启动并阻塞当前线程。当我从spring控制器类调用异步方法时,它从不异步阻塞和启动 为什么异步方法从一个类成功执行,而不是从另一个类成功执行 我做错了什么?如何在服务器启动时执行异步方法 提前谢谢 Edit:我尝试使用InitializingBean接口@PostConstruct,init metho

我想在tomcat服务器启动时启动一个守护程序邮件服务线程。因此,我用@Async注释了一个方法

我有一个实现ApplicationListener接口的类。当我从这个类调用异步方法时,它从不异步启动并阻塞当前线程。当我从spring控制器类调用异步方法时,它从不异步阻塞和启动

为什么异步方法从一个类成功执行,而不是从另一个类成功执行

我做错了什么?如何在服务器启动时执行异步方法

提前谢谢


Edit:我尝试使用InitializingBean接口@PostConstruct,init method方法调用我的异步方法,但从未执行过。然后我意识到,默认的lazy init为true,因此我将initializebean的lazy init设置为false。现在它执行我的asnyc方法,但它阻止了当前线程,现在我面临的另一个问题是,我的服务器没有正常停止,但我必须强制停止服务器。

@asyn
是spring框架的一部分,您的侦听器使用spring上下文吗?如果没有,我建议在异步方法中启动一个新线程。

首先,您不需要实现
ApplicationListener
接口。您正在使用Spring—应用程序上下文就足够了

其次,您讨论的是Spring
@Async
,这意味着您的任务应该从应用程序上下文开始,控制器bean是其中的一部分

您需要确保SpringXML文件中有

您可以在@PostConstruct函数上启动任务:

@Component
public class SampleBeanImpl implements SampleBean {

  @Async
  void doSomething() { … }
}


@Component
public class SampleBeanInititalizer {

  @Autowired
  private final SampleBean bean;

  @PostConstruct
  public void initialize() {
    bean.doSomething();
  }
}
基于Spring的,在应用程序启动期间使用
@Async
有限制:

@Async
不能与生命周期回调一起使用,例如
@PostConstruct
。要异步初始化Springbean,请执行以下操作: 必须使用单独的初始化Springbean来调用
@Async
在目标上添加注释的方法

因此,在您的情况下,最好使用您的目标bean进行
初始化bean
实现,然后通过该实现启动守护进程。

是否添加了

要同时启用@Scheduled和@Async注释,只需在配置中包含任务命名空间中的“注释驱动”元素

注意,您也应该考虑配置一个执行器实例。从:

使用可配置的池大小、队列容量、保持活动状态和拒绝策略值定义ThreadPoolTaskExecutor实例。请参阅org.springframework.scheduling.annotation.EnableAsync注释的Javadoc,以了解此XML元素基于代码的替代方案的信息

因此,要创建由具有5个线程的线程池备份的执行器,必须执行以下操作:

<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>

有关更多配置选项,请参阅上文所述的。

我的英语是pool。
您必须将服务类设置为@Lazy(false)。

你好,Danny,谢谢,还有一个问题,如果我不实现ApplicationListener接口,我如何在服务器启动时执行某些方法。接受的解决方案将无法像以下错误中所述那样工作:此解决方案无法作为异步解决方案工作,并且无法在一起工作