我想我们大多数人都同意,NIO2是一个很好用的东西。假设您想监视文件系统的某些部分以获取传入的xml文件,现在这是一项简单的任务。但是,如果我想将这些东西集成到现有的Java EE应用程序中,那么我不必启动另一项服务(app-server AND 监视文件系统的那个)? 因此,我拥有所有EJB 3.1内容的重量级app-server以及监视文件系统的某种服务,并在文件出现后采取适当的操作。有趣的是,适当的操作是创建一个消息并由JMS发送它,将它们集成到应用服务器中可能会很好。
我尝试了@Startup但部署冻结了(我知道我不应该在那里使用I / O,只是一次尝试)。无论如何......有什么建议吗?
答案 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更“中立”,更适合后台服务并且限制较少。