1

我想我们大多数人都同意,NIO2 是一个很好的利用方式。假设您想监视文件系统的某些部分以获取传入的 xml - 文件,现在这是一项简单的任务。但是,如果我想将这些东西集成到现有的 Java EE 应用程序中,这样我就不必启动另一个服务(应用程序服务器监视文件系统的服务)怎么办?所以我有重量级的应用服务器,包含所有 EJB 3.1 的东西和某种监视文件系统的服务,并在文件出现后采取适当的行动。有趣的是,适当的操作是创建一条消息并通过 JMS 发送它,将两者集成到应用程序服务器中可能会很好。

我尝试了@Startup,但部署冻结了(我知道我不应该在那里使用 I/O,只是尝试一下)。无论如何......有什么建议吗?

4

2 回答 2

1

您可以创建一个在启动时加载的单例并将监视委托给异步 bean

@Singleton
@Startup
public class Initialiser {

    @EJB
    private FileSystemMonitor fileSystemMonitor;

    @PostConstruct
    public void init() {
        String fileSystemPath = ....;
        fileSystemMonitor.poll(fileSystemPath);
    }

}

然后异步 bean 看起来像这样

@Stateless
public class FileSystemMonitor {

    @Asynchronous
    public void poll(String fileSystemPath) {
        WatchService watcher = ....;
        for (;;) {
            WatchKey key = null;
            try {
                key = watcher.take();
                for (WatchEvent<?> event: key.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    if (kind == StandardWatchEventKinds.OVERFLOW) {
                        continue; // If events are lost or discarded
                    }
                    WatchEvent<Path> watchEvent = (WatchEvent<Path>)event;

                    //Process files....

                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            } finally {
                if (key != null) {
                    boolean valid = key.reset();
                    if (!valid) break; // If the key is no longer valid, the directory is inaccessible so exit the loop.
                }
            }
        }
    }

}
于 2013-01-22T14:56:37.367 回答
0

如果您指定了您正在使用的服务器,可能会有所帮助,但您是否考虑过实现基于 JMX 的服务?它比 EJB 更“中性”一点,更适合后台服务并且限制更少。

于 2013-01-17T16:17:52.697 回答