我使用的是spring boot,我有一个从数据库中存储/检索一些数据的服务。我想使用一个石英工作使用我的服务。我从网上尝试了很多建议,想把石英和spring boot整合起来,但都不奏效。
这是我的代码:
1)我添加了org.quartz-scheduler作为pom.xml中的依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
</dependencies>
2)这是我的应用程序。配置为将mysql用作我的服务的数据库的属性:
server.port=8281 spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=myusername spring.datasource.password=mypassword
3)这是我的服务:
@Service public class ReportService { JdbcTemplate jdbcTemplate; public ReportService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public List getPendingReports() { String sql = "SELECT * FROM report WHERE status = '" + ReportStatus.PENDING.name() +"'"; ReportMapper reportsMapper = new ReportMapper(); List reports = jdbcTemplate.query(sql, reportsMapper); return reports; } }
4)调度程序类:
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class ReportScheduler { public void scanAndUpdateReports() { SchedulerFactory sf = new StdSchedulerFactory(); try { Scheduler scheduler = sf.getScheduler(); scheduler.start(); JobDetail job = JobBuilder.newJob(ReportsJob.class) .withIdentity("reportsJob") .build(); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("reportsTrigger") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(60).repeatForever()) .build(); scheduler.scheduleJob(job, trigger); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
5)和我想自动连接ReportService但它为空的job类:
public class ReportsJob implements Job { @Autowired ReportService reportService; //this doesn't work (it is null) @Override public void execute(JobExecutionContext context) throws JobExecutionException { List reports = reportService.getPendingReports(); System.out.println("Reports:\n"+reports); } }
6)现在我正在从main方法调用调度程序:
@SpringBootApplication public class ReportAppBeApplication { public static void main(String[] args) { SpringApplication.run(ReportAppBeApplication.class, args); ReportScheduler rs = new ReportScheduler(); rs.scanAndUpdateReports(); } }
它为null,因为@autowired
仅在@component
、@repository
或@service
注释类中工作。注释ReportJob
类,并确保在启动时存储类的映射包含在组件扫描
中。您可以包含要扫描的映射:
@componentscan(BasePackages={“FolderOfReportJob”})
应将此批注添加到@configuration
或@SpringBootApplication
批注类中。
编辑:
如果您不想使作业成为组件,也可以通过ApplicationContext
类手动获取bean。是这样的:
private static ApplicationContext ac;
ReportService reportService = ac.getBean(ReportService.class);
: 是一个从Hibernate获取数据的经典Spring服务。正如我上面所说的,在我搬到Spring Boot之前,这一直很有效。 当我用经典的Spring应用程序实现这段代码时,完成了对服务的自动化操作。
我是否需要? 我需要吗?我不能使用类/servlet做同样的事情吗? 如何初始化计划程序以及谁将触发作业? 我有一个执行作业独立程序,我可以在任何servlet的init中编写,并在容器启动时启动servlet。这样做对吗?
如果有其他的方法来配置jHipster中的石英作业,请告诉我。或者,如果jHipster为调度程序工作提供了开箱即用的功能,那就太好了。 石英作业依赖关系
请给我一个解决办法。 这里是quartz调度程序代码的链接。https://gist.github.com/60b236e7fd1432c76248