java - Quartz 和 JPA EJB

标签 java jakarta-ee jpa timer

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

问题是 jc.doStuff() 在 @PostConstruct 中运行良好一次,因为 EJB 是 actice,但 Quartz 正在调用execute() 并且 EJB 当然没有被注入(inject)。 jc.doStuff 由于 EJB 的原因抛出空指针异常。

我能做什么? 我怎样才能注入(inject)执行的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;
    }
}

最佳答案

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

你可以做两件事:

  1. 使用 RMI 获取 EJB。您可以使用服务定位器模式并将其应用到任务中:

    属性 props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    props.put(Context.PROVIDER_URL,"t3://127.0.0.1:7001");

    Context ctx = new InitialContext(props);
    对象 ref = ctx.lookup("HelloBean#org.acme.Hello");

    Hello h = (Hello)PortableRemoteObject.narrow(ref, Hello.class);
    字符串结果;

    结果 = h.sayHello();
    System.out.println(结果);

    h.helloWait();

    结果 = h.sayHello();
    System.out.println(结果)

    //从这里抓取:http://www.coderanch.com/t/443061/EJB-JEE/java/world-EJB

  2. 您可以使用 EJB 计时器而不是 Quartz 来启动您的任务。

    @Schedule(dayOfWeek="周一、周三",小时="8",分钟="30") 公共(public)无效你的任务(){ System.out.println("它还活着"); }

可以说选项一可以应用于任何 EJB 版本,但您需要使用 Lookup 并注意 EJB 名称。使用选项二,您可以使用 EJB 来启动您的任务并可以访问所有 EJB 功能,但您将需要 EJB 3.1。

关于java - Quartz 和 JPA EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120884/

相关文章:

java - java中的simpleXML反序列化问题

java - 如何定义 make start Activity ?

java - Jmeter Socket中的TCP Sampler连接错误

java - 确定应用程序正在应用程序服务器下运行

java - 我正在尝试使用 Android 界面登录 php 网站,但我不知道如何发送数据

java - 我可以使用 servlet 或 jsp 代码获取 eclipse 项目路径吗?

java - 如何将属性值保留在 session 范围内?

java - JPA 实体映射基于另外两个实体映射相关

java - 如何在 JPA 2.1 中映射来自 NameStoredProcedure 的非实体结果集?

java - JPA hibernate 中一对一关系中的外键约束