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).