Java Quartz和JPA EJB

Java Quartz和JPA EJB,java,jakarta-ee,jpa,timer,Java,Jakarta Ee,Jpa,Timer,如何在代码中强制创建或注入EJB(使用JPA Entitymanager) 问题是jc.doStuff()在@PostConstruct中运行了一次,因为EJB是actice,但Quartz调用的是execute(),而EJB当然不是注入的。 由于EJB的原因,jc.doStuff引发空指针异常 我能做什么? 我如何注入执行也有权访问它的EJB 谢谢你的帮助 @ManagedBean @ApplicationScoped public class JobDatasource implements

如何在代码中强制创建或注入EJB(使用JPA Entitymanager)

问题是jc.doStuff()在@PostConstruct中运行了一次,因为EJB是actice,但Quartz调用的是execute(),而EJB当然不是注入的。 由于EJB的原因,jc.doStuff引发空指针异常

我能做什么? 我如何注入执行也有权访问它的EJB

谢谢你的帮助

@ManagedBean
@ApplicationScoped
public class JobDatasource implements Job {

    @EJB
    JobContent jc;
    private String TEXT = "V1";

    public JobDatasource() {
        System.out.println("Job Bean created");
    }

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        jc.doStuff();
    }

    @PostConstruct
    public void startJob() throws SchedulerException {
        System.out.println("Und los gehts!");
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        JobDetail jobdataSourceCheck = JobBuilder.newJob(JobDatasource.class)
                .withIdentity("DataSourceCheck", "group1").build();

        Trigger trigger = newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(
                        simpleSchedule().withIntervalInSeconds(10)
                                .repeatForever()).build();
        sched.scheduleJob(jobdataSourceCheck, trigger);
        jc.doStuff();
        sched.start();
    }

    public String getTEXT() {
        return TEXT;
    }

    public void setTEXT(String tEXT) {
        TEXT = tEXT;
    }

}

@Stateless
public class JobContent {
    @EJB
    ITestDataDao dao;

    public void doStuff() {
        Set<TestData> testdata = createTestData();
        for (TestData td : testdata) {
            dao.saveData(td);
        }

    }

    private Set<TestData> createTestData() {
        Set<TestData> testData = new HashSet<TestData>();
        for (int i = 0; i < 500; i++) {
            TestData td = new TestData();
            td.setRandomText("TESTDATA");
            testData.add(td);
        }
        return testData;
    }
}
@ManagedBean
@适用范围
公共类JobDatasource实现作业{
@EJB
工作内容jc;
私有字符串TEXT=“V1”;
PublicJobDataSource(){
System.out.println(“创建的作业Bean”);
}
@凌驾
public void execute(作业执行上下文)
抛出JobExecutionException异常{
jc.doStuff();
}
@施工后
public void startJob()引发SchedulerException{
System.out.println(“Und los gehts!”);
SchedulerFactory sf=新StdSchedulerFactory();
调度程序sched=sf.getScheduler();
JobDetail jobdataSourceCheck=JobBuilder.newJob(JobDatasource.class)
.withIdentity(“数据源检查”、“组1”).build();
触发器=newTrigger()
.withIdentity(“触发器1”、“组1”)
.startNow()
.时间表(
simpleSchedule(),间隔秒(10)
.repeatForever()).build();
scheduleJob(jobdataSourceCheck,触发器);
jc.doStuff();
sched.start();
}
公共字符串getTEXT(){
返回文本;
}
公共void setTEXT(字符串文本){
文本=文本;
}
}
@无国籍
公开课内容{
@EJB
ITestDataDao;
公共空间{
Set testdata=createTestData();
for(TestData-td:TestData){
dao.saveData(td);
}
}
私有集createTestData(){
Set testData=new HashSet();
对于(int i=0;i<500;i++){
TestData td=新的TestData();
td.setRandomText(“测试数据”);
testData.add(td);
}
返回测试数据;
}
}

它不会被注入,因为您使用的是Quartz而不是EJB来启动任务

你可以做两件事:

  • 使用RMI获取EJB。您可以使用服务定位器模式并将其应用于任务:

    Properties props=新属性()
    put(Context.INITIAL\u Context\u工厂,“weblogic.jndi.WLInitialContextFactory”)
    props.put(Context.PROVIDER_URL,“t3://127.0.0.1:7001”)

    Context ctx=新的初始上下文(props)
    objectref=ctx.lookup(“HelloBean#org.acme.Hello”)

    Hello h=(Hello)PortableRemoteObject.窄带(ref,Hello.class)
    字符串结果

    结果=h.sayHello()
    系统输出打印项次(结果)

    h、 helloWait()

    结果=h.sayHello()
    系统输出打印项次(结果)

    //从这里抓起:

  • 您可以使用EJB定时器来启动任务,而不是石英

    @时间表(dayOfWeek=“周一、周三”,hour=“8”,minute=“30”) 公共任务(){ System.out.println(“It-alive”); }


  • 可以说选项一可以应用于任何EJB版本,但是您需要使用查找并注意EJB名称。使用选项二,您可以使用EJB启动任务并访问所有EJB功能,但您需要EJB3.1。

    在JBoss上更容易

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        Context ctx = null;
        try {
            ctx = new InitialContext();
            IJobContent exampleBean = (IJobContent) ctx
                    .lookup("java:global/DSMonitor/jobcontent!de.bva.dsmonitor.job.IJobContent");
            exampleBean.doStuff();
    
        } catch (NamingException e) {
            System.err.println("EJB JobContent not found!");
            e.printStackTrace();
        }
    
    }