如何在此代码中强制创建或注入(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 来启动任务。
你可以做两件事:
使用 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
您可以使用 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/