【问题标题】:Quartz and JPA EJB石英和 JPA EJB
【发布时间】:2014-08-04 14:20:37
【问题描述】:

如何在此代码中强制创建或注入我的 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;
    }
}

【问题讨论】:

    标签: java jakarta-ee jpa timer


    【解决方案1】:

    它不会被注入,因为您使用的是 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");

      上下文 ctx = new InitialContext(props);
      Object ref = ctx.lookup("HelloBean#org.acme.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 Timer 而不是 Quartz 来启动您的任务。

      @Schedule(dayOfWeek="Mon,Wed", hour="8", minute="30") 公共无效你的任务(){ System.out.println("它还活着"); }

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

    【讨论】:

      【解决方案2】:

      在 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();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多