JSR-352 Batchlet ejb nullPointerException

时间:2017-04-17 16:29:13

标签: java java-ee java-batch

我遇到了一个小批量问题,我想用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);
    }

}

1 个答案:

答案 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}})。