2017-07-29 5 views
0

私は、servletとejbというwarで構成されるearアプリケーションを持っています。EEアプリケーション用のEJBとプレーンCDIの予約済みタイマーの実践パターン

@ javax.ejb.Scheduleのためだけにejbが必要でした。毎分実行しなければならないことは、戦争アプリによって傍受されるCDIイベントを発生させることです。

CDIイベントは、クラスが同じクラスローダーを共有している場合にのみ接続されるため、これは機能しません。 EJBとWARは異なるパッケージ - 異なるクラスローダーです。

だから私は(それに最も基本的な形です)このパターンを思い付いた:

@javax.enterprise.context.ApplicationScoped 
public class TimerMockUp { 

@Resource(mappedName="java:jboss/ee/concurrency/executor/cacheService") Executor ex; 
@Inject Event<SomeEvent> evt; 

@PostConstruct 
private void initTimer(){ 
    ex.execute(()->{ 
     try{ 
      while(true){ 
       evt.fire(new SomeEvent()); 
       Thread.sleep(4000); 
      } 
     } catch (Exception ex){ 

     } 
    }); 
} 

この上のあなたのテイクは何ですか?あなたはこれが長いターンで信頼できると思いますか?同じことを達成するために他にどのような選択肢がありますか?

+0

という理由だけで。私はそれがej​​b-3.xアプリケーションだと思います。なぜあなたは耳を展開する必要があり、すべてを戦争に入れることはできませんか? – aschoerk

+0

初期の意図はWARを持つことだけでしたが、Timerの必要性は... EJBの領域になりました。しかし、その後、CDIイベントのヒックアップが起こった。 – hrs

+1

あなたは、あなたのEJBをWARに入れることができますか、バージョン2.xで作業していますか?次のURLを参照してください。https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html – aschoerk

答えて

0

イベントを注入するための要件は不明ですが、インクリメンタルタイマーを実行するための標準的な方法は、@Scheduleアノテーション付きのEJBタイマーを使用することです。例えば

:私は純粋のejb-3.xの人のように興味を持ってい

@Singleton 
@Startup 
public class TimerBean { 

    @Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) 
    public void doEvery5Sec() { 
     // do something... 
    } 
} 
+0

そうです。しかし、このEJBは別のモジュールのObserverにCDIイベントを送ることはできません。これは私が必要とするものです。 – hrs

関連する問題