我必须在WebLogic Bea10.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几天了,但还是把这个或那个作为一个例外。非常令人沮丧!
提前感谢!
发布于 2010-01-12 20:00:50
您需要从您的weblogic-ejb-jar.xml,中删除WorkManager参考,这个参考程序应该转到ejb-jar.xml。
事实上,我怀疑Weblogic模式定义"weblogic-ejb-jar.xsd“是否允许您添加引用元素,您必须得到xsd验证错误。
不管怎样,把元素去掉
resource-description来自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。
EJBjar.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> 这是为我工作..。如果需要的话让我知道,我可以分享我的全部代码。
您可以通过转到Home—>Deployments—>yourApp—>Monitoring(Tab)—>WorkLoad(Tab)”查看并加载WorkManager
发布于 2009-07-09 21:42:00
BEA (与IBM一起)开发了一个框架,专门用于管理Java环境中长期运行的任务。看看CommonJ。
Spring框架为这个框架提供了一些方便的类。
发布于 2009-11-21 19:03:19
你需要任命你的工作经理。我们的方法是在我们的Ear项目EarContent/META/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")然后就没有编码可以得到工作经理了。这可能对你有用。
https://stackoverflow.com/questions/1104960
复制相似问题