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

时间:2016-09-16 11:18:25

标签: 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); 
    }

    ...

}

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

我正在使用JSF 2.2,PrimeFaces。

提前致谢。

2 个答案:

答案 0 :(得分:5)

您误解了Java EE教程。术语&#34;会话bean&#34;指的是企业会话bean(EJB),而不是会话范围的托管bean(JSF / CDI bean)。

@javax.ejb.Asynchronous注释,因为它的包已经提示,仅适用于EJB。通过在类上添加<my-element></my-element>注释可以识别EJB,例如@javax.ejb.Xxx@Stateless

以下是正确的启动示例:

@Stateful

@Stateless
public class YourService {

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

}

另见:

答案 1 :(得分:1)

除了您尝试使用错误类型的bean之外,您还必须了解Future的工作原理。

当你致电Future.get()时,线程会阻塞,直到Future有结果。因此sendMessage().get()的行为与同步调用完全相同。

但是,如果您在调用sendMessage()之前调用get()然后执行其他任务,则会异步执行。正如您所知,异步调用仅在您不需要立即获得结果时才有用,这使得它在大多数情况下不那么有用。