如何从会话bean实现异步调用

Jua*_*eno 1 jsf asynchronous

在官方Java EE文档中,https://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html 说“会话bean可以实现异步方法”。遵循本教程之后,我将无法异步执行方法。

它实际上有效,但与其他任何同步方法一样。(它不会启动任何其他线程)。

@ManagedBean(name = "inicioSSCCBean") 
@SessionScoped
public class InicioSSCCBean implements Serializable {

    ...

    @Asynchronous
    public Future<String> sendMessage() {
        String status;
        try {
            // Call to SAP server...
        } catch (MessagingException ex) {
            // Error handler
        }
        return new AsyncResult<String>(status);
    }

    public void otherMethod() {
        String result = sendMessage().get();    // The result is what I expect
        System.out.println(result); 
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何实现来自会话bean的异步调用?主要目标是调用SAP服务,并异步获取结果。

我正在使用JSF 2.2,PrimeFaces。

提前致谢。

Bal*_*usC 6

您误解了Java EE教程。术语“会话Bean”是指企业会话Bean(EJB),而不是会话范围内的受管Bean(JSF / CDI Bean)。

@javax.ejb.Asynchronous注解,因为它的软件包中已经暗示,只能在EJB中。EJB是由具有可识别@javax.ejb.Xxx的类注释,例如@Stateless@Stateful

以下是正确的启动示例:

@Stateless
public class YourService {

    @Asynchronous
    public void asyncDoSomething() {
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

@ManagedBean
public class YourBean {

    @EJB
    private YourService yourService;

    public void submit() {
        yourService.asyncDoSomething();
    }

}
Run Code Online (Sandbox Code Playgroud)

也可以看看: