org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invoca

本文探讨了一个在使用Spring框架时遇到的问题,即属性注入不成功导致的NullPointerException异常,并提供了相应的解决方案。
错误描述:
ERROR - JobRunShell.run(211) | Job DEFAULT.StorageYKTMethod threw an unhandled Exception:
org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sss' on target class [class com.talkweb.ecard.storage.action.StorageYKTMonitor] failed; nested exception is java.lang.NullPointerException
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:269)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: java.lang.NullPointerException
at com.talkweb.ecard.storage.action.StorageYKTMonitor.getStorageYKTMessage(StorageYKTMonitor.java:42)
at com.talkweb.ecard.storage.action.StorageYKTMonitor.sss(StorageYKTMonitor.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:276)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:260)
... 3 more
DEBUG - ExceptionHelper.supportsNestedThrowable(97) | Detected JDK support for nested exceptions.
ERROR - ErrorLogger.schedulerError(2185) | Job (DEFAULT.StorageYKTMethod threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sss' on target class [class com.talkweb.ecard.storage.action.StorageYKTMonitor] failed; nested exception is java.lang.NullPointerException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'sss' on target class [class com.talkweb.ecard.storage.action.StorageYKTMonitor] failed; nested exception is java.lang.NullPointerException
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:269)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 more
Caused by: java.lang.NullPointerException
at com.talkweb.ecard.storage.action.StorageYKTMonitor.getStorageYKTMessage(StorageYKTMonitor.java:42)
at com.talkweb.ecard.storage.action.StorageYKTMonitor.sss(StorageYKTMonitor.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:276)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:260)
... 3 more

解决方案:
spring属性注入不成功,为null。应该在sss()方法中调用属性的方法。
### 关于 Spring Framework 中 Quartz 集成的使用与问题 Spring Framework 提供了一个强大的集成机制来支持 Quartz 调度器,允许开发者轻松地配置和管理定时任务。以下是关于 `org.springframework.scheduling.quartz` 的一些核心概念及其常见问题解答。 #### 1. **Quartz Scheduler 的基本集成** Spring 使用 `SchedulerFactoryBean` 来简化 Quartz Scheduler 的创建过程。通过将 Quartz JobDetail 和 Trigger 定义为 Spring Bean,可以方便地管理和调度这些任务。这种方式不仅提高了可维护性,还增强了与其他 Spring 组件的互操作性[^1]。 ```java @Configuration public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyQuartzJob.class) .withIdentity("myJob", "group1") .storeDurably() .build(); } @Bean public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) { return new SimpleTriggerFactoryBean() {{ setJobDetail(jobDetail); setStartDelay(0); setRepeatInterval(5000); // 每隔5秒执行一次 setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); }}; } @Bean public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail jobDetail) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setTriggers(trigger); factory.setOverwriteExistingJobs(true); factory.setAutoStartup(true); return factory; } } ``` 上述代码展示了如何定义一个简单的 Quartz Job 并将其注册到 Spring 应用上下文中[^2]。 --- #### 2. **常见的 Quartz 集成问题** ##### A. **线程池资源不足** 如果应用程序中有大量并发任务运行,则可能会遇到线程池耗尽的情况。可以通过调整 `SchedulerFactoryBean` 的线程池大小来优化性能: ```java @Bean public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail jobDetail) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); Properties quartzProperties = new Properties(); quartzProperties.put("org.quartz.threadPool.threadCount", "10"); // 设置线程数为10 factory.setQuartzProperties(quartzProperties); return factory; } ``` 此设置可以根据实际需求动态调整线程数量以满足负载要求。 ##### B. **持久化存储的支持** 默认情况下,Quartz 使用内存作为其作业存储介质。然而,在分布式环境中或者需要高可用性的场景下,建议启用 JDBC 存储方式以便更好地保存状态信息。具体实现如下所示: ```properties org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.dataSource.myDS.jndiName=jdbc/MyDataSource ``` 以上配置片段说明了如何切换至基于数据库的任务存储方案[^3]。 --- #### 3. **Spring Boot 下的 Quartz 自动配置** 对于现代项目而言,通常会结合 Spring Boot 进行开发。在这种环境下,推荐利用官方提供的 Starter 包 (`spring-boot-starter-quartz`) 实现自动装配功能。只需引入相应依赖即可完成大部分基础工作: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 之后按照常规方法声明 Jobs 和 Triggers 即可正常运作。 --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值