JSR-352 Batchlet ejb nullPointerException
JSR-352 Batchlet ejb nullPointerException
我想使用 EJB 来填充列表的 batchlet 有问题。
当我启动项目时,glassfish 标记错误:
Caught exception executing step:
com.ibm.jbatch.container.exception.BatchContainerRuntimeException:
java.lang.NullPointerException
Glassfish 版本为 4.1.1
我的batchlet代码是:
@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.
}
}
我尝试 运行 调试应用程序并检查 nodeEJB,它始终保持空值。
您知道如何将我的 EJB 用于我的 batchlet 吗?
感谢您的帮助
厄施
编辑:
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);
}
}
您需要通过 bean 名称(而不是 class 名称)从 JSL 引用工件。
所以你应该:
<batchlet ref="getPingStatusBatchlet"/>
与您的 batchlet 上的 @Named(默认)值相匹配。
您需要这个来将批处理工件作为托管 bean 加载到 Glassfish 中,并让 CDI 引擎执行其他 bean 的注入。
更多信息:
只是为了完整起见,我会提到一些你已经处理过的事情,但后来的其他人可能没有。
您还需要确保发现批处理工件作为托管 bean,您已使用 1.0 级别 beans.xml 处理了这一点。在更高级别的 CDI 中,您可以使用 bean 发现模式 = all
,这与您拥有的 1.0 beans.xml 相同,或者将 "bean-defining annotation" 添加到您的批处理工件中,例如 @Dependent
).
我想使用 EJB 来填充列表的 batchlet 有问题。
当我启动项目时,glassfish 标记错误:
Caught exception executing step: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.lang.NullPointerException
Glassfish 版本为 4.1.1
我的batchlet代码是:
@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.
}
}
我尝试 运行 调试应用程序并检查 nodeEJB,它始终保持空值。
您知道如何将我的 EJB 用于我的 batchlet 吗?
感谢您的帮助
厄施
编辑:
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);
}
}
您需要通过 bean 名称(而不是 class 名称)从 JSL 引用工件。
所以你应该:
<batchlet ref="getPingStatusBatchlet"/>
与您的 batchlet 上的 @Named(默认)值相匹配。
您需要这个来将批处理工件作为托管 bean 加载到 Glassfish 中,并让 CDI 引擎执行其他 bean 的注入。
更多信息: 只是为了完整起见,我会提到一些你已经处理过的事情,但后来的其他人可能没有。
您还需要确保发现批处理工件作为托管 bean,您已使用 1.0 级别 beans.xml 处理了这一点。在更高级别的 CDI 中,您可以使用 bean 发现模式 = all
,这与您拥有的 1.0 beans.xml 相同,或者将 "bean-defining annotation" 添加到您的批处理工件中,例如 @Dependent
).