2013-01-17 187 views
1

我想我们大多数人都同意,NIO2是一个很好的使用。假设你想监视传入xml文件系统的某个部分 - 文件现在是一件容易的事情。但是如果我想将这些东西集成到现有的Java EE应用程序中,那么我不需要启动另一个服务(应用程序服务器监视文件系统的服务)? 因此,我有重量级的应用程序服务器与所有的EJB 3.1的东西和某种服务监控文件系统,并采取适当的行动,一旦文件出现。有趣的是,合适的操作是创建一个消息并通过JMS发送它,并且将它们整合到应用程序服务器中可能会很好。EJB 3.1和NIO2:监视文件系统

我试过@Startup但部署冻结(我知道我不应该在那里使用I/O,只是一个尝试)。总之......任何建议?

回答

0

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

+0

喜尼古拉斯,##首先的thx为你的时间。目前我们正在使用JBoss 7.1.1,但可能会切换到Glassfish 3.1。 JMX绝对是一种选择,但我想知道,ESB(如JBoss ESB)如何解决这个问题,他们是否也使用JMX? – Subcomandante

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. 
       } 
      } 
     } 
    } 

} 
+0

干得好,我会尝试一下......除了异步方面,我做了几乎相同的事情。 – Subcomandante

相关问题