gpt4 book ai didi

java - 如何实现EJB异步调用的监听器

转载 作者:行者123 更新时间:2023-12-03 21:46:25 25 4
gpt4 key购买 nike

我在Jboss 6中部署了一个Web应用程序。我正在使用JDK 6,jSF和P​​rimefaces。

我的业务层中有一种方法,需要很长时间才能完成。
我希望能够在网页上显示该方法正在执行的日志。这是我正在尝试的简化版本:

/* interface to log processing */

interface StatusListener {
void log(String msg);
}

/* Business class */

@Stateless
class Service {

@Asynchronous
public void doProcessing(StatusListener listener) {

for (int i = 0; i < 1000000; i++ ) {
processItem(i);
listener.log("processando item " + n);
}
}
}

/* JSF backing bean class */

@Named
public class WebBean implements StatusListener {

private @EJB Service service;
private StringBuffer msgBuffer;

public void doProcessing() {
service.doProcessing(this);
}

@Override
public void log(String msg) {
msgBuffer.append(msg + "\n");
}

public StringBuffer getMsgBuffer() {
return msgBuffer;
}

}


在我的XHTML中,我有一个 textArea,其值指向 msgBuffer。我使用primefaces民意调查每隔几秒钟更新一次 textArea
问题是 msgBuffer仅在ejb方法完成后才更新。调用了log方法,但是对 msgBuffer的更改仅在ejb完成后才对Web Bean线程可见。我尝试使 msgBuffer易失,并使log和 getMsgBuffer方法同步化,但是没有用。
有人有任何解决办法的线索吗?

最佳答案

我不确定,但是我认为@EJB注释不是
您应该将其与@Asynchronous一起使用。

我的猜测是,直到Service调用终止,您的请求才真正完成doProcessing方法。

尝试使用@Inject,因为它会触发CDI及其所有魔术。

关于java - 如何实现EJB异步调用的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12882705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com