Java Quartz和JPA EJB
如何在代码中强制创建或注入EJB(使用JPA Entitymanager) 问题是jc.doStuff()在@PostConstruct中运行了一次,因为EJB是actice,但Quartz调用的是execute(),而EJB当然不是注入的。 由于EJB的原因,jc.doStuff引发空指针异常 我能做什么? 我如何注入执行也有权访问它的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
@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来启动任务
你可以做两件事:
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版本,但是您需要使用查找并注意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();
}
}