2016-05-09 64 views
1

我有CDI事件來通知我的JSF應用程序EJB進程的進度。當一切都是同步時,代碼工作正常。@ @detand bean中的@Asynchronous CDI Events和@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 爪哇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()); 
} 
相關問題