首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现会话bean中的异步调用

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

Stack Overflow用户
提问于 2016-09-16 11:18:25
回答 2查看 7.3K关注 0票数 1

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

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

代码语言:javascript
复制
@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服务,并异步获得结果。

我使用的是JSF2.2,PrimeFaces。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-16 21:18:35

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

正如它的包已经暗示的那样,@javax.ejb.Asynchronous注释只在EJB中工作。EJB可以通过类上的@javax.ejb.Xxx注释来识别,比如@Stateless@Stateful

下面是正确的开球示例:

代码语言:javascript
复制
@Stateless
public class YourService {

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

}

代码语言:javascript
复制
@ManagedBean
public class YourBean {

    @EJB
    private YourService yourService;

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

}

另请参阅:

票数 6
EN

Stack Overflow用户

发布于 2016-09-16 12:21:31

除了试图使用错误的bean这一事实之外,您还必须了解Future是如何工作的。

当您调用Future.get()时,线程将阻塞,直到Future有一个结果。因此,sendMessage().get()的行为与同步调用完全一样。

但是,如果调用sendMessage(),然后在调用get()之前执行其他任务,则将异步执行。当您意识到异步调用只有在不需要结果的时候才有用,这使得它在大多数情况下不太有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39530186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档