java - 尝试启动应用程序时,spring-quartz 不会以错误消息开头?
问题描述
websphere8.5.5.13上部署了spring应用
我尝试使用 spring-quartz 通过 cron 来安排我的工作,但它们以错误开始我的石英配置类
@Configuration
@Import(PersistenceConfig.class)
@PropertySource(value = {"classpath:application.properties"})
@EnableScheduling
public class ExportConfig {
private Logger logger = Logger.getLogger(getClass());
@Autowired
private DataSource dataSource;
@Autowired
private EntityManagerFactory entityManagerFactory;
@Getter
@Autowired
private MyService service;
private final String QRTZ_TRIGGER = "My_TRIGGER";
private final String QRTZ_GROUP = "My_GROUP";
private final String QRTZ_JOB = "MyJOB";
private final String TIME = "0 0-59 0-23 * * ?"; /* каждый час, каждые 0,15,30,45 минут */
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public JobDetail cronJobMy() {
JobKey jobKey = new JobKey(QRTZ_JOB, QRTZ_GROUP);
return JobBuilder
.newJob(MyJob.class)
.storeDurably(true)
.requestRecovery(true)
.withIdentity(jobKey).build();
}
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public Trigger cronTriggerMy() {
TriggerKey triggerKey = new TriggerKey(QRTZ_TRIGGER, QRTZ_GROUP);
return TriggerBuilder
.newTrigger()
.withIdentity(triggerKey)
.withSchedule(createSchedule(TIME)).build();
}
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public Scheduler cronSchedulerMy(JobDetail cronJobMy, Trigger cronTriggerMy) throws SchedulerException {
StdSchedulerFactory factory = new StdSchedulerFactory("quartzStandalone.properties");
Scheduler scheduler = factory.getScheduler();
boolean triggerExist = scheduler.checkExists(cronTriggerMy.getKey());
boolean jobExist = scheduler.checkExists(cronJobMy.getKey());
if (triggerExist || jobExist) {
scheduler.deleteJob(new JobKey(QRTZ_JOB, QRTZ_GROUP));
}
scheduler.start();
scheduler.getContext().put("SERVICE", service);
scheduler.scheduleJob(cronJobMy, cronTriggerMy);
return scheduler;
}
private static ScheduleBuilder createSchedule(String cronExpression) {
CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(cronExpression);
return builder;
}
}
工作看起来像这样:
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class ExportJob implements Job {
private static final String MESSAGE = "===================================EXPORT QUARTZ TACT===================================";
private Logger logger = Logger.getLogger(getClass());
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.log(Level.INFO, MESSAGE);
try {
ApplicationContext springContext =
WebApplicationContextUtils.getWebApplicationContext(ContextLoaderListener.getCurrentWebApplicationContext().getServletContext());
Object bean = springContext.getBean("exportService");
if (bean != null) {
ExportService exportService = (ExportService) bean;
exportService.export();
}
} catch (Exception e) {
e.printStackTrace();
logger.log(Level.ERROR, "EXPORT_SERVICE_BY_QUARTZ Failed..");
logger.log(Level.ERROR, Arrays.toString(e.getStackTrace()));
}
}
}
属性文件
#============================================================================
# Configure Main Scheduler Properties
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = MYAPPStandaloneScheduler
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 1
org.quartz.threadPool.makeThreadsDaemons = true
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = MYAPP
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.dataSource.MYAPP.jndiURL = java:comp/env/jdbc/MYAPP
我的 pom.xml
<!-- Quartz for schedule -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-oracle</artifactId>
<version>1.8.5</version>
</dependency>
但是,当尝试启动我的应用程序时,出现错误消息
'MYAPPStandaloneScheduler' 和 instanceId 'NON_CLUSTERED' 调度程序类:'org.quartz.core.QuartzScheduler' - 在本地运行。没有开始。目前处于待机模式。执行的作业数:0
使用线程池 'org.quartz.simpl.SimpleThreadPool' - 有 1 个线程。使用支持持久性的作业存储 'org.quartz.impl.jdbcjobstore.JobStoreTX'。并且没有聚集。[11/29/19 9:05:21:513 MSK] 00000109 SystemOut O [2019-11-29 09:05:21.513] INFO org.quartz.impl.StdSchedulerFactory Quartz scheduler 'MYAPPStandaloneScheduler' 从指定文件初始化:'类资源路径中的quartzStandalone.properties'。[11/29/19 9:05:21:521 MSK] 00000109 SystemOut O [2019-11-29 09:05:21.521] 警告 rt.AnnotationConfigWebApplicationContext 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans。 factory.BeanCreationException:在类路径资源 [quartz/ExportConfig.class] 中定义名称为“cronSchedulerExport”的 bean 创建时出错:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.quartz.Scheduler]:工厂方法“cronSchedulerExport”抛出异常;嵌套异常是 org.quartz.impl.jdbcjobstore.NoSuchDelegateException:无法创建委托:org.quartz.impl.jdbcjobstore.oracle.OracleDelegate [参见嵌套异常:pringframework.web.context.ContextLoader 上下文初始化失败 org.springframework.beans .factory.BeanCreationException:在类路径资源 [quartz/ExportConfig.class] 中定义名称为“cronSchedulerExport”的 bean 创建错误:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.quartz.Scheduler]:工厂方法 'cronSchedulerExport' 抛出异常;嵌套异常是 org.quartz.impl.jdbcjobstore.NoSuchDelegateException:无法创建委托:org.quartz。impl.jdbcjobstore.oracle.OracleDelegate [参见嵌套异常:java.lang.InstantiationException: org.quartz.impl.jdbcjobstore.oracle.OracleDelegate] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599 ) 75) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892) 原因:org.springframework .beans.BeanInstantiationException:无法实例化 [org.quartz.Scheduler]:工厂方法 'cronSchedulerExport' 抛出异常;嵌套异常是 org.quartz.impl.jdbcjobstore.NoSuchDelegateException:无法创建委托:org.quartz.impl.jdbcjobstore.oracle.OracleDelegate [参见嵌套异常:java.lang.InstantiationException:org.quartz.impl.jdbcjobstore.oracle . newInstance(Class.java:1762) at org.quartz.impl.jdbcjobstore.JobStoreSupport.getDelegate(JobStoreSupport.java:3213) ... 96 [11/29/19 9:05:21:537 MSK] 00000109 webapp E com.ibm.ws.webcontainer.webapp.WebApp notifyServletContextCreated SRVE0283E: 初始化上下文时捕获异常:{0} org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“cronSchedulerExport”的 bean 时出错 [quartz/ExportConfig .class]:通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.quartz.Scheduler]:工厂方法 'cronSchedulerExport' 抛出异常;嵌套异常是 org.quartz.impl.jdbcjobstore.NoSuchDelegateException: Couldn' t 创建委托:org.quartz.impl.jdbcjobstore.oracle.OracleDelegate [参见嵌套异常:java.lang.InstantiationException:org.quartz.impl.jdbcjobstore.oracle.OracleDelegate] at org.springframework.beans.factory.support.ConstructorResolver .instantiateUsingFactoryMethod(ConstructorResolver.java:599) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:813) 在 com.ibm.ws.management.AdminServiceImpl$1.run(AdminServiceImpl.java:1350) 在 com .ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892) 原因:org.springframework.beans.BeanInstantiationException:无法实例化 [org.quartz.Scheduler]:工厂方法 'cronSchedulerExport' 抛出异常;嵌套异常是 org.quartz.impl.jdbcjobstore。
org.quartz.impl.jdbcjobstore.NoSuchDelegateException: Couldn't create delegate:
作业状态保存在_QRTZ - 数据库Oracle11g中的表
解决方案
为什么不使用弹簧石英起动器?您可以使用 spring 数据源而不是专用数据源:
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5432/postgres
username: postgres
password: password
quartz:
scheduler-name: quartzSchedulernot work anymore
jobStore: jdbc
startup-delay: PT10S
wait-for-jobs-to-complete-on-shutdown: true
properties:
org.quartz.scheduler.instanceId: AUTO
org.quartz.scheduler.jmx.export: true
org.quartz.threadPool.threadCount: 15
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.tablePrefix: QRTZ_
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000
您还必须删除您的调度程序创建并让 spring 为您完成。
推荐阅读
- logback - 如何在 Logback 中使用 JSON appender?
- c++ - C++ 在二维向量中搜索所选元素周围的元素?
- oracle - 如何在特定日期在 SQLDEVELOPER 中使用 CONSTRAINT CHECK?
- javascript - 在历史模式下从子路由刷新时组件被挂载两次
- javascript - Gmail API - gapi 未定义 node.js
- android - 将一些字符串上传到服务器并使用 volley 下载
- c++ - 在 C++ 中替代 fflush
- python - Python pandas:字典的嵌套列表到数据框
- mysql - MySQL - 保持视图时查询慢
- php - Stripe 元素开发中无法获取 stripeToken