项目准备开发个新功能,刚好很喜欢ruoyi写的任务调度,因此想到了集成ruoyi.quartz模块 ,遇到了很多问题:
首先因为ruoyi.quartz模块依赖了ruoyi.common模块,因此第一步我需要把common模块一部分依赖项复制到了quartz模块内(复制的内容就是common文件夹内的,未用到的部门被我剔除了):
当然只是添加common内公共代码是不够的,还需要添加依赖:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xxx</groupId>
<artifactId>leaderdesktop</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent><!-- 以上是我springcloud项目父模块定义-->
<artifactId>ruoyi-quartz</artifactId>
<version>4.0</version>
<name>ruoyi-quartz</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency> <!-- 因为我需要使用多数据源,正常项目也可删除-->
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
当把ruoyi.quartz模块集成到我的springcloud项目的A模块中(pom依赖了ruoyi.quartz),当启动A模块时访问ruoyi.quartz模块的接口404错误,经过查询了解想使用依赖模块(ruoyi.quartz)的接口必须在A模块启动类里面添加扫描注解
@ComponentScan({"com.epson.本模块某个路径.*", "com.ruoyi.quartz.*"})
以上注解添加之后又报:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field jobMapper in com.ruoyi.quartz.service.impl.SysJobServiceImpl required a bean of type 'com.ruoyi.quartz.mapper.SysJobMapper' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.ruoyi.quartz.mapper.SysJobMapper' in your configuration.
解决办法就是加上
@MapperScan({"com.本模块.mapper", "com.ruoyi.quartz.mapper"})
当把以上注解加上之后正常应该是没问题的,但是因我当前模块使用了多数据源因此又报以下异常:
postgresql.util.PSQLException: ERROR: relation "sys_job" does not exist
正常来说我只需要在ruoyi-quartz模块中的service实现类中添加@DS("xxx")数据源指定即可
但是我添加了还是无效,所以没办法就尝试第二种集成:
1. 首先第一步还是先把ruoyi-quartz使用的所有表格创建一遍,因我是使用postgre,因此脚本需要使用DBeaver导出postgre的脚本(在mysql数据库中执行完sql语句,右键把所有表导出csv,再选择postgre数据库public位置右键导入数据,选择csv文件即可完成postgre的表格创建)
2. 把ruoyi-quartz模块中的文件夹全部复制过去原有模块即可(我比较喜欢用mybatisplus的方法,因此mapper文件被我改造后只有一个接口声明)
最终启动还是报sys_job表不存在,排查半天发现SysJobServiceImpl类中的init方法的原因,注释掉这个方法就启动成功
init方法注释:项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据),因此如果不需要项目启动就执行定时任务那么可以注释掉
最后的代码层次:
再次访问OK: