【问题标题】:How to implement async calls from session bean如何从会话 bean 实现异步调用
【发布时间】:2016-09-16 11:18:25
【问题描述】:

在官方 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。

提前致谢。

【问题讨论】:

  • 你是什么意思它工作,但像任何其他同步方法?向我们展示你是如何使用它的。
  • 让我知道我是否可以更清楚地表达对我糟糕的英语的抱歉。

标签: jsf asynchronous


【解决方案1】:

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

@javax.ejb.Asynchronous 注释,正如其包已经暗示的那样,仅适用于 EJB。通过在类上添加 @javax.ejb.Xxx 注释可以识别 EJB,例如 @Stateless@Stateful

以下是正确的启动示例:

@Stateless
public class YourService {

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

}

@ManagedBean
public class YourBean {

    @EJB
    private YourService yourService;

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

}

另见:

【讨论】:

  • 在使用 JSF 时分析线程的安全性非常重要。用户为同一任务启动多个线程的可能性很大......感谢@BC的建议。
  • @Cold:另见第二个“另见”链接。那部分已经详细说明了那里以及具体的例子。
【解决方案2】:

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

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

但是,如果您调用sendMessage(),然后在调用get() 之前执行其他任务,它将异步执行。当您意识到异步调用仅在您不需要立即获得结果时才有用,这使得它不像大多数情况下看起来那么有用。

【讨论】:

  • 我尝试了不使用 get() 方法,但它一直以相同的方式工作。我正在使用 JBoss AS 7 服务器。不知道是否需要任何特定配置。提前致谢。
  • 啊,第二个常见问题。你不能从同一个类中调用它的异步方法。您需要一个服务类(例如),将异步方法注入您的 bean。
  • 不,@Asynchronous 在 JSF 托管 bean 中根本没有任何作用。
  • @BalusC 哦,我完全错过了(自从我接触纯 Java EE 以来已经有一段时间了)。然而他确实掉进了立即拨打get()的陷阱。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多