0

我正在使用 WebSphere 8.5 和 JSF2.0,但在使用 WorkManager(来自 websphere - async bean)时遇到问题。我有一个实现 Work 接口的workManagerExample类。当我从我的应用程序中调用 workManagerExample 时,我无法再获取已在我的应用程序中加载的类的方法。情况:我的应用程序中有一个实用程序类(它工作正常),但是当我尝试从 workManagerExample 使用它(如 Utility.someMethod)时,我得到了一个 NPE。我在调用“startWork(WorkManagerExample)”之前检查了 Utility 类并且不为空,我可以像往常一样使用它。顺便说一句,workManager 工作正常,无需从我的应用程序调用任何已加载的类。我不能将 Utility 类作为 workManagerExample 构造函数的参数传递(这是来自客户/客户的限制)。我的问题是为什么我不再使用这个 Asyn Bean 中的 Utility 类函数?

web.xml
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
//some extra config not related
    <resource-ref>
        <description>WorkManager</description>
        <res-ref-name>wm/default</res-ref-name>
        <res-type>com.ibm.websphere.asynchbeans.WorkManager</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> 
</web-app>

ibm-web-bnd.xml
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
version="1.0">
    <virtual-host name="default_host" />
    <resource-ref name="wm/default" binding-name="wm/default" />
</web-bnd>

这是我的参考指南http://www.bencode.net/blog/2014/07/26/was-async-beans/

一些java代码:Class1.java

WorkManager workManager = getWorkManager();
if (workManager!=null){   
  GetInfoWork currentOfferWork = new GetInfoWork(); //GetInfoWork implements Work
  workManager.startWork(currentOfferWork);  
}

在 GetInfoWork.java 中,当我尝试 'FacesContext.getCurrentInstance();' 我总是得到 NULL 但如果我从 Class1.java 尝试它会按预期工作。文件夹结构与通常的 JSF2 Web 应用程序一样,这是一个现有应用程序,现在我想通过 workManager(来自 com.ibm.ws.runtime.jar)添加此 Async Bean 功能。

4

1 回答 1

1

FacesContext.getCurrentInstance()不是您的实用程序类,而是 JSF 框架的内部部分。如果你看一下java doc:

public static FacesContext getCurrentInstance()

返回当前线程正在处理的请求的 FacesContext 实例。

FacesContext需要一个处理 Web 请求的线程才能正常工作,并且在单独的线程中调用异步 bean,它根本不知道 JSF 上下文,这就是你得到 null 的原因。您Class1由处理 Web 请求的线程调用。

但是,您的陈述不正确:
我不能将 Utility 类作为 workManagerExample 构造函数的参数传递(这是一个限制)。

我不知道你在哪里找到这个限制,但不是真的。请参阅信息中心 -开发工作对象以并行运行代码

所以你的代码应该是这样的:

WorkManager workManager = getWorkManager();
if (workManager!=null){ 
  // extract from FacesContext what you need
  ....
  // and pass it to work item  
  GetInfoWork currentOfferWork = new GetInfoWork(pass, whatEver, objectsYouNeed, inWork); //GetInfoWork implements Work
  workManager.startWork(currentOfferWork);  
}

更新
如果不是通过构造函数,您可以通过 setter 方法传递它。但是不要通过FacesContext,而是您真正需要的东西,因为该上下文中的某些数据在 Web 请求结束后将无效。例如:

GetInfoWork currentOfferWork = new GetInfoWork(); //GetInfoWork implements Work
currentOfferWork.setMyParam1(param1);
currentOfferWork.setMyParam2(param2);
workManager.startWork(currentOfferWork);
于 2014-11-20T21:15:31.767 回答