我希望在我的Spring应用程序中有一个服务,它使用Java 7 WatchService监视目录以进行更改。这个想法是当目录中的文件发生变化时,通过WebSockets连接的客户端会被通知。
如何让bean作为服务在自己的线程中运行?
答案 0 :(得分:4)
您正在寻找的是Asynchronous execution.通过正确配置的上下文(请参阅链接),您可以声明一个类似的类
@Component
public class AsyncWatchServiceExecutor {
@Autowired
private WatchService watchService; // or create a new one here instead of injecting one
@Async
public void someAsyncMethod() {
for (;;) {
// use WatchService
}
}
}
你在someAsyncMethod()
中所做的一切都将在一个单独的线程中发生。你所要做的只是叫它一次。
ApplicationContext context = ...; // get ApplicationContext
context.getBean(AsyncWatchServiceExecutor.class).someAsyncMethod();
使用Oracle documentation中所述的WatchService
。
如果您无法直接访问ApplicationContext
,则可以将bean注入其他bean中,并使用@PostConstruct
方法调用它。
@Component
public class AsyncInitializer {
@Autowired
private AsyncWatchServiceExecutor exec;
@PostConstruct
public void init() {
exec.someAsyncMethod();
}
}
小心使用哪种代理策略(JDK或CGLIB)。