1

私たちのほとんどは、NIO2 を利用するのに優れたものであることに同意していると思います。入ってくる xml ファイルのファイル システムの一部を監視したいと仮定すると、今では簡単な作業です。しかし、別のサービス ( app -server とファイル システムを監視するサービス) を開始する必要がないように、それらを既存の Java EE アプリケーションに統合したい場合はどうすればよいでしょうか? そのため、EJB 3.1 のすべてのものと、ファイル システムを監視するある種のサービスを備えた重いアプリケーション サーバーを用意し、ファイルが表示されたら適切なアクションを実行します。興味深いことに、適切なアクションは Message を作成して 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 に答える