春天长期服务?

时间:2013-12-16 20:09:50

标签: java spring service architecture

我希望在我的Spring应用程序中有一个服务,它使用Java 7 WatchService监视目录以进行更改。这个想法是当目录中的文件发生变化时,通过WebSockets连接的客户端会被通知。

如何让bean作为服务在自己的线程中运行?

1 个答案:

答案 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)。

相关问题