我遇到了一个小批量问题,我想用EJB来填充列表。
当我启动项目时,glassfish标记错误:
捕获异常执行步骤: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: 显示java.lang.NullPointerException
Glassfish版本是4.1.1
我的小程序代码是:
@Named
public class getPingStatusBatchlet extends AbstractBatchlet {
private static GetPingStatus gps = new GetPingStatus();
private List<Node> nodes = null;
@EJB
private NodeFacade nodeEJB;
@Override
public String process() throws NamingException {
nodes = nodeEJB.findAll();
for (Node item : nodes) {
gps.getPingStatus(item.getIpv4());
}
return "COMPLETED";
}
@Override
public void stop() throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
我尝试在debug中运行应用程序并检查nodeEJB,它始终保持null值。
您知道如何将我的EJB用于我的小程序吗?
感谢您的帮助
Ersch
编辑:
NodeFacade代码:
@Stateless
public class NodeFacade extends AbstractFacade<Node> {
@PersistenceContext(unitName = "powwoPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public NodeFacade() {
super(Node.class);
}
}
beans.xml中:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<beans 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/beans_1_0.xsd"/>
getNetworkStatusBatch.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<job version="1.0" id="getNetworkStatusBatch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/jobXML_1_0.xsd" xmlns="http://xmlns.jcp.org/xml/ns/javaee" >
<step id="getNetworkStatusBatchlet">
<batchlet ref="com.powwo.app.batchlet.getPingStatusBatchlet"/>
</step>
</job>
myBackgroundJobManager.java:
@Singleton
@Startup
public class BackgroundJobManager {
@Schedule(minute = "*", hour = "*", second = "*/10", persistent = false)
public void myBackgroundJobManager() {
BatchRuntime.getJobOperator().start("getNetworkStatusBatch", null);
}
}
答案 0 :(得分:1)
您需要通过bean名称(而不是类名)从JSL引用工件。
所以你应该:
<batchlet ref="getPingStatusBatchlet"/>
与您的小程序上的@Named(默认)值匹配。
您需要这样才能将Glassfish中的批处理工件作为托管bean加载,并让CDI引擎执行其他bean的注入。
更多信息: 为了完整起见,我会提到你已经照顾过的东西,但是后来看到的其他人可能没有。
您还需要确保将批处理工件发现为托管bean,您已使用1.0级beans.xml进行了处理。在以后的CDI级别中,您可以使用bean发现模式= all
,这与您拥有的1.0 beans.xml相同,或者向批处理工件添加“bean-defined annotation”,例如{{ 1}})。