2013-01-17 106 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

相關問題