2016-05-09 4 views
1

EJBプロセスからJSFアプリケーションに進捗状況を通知するCDIイベントが用意されています。コードはすべてが同期しているときにうまく動作します。@Asynchronous CDIイベントと@Named beanの@Observesメソッド

@Stateless 
public class MySessionBean implements Serializable { 

    @Inject 
    @ProcessEvent 
    Event<ProcessEvent> processEvent; // Also tried to use BeanManager 

    @Asynchronous // This annotation breaks my code 
    public void runLongProcess() { 
     processEvent.fire(new ProcessEvent()); 
    } 

} 

@Named 
@ViewScoped 
public class ManagedBean implements Serializable { 

    @EJB 
    MySessionBean sessionBean; 

    public void runProcess() { 
     sessionBean.runLongProcess(); 
    } 

    @Asynchronous // This annotation doesn't work 
    public void onEvent(@Observes @ProcessEvent ProcessEvent event){ 
     LOGGER.log(Level.INFO, "Event was received"); // Never called 
    } 
} 

私はrunLongProcess()@Asychronousアノテーションを使用している場合、JSF @Observerメソッドが呼び出されることはありません。

どうすればこの機能を実現できますか?

JSF 2.2 Glassfishの3.1 JEE 7 のJava 8 Omnifaces 2.3

答えて

3

必ずしもどこでもその瞬間にそのスレッドでHTTPリクエストの手段がありません。したがって、その時点で利用可能/識別可能なJSFビュー(HTTPリクエストまたはセッションはもちろんですが)は必ずしもありません。

アプリケーションスコープBeanで動作します。

OmniFaces 2.3を使用していることを考えると、あなたが念頭に置いていた要件を解決するには、<o:socket>を見てみる価値があるかもしれません。また、このドキュメントでは、このケースと、コールバックの助けを借りて適切に解決する方法(およびWebソケット経由でビューにプッシュする方法)についても説明しています。

@Inject 
private SomeService someService; 

@Inject @Push 
private PushContext someChannel; 

public void someAction() { 
    someService.someAsyncServiceMethod(entity, message -> someChannel.send(message)); 
} 

@Asynchronous 
public void someAsyncServiceMethod(Entity entity, Consumer<Object> callback) { 
    // ... (some long process) 
    callback.accept(entity.getSomeProperty()); 
} 
関連する問題