EJB 3.1和NIO2:监视文件系统

时间:2013-01-17 14:29:02

标签: ejb-3.1 nio2

我想我们大多数人都同意,NIO2是一个很好用的东西。假设您想监视文件系统的某些部分以获取传入的xml文件,现在这是一项简单的任务。但是,如果我想将这些东西集成到现有的Java EE应用程序中,那么我不必启动另一项服务(app-server AND 监视文件系统的那个)? 因此,我拥有所有EJB 3.1内容的重量级app-server以及监视文件系统的某种服务,并在文件出现后采取适当的操作。有趣的是,适当的操作是创建一个消息并由JMS发送它,将它们集成到应用服务器中可能会很好。

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

2 个答案:

答案 0 :(得分: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.
                }
            }
        }
    }

}

答案 1 :(得分:0)

如果您指定了正在使用的服务器,但是您是否考虑过实施基于JMX的服务?它比EJB更“中立”,更适合后台服务并且限制较少。