如何在部署到JBoss的JAR文件中设置Quartz调度程序?
我使用的是Quartz 2.1.1,有一个JAR应用程序(注意,不是web,所以我没有Spring)。我正在JBoss4.2.2上运行我的应用程序(无法更改)。我希望将作业计划为每5分钟运行一次,但不希望通过静态块创建计划程序。它似乎无论如何都不起作用。在我的职业课上,我有如何在部署到JBoss的JAR文件中设置Quartz调度程序?,jar,jboss,quartz-scheduler,Jar,Jboss,Quartz Scheduler,我使用的是Quartz 2.1.1,有一个JAR应用程序(注意,不是web,所以我没有Spring)。我正在JBoss4.2.2上运行我的应用程序(无法更改)。我希望将作业计划为每5分钟运行一次,但不希望通过静态块创建计划程序。它似乎无论如何都不起作用。在我的职业课上,我有 static { LOG.info("Started static process orders job at " + (new java.util.Date()).toString()); final J
static {
LOG.info("Started static process orders job at " + (new java.util.Date()).toString());
final JobDetail job = JobBuilder.newJob(ProcessOrdersJob.class).withIdentity("processOrdersJob", "group1").build();
final Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("processOrdesrTrigger", "group1")
.withSchedule(
CronScheduleBuilder
.cronSchedule("0 5,10,15,20,25,30,35,40,45,50,55 * * * ?"))
.build();
Scheduler scheduler;
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
LOG.error(e.getMessage(), e);
e.printStackTrace(System.err);
}
} // static
但它似乎没有运行(日志中从未包含信息消息)。有人知道在JAR中配置Quartz作业以部署到JBoss的更灵活的方法吗
谢谢
编辑:我尝试了Rosdi的建议,将Maven build使用的Quartz恢复到1.5.2(与JBoss安装的版本相同),但遗憾的是,出现了例外
javax.ejb.EJBTransactionRolledbackException: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:87)
at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:249)
at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:268)
at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:138)
at $Proxy113.execute(Unknown Source)
at org.jboss.resource.adapter.quartz.inflow.QuartzJob.execute(QuartzJob.java:57)
at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:174)
at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
... 11 more
Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.<clinit>(BeanValidationIntegrator.java:53)
at org.hibernate.integrator.internal.IntegratorServiceImpl.<init>(IntegratorServiceImpl.java:46)
at org.hibernate.service.internal.BootstrapServiceRegistryImpl.<init>(BootstrapServiceRegistryImpl.java:80)
at org.hibernate.service.internal.BootstrapServiceRegistryImpl.<init>(BootstrapServiceRegistryImpl.java:57)
at org.hibernate.service.ServiceRegistryBuilder.<init>(ServiceRegistryBuilder.java:76)
at org.mainco.subco.dido.service.AbstractServiceProvider.getSessionFactory(AbstractServiceProvider.java:67)
at org.mainco.subco.dido.service.AbstractServiceProvider.initServices(AbstractServiceProvider.java:118)
at org.mainco.subco.dido.quartz.ProcessOrdersJob.execute(ProcessOrdersJob.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
javax.ejb.EJBTransactionRolledbackException:java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
位于org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:87)
在org.jboss.aspects.tx.TxPolicy.invokeincalertx(TxPolicy.java:130)上
位于org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
位于org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
位于org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:249)
位于org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:268)
位于org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:138)
在$Proxy113.execute处执行(未知源)
位于org.jboss.resource.adapter.quartz.inflow.QuartzJob.execute(QuartzJob.java:57)
位于org.quartz.core.JobRunShell.run(JobRunShell.java:203)
位于org.quartz.siml.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
原因:java.lang.RuntimeException:java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
位于org.jboss.ejb3.interceptor.InvocationContextImpl.procedure(InvocationContextImpl.java:174)
位于org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
位于org.jboss.ejb3.entity.TransactionScopeDentityManagerAcceptor.invoke(TransactionScopeDentityManagerAcceptor.java:54)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
位于org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
在org.jboss.aspects.tx.TxPolicy.invokeincalertx(TxPolicy.java:126)上
... 还有11个
原因:java.lang.NoSuchMethodError:org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
位于org.hibernate.cfg.beanvalidation.BeanValidationIntegrator。(BeanValidationIntegrator.java:53)
位于org.hibernate.integrator.internal.IntegratorServiceImpl.(IntegratorServiceImpl.java:46)
位于org.hibernate.service.internal.BootstrapServiceRegistryImpl.(BootstrapServiceRegistryImpl.java:80)
位于org.hibernate.service.internal.bootstrapserviceregistrympl.(bootstrapserviceregistrympl.java:57)
位于org.hibernate.service.ServiceRegistryBuilder。(ServiceRegistryBuilder.java:76)
位于org.mainco.subco.dido.service.AbstractServiceProvider.getSessionFactory(AbstractServiceProvider.java:67)
位于org.mainco.subco.dido.service.AbstractServiceProvider.initServices(AbstractServiceProvider.java:118)
位于org.mainco.subco.dido.quartz.ProcessOrdersJob.execute(ProcessOrdersJob.java:92)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
这是我在JBoss 5中使用的,我不知道它是否能在JBoss 4下工作
package whatever;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import org.jboss.ejb3.annotation.Depends;
import org.jboss.ejb3.annotation.ResourceAdapter;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "cronTrigger", propertyValue = "0/30 * * * * ?")})
@ResourceAdapter("quartz-ra.rar")
@Depends({
"jboss.ejb:service=EJBTimerService""})
public class MyClass implements StatefulJob {
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.debug("Job started at: " + new Date());
this.process();
log.debug("Job completed at: " + new Date());
}
private void process() {
//do whatever you want to do
}
}谢谢你的建议,但当我尝试时,我得到了上面提到的奇怪的错误。不确定它在哪里崩溃。@Dave,尝试移除日志(
org.slf4j.Logger
,org.slf4j.LoggerFactory
),看看它是否能工作。我已经更进一步了。这个错误是由JBoss的hibernate库在我的JAR文件打包的库上使用引起的。有没有一种方法可以让JBoss接受我的Hibernate库而不是它自己的——在JAR的结构中?@Dave我很肯定你可以,你可以在META-INF/JBoss classload.xml
中设置它。参考这里,这家伙比我解释得更好:@Dave我忘了你正在使用JBoss4,如果上面的链接没有帮助,请尝试这里,对不起,我从来没有在JBoss4上工作过,所以帮不了什么忙。