我必须在WebLogic Bea 10.0 M1服务器环境中执行长时间运行的线程。我尝试使用WorkManagers。使用自己的WorkManager允许我指定自己的线程超时(MaxThreadStuckTime),而不是调整整个业务应用程序的超时。
我的设置如下:
WebLogic的EJB-jar.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-ejb-jar.xsd">
<weblogic-enterprise-bean>
<ejb-name>TestBean</ejb-name>
<resource-description>
<res-ref-name>myWorkManager</res-ref-name>
<jndi-name>wm/myWorkManager</jndi-name>
</resource-description>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
WebLogic的application.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic xmlns="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90
http://www.bea.com/ns/weblogic/90/weblogic.xsd">
<work-manager>
<name>myWorkManager</name>
<ignore-stuck-threads>1</ignore-stuck-threads>
</work-manager>
</weblogic>
和Bean:
import javax.annotation.Resource;
import javax.ejb.Stateful;
import weblogic.work.WorkManager;
@Stateful(mappedName = "TestBean")
public class TestBean implements TestBeanRemote {
@Resource(name = "myWorkManager")
private WorkManager myWorkManager;
public void test() {
myWorkManager.schedule(new Runnable() {
public void run() {
while (true) {
System.out.println("test: +++++++++++++++++++++++++");
try {
Thread.sleep(45000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
当我尝试部署这些东西时,服务器给了我以下例外:
[EJB:011026]The EJB container failed while creating the java:/comp/env namespace for this EJB deployment.
weblogic.deployment.EnvironmentException: [EJB:010176]The resource-env-ref 'myWorkManager' declared in the ejb-jar.xml descriptor has no JNDI name mapped to it. The resource-ref must be mapped to a JNDI name using the resource-description element of the weblogic-ejb-jar.xml descriptor.
我试着弄清楚如何访问/使用WorkMangers几天,并且仍然将此或那个作为例外。很沮丧!
提前致谢!
答案 0 :(得分:2)
您需要从 weblogic-ejb-jar.xml 中删除WorkManager参考,此参考应该转到 ejb-jar.xml 。
事实上,我怀疑Weblogic模式定义“weblogic-ejb-jar.xsd”是否允许您添加引用元素,您必须获得xsd验证错误。
无论如何,摆脱元素
来自 weblogic-ejb-jar.xml 的资源描述
<weblogic-enterprise-bean>
<ejb-name>TestBean</ejb-name>
<resource-description>
<res-ref-name>myWorkManager</res-ref-name>
<jndi-name>wm/myWorkManager</jndi-name>
</resource-description>
</weblogic-enterprise-bean>
它看起来像这样
<强> WebLogic的EJB-jar.xml中强>
<weblogic-enterprise-bean>
<ejb-name>TestBean</ejb-name>
</weblogic-enterprise-bean>
你的workManager参考将像这样转到ejb-jar.xml。
<强> EJB-jar.xml中强>
<enterprise-beans>
<session>
<ejb-name>TestBean</ejb-name>
<ejb-class>com.xxx.TestBean</ejb-class> <!-- your package com.xxx-->
<resource-ref>
<res-ref-name>myWorkManager</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</session>
</enterprise-beans>
现在从JNDI获取WorkManager我正在做
InitialContext ctx = new InitialContext();
this.workManager = (WorkManager) ctx.lookup("java:comp/env/myWorkManager");
但我相信注释也同样有效。
@Resource(name = "myWorkManager")
我的 weblogic-application.xml 与上面共享的内容相同
<weblogic>
<work-manager>
<name>myWorkManager</name>
<ignore-stuck-threads>1</ignore-stuck-threads>
</work-manager>
这对我有用..如果需要,请告诉我,我可以分享我的完整代码。
您可以通过访问Weblogic管理控制台查看您的WorkManager并加载它 主页 - &gt;部署 - &gt; yourApp-&gt;监控(标签) - &gt; WorkLoad(标签)“
答案 1 :(得分:0)
BEA(与IBM一起)开发了一个专门用于管理Java EE环境中长时间运行任务的框架。看看CommonJ。
Spring Framework为这个框架提供了一些便利类。
答案 2 :(得分:0)
您需要为您的工作经理命名。我们的方式是在我们的Ear项目EarContent / META-INF / weblogic-application.xml
中<wls:work-manager>
<wls:name>wmBatch</wls:name>
<wls:ignore-stuck-threads>true</wls:ignore-stuck-threads>
</wls:work-manager>
(你似乎已经做过)
然后我们使用注释来设置管理器:
@MessageDriven(ejbName =..., dispatchPolicy = "wmBatch")
然后没有关于获得工作经理的代码。这可能适合你。