后臺手冊

2019-03-30 14:36 更新

分頁實現(xiàn)

前端基于Bootstrap的輕量級表格插件 Bootstrap Table
后端分頁組件使用Mybatis分頁插件 PageHelper

分頁實現(xiàn)流程

1、前端調用封裝好的方法$.table.init,傳入后臺url。

  1. var options = {
  2. url: prefix + "/list",
  3. columns: [{
  4. field: 'id',
  5. title: '主鍵'
  6. },
  7. {
  8. field: 'name',
  9. title: '名稱'
  10. }]
  11. };
  12. $.table.init(options);

2、后臺實現(xiàn)查詢邏輯,調用startPage()方法即可自動完成服務端分頁。

  1. @PostMapping("/list")
  2. @ResponseBody
  3. public TableDataInfo list(User user)
  4. {
  5. startPage(); // 此方法配合前端完成自動分頁
  6. List<User> list = userService.selectUserList(user);
  7. return getDataTable(list);
  8. }

注意:啟動分頁關鍵代碼startPage()(只對該語句以后的第一個查詢語句得到的數(shù)據(jù)進行分頁)
如果改為其他數(shù)據(jù)庫需修改配置application.yml helperDialect=你的數(shù)據(jù)庫

導入導出

導入導出使用 Apache POI,目前支持參數(shù)如下

參數(shù) 類型 默認值 描述
name String 導出到Excel中的名字
dateFormat String 日期格式, 如: yyyy-MM-dd
readConverterExp String 讀取內容轉表達式 (如: 0=男,1=女,2=未知)
height String 14 導出時在excel中每個列的高度 單位為字符
width String 16 導出時在excel中每個列的寬 單位為字符
suffix String 文字后綴,如% 90 變成90%
defaultValue String 當值為空時,字段的默認值
prompt String 提示信息
combo String Null 設置只能選擇不能輸入的列內容
isExport String true 是否導出數(shù)據(jù),應對需求:有時我們需要導出一份模板,這是標題需要但內容需要用戶手工填寫
targetAttr String 另一個類中的屬性名稱,支持多級獲取,以小數(shù)點隔開
type Enum Type.ALL 字段類型(0:導出導入;1:僅導出;2:僅導入)

導出實現(xiàn)流程

1、前端調用封裝好的方法$.table.init,傳入后臺exportUrl。

  1. var options = {
  2. exportUrl: prefix + "/export",
  3. columns: [{
  4. field: 'id',
  5. title: '主鍵'
  6. },
  7. {
  8. field: 'name',
  9. title: '名稱'
  10. }]
  11. };
  12. $.table.init(options);

2、在實體變量上添加@Excel注解。

  1. @Excel(name = "用戶序號")
  2. private Long id;
  3. @Excel(name = "用戶名稱")
  4. private String userName;

3、在Controller添加導出方法

  1. @PostMapping("/export")
  2. @ResponseBody
  3. public AjaxResult export(User user)
  4. {
  5. List<User> list = userService.selectUserList(user);
  6. ExcelUtil<User> util = new ExcelUtil<User>(User.class);
  7. return util.exportExcel(list, "用戶數(shù)據(jù)");
  8. }

導入實現(xiàn)流程

1、前端調用封裝好的方法$.table.init,傳入后臺importUrl。

  1. var options = {
  2. importUrl: prefix + "/importData",
  3. columns: [{
  4. field: 'id',
  5. title: '主鍵'
  6. },
  7. {
  8. field: 'name',
  9. title: '名稱'
  10. }]
  11. };
  12. $.table.init(options);

2、在實體變量上添加@Excel注解,默認為導出導入,也可以單獨設置僅導入Type.IMPORT

  1. @Excel(name = "用戶序號")
  2. private Long id;
  3. @Excel(name = "部門編號", type = Type.IMPORT)
  4. private Long deptId;
  5. @Excel(name = "用戶名稱")
  6. private String userName;

3、在Controller添加導入方法,updateSupport屬性為是否存在則覆蓋(可選)

  1. @PostMapping("/importData")
  2. @ResponseBody
  3. public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
  4. {
  5. ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
  6. List<SysUser> userList = util.importExcel(file.getInputStream());
  7. String operName = ShiroUtils.getSysUser().getLoginName();
  8. String message = userService.importUser(userList, updateSupport, operName);
  9. return AjaxResult.success(message);
  10. }

上傳下載

首先創(chuàng)建一張上傳文件的表,例如:

  1. drop table if exists sys_file;
  2. create table sys_file (
  3. fileid int(11) not null auto_increment comment '文件id',
  4. filename varchar(50) default '' comment '文件名稱',
  5. filepath varchar(255) default '' comment '文件路徑',
  6. primary key (fileid)
  7. ) engine=innodb auto_increment=200 default charset=utf8 comment = '文件表';

上傳實現(xiàn)流程

1、參考示例代碼。

  1. function submitHandler() {
  2. if ($.validate.form()) {
  3. uploadFile();
  4. }
  5. }
  6. function uploadFile() {
  7. var formData = new FormData();
  8. if($('#file')[0].files[0] == null) {
  9. $.modal.alertWarning("請先選擇文件路徑");
  10. return false;
  11. }
  12. formData.append('fileName', $("#fileName").val());
  13. formData.append('file', $('#file')[0].files[0]);
  14. $.ajax({
  15. url: prefix + "/add",
  16. type: 'post',
  17. cache: false,
  18. data: formData,
  19. processData: false,
  20. contentType: false,
  21. dataType: "json",
  22. success: function(result) {
  23. $.operate.successCallback(result);
  24. }
  25. });
  26. }

2、在Controller添加對應上傳方法

  1. @Autowired
  2. private ServerConfig serverConfig;
  3. @PostMapping("/add")
  4. @ResponseBody
  5. public AjaxResult addSave(MultipartFile file, SysFile sysFile) throws IOException
  6. {
  7. // 上傳文件路徑
  8. String filePath = Global.getUploadPath();
  9. // 上傳并返回新文件名稱
  10. String fileName = FileUploadUtils.upload(filePath, file);
  11. sysFile.setFilePath(fileName);
  12. return toAjax(sysFileService.insertSysFile(sysFile));
  13. }

3、上傳成功后需要預覽可以對該屬性格式化處理

  1. {
  2. title: '文件預覽',
  3. formatter: function(value, row, index) {
  4. return '<a href="javascript:downloadFile(' + row.fileId + ')"><img style="width:30;height:30px;" src="/profile/upload/' + row.filePath + '"/></a>';
  5. }
  6. },

注意:如果只是單純的上傳一張圖片沒有其他參數(shù)可以使用通用方法 /common/upload
請求處理方法 com.ruoyi.web.controller.common.CommonController

下載實現(xiàn)流程

1、參考示例代碼。

  1. function downloadFile(fileId){
  2. window.location.href = ctx + "system/sysFile/downloadFile/" + fileId;
  3. }

2、在Controller添加對應上傳方法

  1. @GetMapping("/downloadFile/{fileId}")
  2. public void downloadFile(@PathVariable("fileId") Integer fileId, HttpServletResponse response) throws Exception
  3. {
  4. SysFile sysFile = sysFileService.selectSysFileById(fileId);
  5. String filePath = sysFile.getFilePath();
  6. String realFileName = sysFile.getFileName() + filePath.substring(filePath.indexOf("."));
  7. String path = Global.getUploadPath() + sysFile.getFilePath();
  8. response.setCharacterEncoding("utf-8");
  9. response.setContentType("multipart/form-data");
  10. response.setHeader("Content-Disposition", "attachment;fileName=" + realFileName);
  11. FileUtils.writeBytes(path, response.getOutputStream());
  12. }

事務管理

在Spring Boot中,當我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時候,框架會自動默認分別注入DataSourceTransactionManager或JpaTransactionManager。 所以我們不需要任何額外配置就可以用@Transactional注解進行事務的使用。

例如:新增用戶時需要插入用戶表、用戶與崗位關聯(lián)表、用戶與角色關聯(lián)表。就可以使用事務讓它實現(xiàn)回退。
做法非常簡單,我們只需要在方法上添加@Transactional注解即可。事務可以用于ServiceController

  1. @Transactional
  2. public int insertUser(User user)
  3. {
  4. // 新增用戶信息
  5. int rows = userMapper.insertUser(user);
  6. // 新增用戶崗位關聯(lián)
  7. insertUserPost(user);
  8. // 新增用戶與角色管理
  9. insertUserRole(user);
  10. return rows;
  11. }

常見坑點1:遇到非檢測異常時,事務開啟,也無法回滾。 例如下面這段代碼,賬戶余額依舊增加成功,并沒有因為后面遇到檢測異常而回滾??!

  1. @Transactional
  2. public void addMoney() throws Exception {
  3. //先增加余額
  4. accountMapper.addMoney();
  5. //然后遇到故障
  6. throw new SQLException("發(fā)生異常了..");
  7. }

原因分析:因為Spring的默認的事務規(guī)則是遇到運行異常(RuntimeException)和程序錯誤(Error)才會回滾。如果想針對非檢測異常進行事務回滾,可以在@Transactional 注解里使用 rollbackFor 屬性明確指定異常。例如下面這樣,就可以正?;貪L:

  1. @Transactional(rollbackFor = Exception.class)
  2. public void addMoney() throws Exception {
  3. //先增加余額
  4. accountMapper.addMoney();
  5. //然后遇到故障
  6. throw new SQLException("發(fā)生異常了..");
  7. }

常見坑點2: 在業(yè)務層捕捉異常后,發(fā)現(xiàn)事務不生效。 這是許多新手都會犯的一個錯誤,在業(yè)務層手工捕捉并處理了異常,你都把異?!俺浴钡袅耍琒pring自然不知道這里有錯,更不會主動去回滾數(shù)據(jù)。 例如:下面這段代碼直接導致增加余額的事務回滾沒有生效。

  1. @Transactional
  2. public void addMoney() throws Exception {
  3. //先增加余額
  4. accountMapper.addMoney();
  5. //謹慎:盡量不要在業(yè)務層捕捉異常并處理
  6. try {
  7. throw new SQLException("發(fā)生異常了..");
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. }

推薦做法:在業(yè)務層統(tǒng)一拋出異常,然后在控制層統(tǒng)一處理。

  1. @Transactional
  2. public void addMoney() throws Exception {
  3. //先增加余額
  4. accountMapper.addMoney();
  5. //推薦:在業(yè)務層將異常拋出
  6. throw new RuntimeException("發(fā)生異常了..");
  7. }

Transactional注解的常用屬性表:

屬性 說明
propagation 事務的傳播行為,默認值為 REQUIRED。
isolation 事務的隔離度,默認值采用 DEFAULT
timeout 事務的超時時間,默認值為-1,不超時。如果設置了超時時間(單位秒),那么如果超過該時間限制了但事務還沒有完成,則自動回滾事務。
read-only 指定事務是否為只讀事務,默認值為 false;為了忽略那些不需要事務的方法,比如讀取數(shù)據(jù),可以設置 read-only 為 true。
rollbackFor 用于指定能夠觸發(fā)事務回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔。{xxx1.class, xxx2.class,……}
noRollbackFor 拋出 no-rollback-for 指定的異常類型,不回滾事務。{xxx1.class, xxx2.class,……}
....

TransactionDefinition傳播行為的常量:

常量 含義
TransactionDefinition.PROPAGATION_REQUIRED 如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。這是默認值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW 創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED 以非事務方式運行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER 以非事務方式運行,如果當前存在事務,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
TransactionDefinition.PROPAGATION_NESTED 如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

提示:事務的傳播機制是指如果在開始當前事務之前,一個事務上下文已經(jīng)存在,此時有若干選項可以指定一個事務性方法的執(zhí)行行為。 即:在執(zhí)行一個@Transactinal注解標注的方法時,開啟了事務;當該方法還在執(zhí)行中時,另一個人也觸發(fā)了該方法;那么此時怎么算事務呢,這時就可以通過事務的傳播機制來指定處理方式。

異常處理

在日常開發(fā)中程序發(fā)生了異常,往往需要通過一個統(tǒng)一的異常處理,來保證客戶端能夠收到友好的提示。
通常情況下我們用try..catch..對異常進行捕捉處理,但是在實際項目中對業(yè)務模塊進行異常捕捉,會造成代碼重復和繁雜, 我們希望代碼中只有業(yè)務相關的操作,所有的異常我們單獨設立一個類來處理它。全局異常就是對框架所有異常進行統(tǒng)一管理 而這就表示在框架需要一個機制,將程序的異常轉換為用戶可讀的異常。而且最重要的,是要將這個機制統(tǒng)一,提供統(tǒng)一的異常處理。 我們在可能發(fā)生異常的方法,全部throw拋給前端控制器;然后由前端控制器調用 全局異常處理器 對異常進行統(tǒng)一處理。 如此,我們現(xiàn)在的Controller中的方法就可以很簡潔了。

1、統(tǒng)一返回實體定義

  1. package com.ruoyi.common.core.domain;
  2. import java.util.HashMap;
  3. /**
  4. * 操作消息提醒
  5. *
  6. * @author ruoyi
  7. */
  8. public class AjaxResult extends HashMap<String, Object>
  9. {
  10. private static final long serialVersionUID = 1L;
  11. /**
  12. * 返回錯誤消息
  13. *
  14. * @param code 錯誤碼
  15. * @param msg 內容
  16. * @return 錯誤消息
  17. */
  18. public static AjaxResult error(String msg)
  19. {
  20. AjaxResult json = new AjaxResult();
  21. json.put("msg", msg);
  22. json.put("code", 500);
  23. return json;
  24. }
  25. /**
  26. * 返回成功消息
  27. *
  28. * @param msg 內容
  29. * @return 成功消息
  30. */
  31. public static AjaxResult success(String msg)
  32. {
  33. AjaxResult json = new AjaxResult();
  34. json.put("msg", msg);
  35. json.put("code", 0);
  36. return json;
  37. }
  38. }

2、定義登錄異常定義

  1. package com.ruoyi.common.exception;
  2. /**
  3. * 登錄異常
  4. *
  5. * @author ruoyi
  6. */
  7. public class LoginException extends RuntimeException
  8. {
  9. private static final long serialVersionUID = 1L;
  10. protected final String message;
  11. public LoginException(String message)
  12. {
  13. this.message = message;
  14. }
  15. @Override
  16. public String getMessage()
  17. {
  18. return message;
  19. }
  20. }

3、基于@ControllerAdvice注解的Controller層的全局異常統(tǒng)一處理

  1. package com.ruoyi.framework.web.exception;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. import org.springframework.web.bind.annotation.RestControllerAdvice;
  6. import com.ruoyi.common.core.domain.AjaxResult;
  7. import com.ruoyi.common.exception.LoginException;
  8. /**
  9. * 全局異常處理器
  10. *
  11. * @author ruoyi
  12. */
  13. @RestControllerAdvice
  14. public class GlobalExceptionHandler
  15. {
  16. private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
  17. /**
  18. * 登錄異常
  19. */
  20. @ExceptionHandler(LoginException.class)
  21. public AjaxResult loginException(LoginException e)
  22. {
  23. log.error(e.getMessage(), e);
  24. return AjaxResult.error(e.getMessage());
  25. }
  26. }

4、測試訪問請求

  1. @Controller
  2. public class SysIndexController
  3. {
  4. /**
  5. * 首頁方法
  6. */
  7. @GetMapping("/index")
  8. public String index(ModelMap mmap)
  9. {
  10. /**
  11. * 模擬用戶未登錄,拋出業(yè)務邏輯異常
  12. */
  13. SysUser user = ShiroUtils.getSysUser();
  14. if (StringUtils.isNull(user))
  15. {
  16. throw new LoginException("用戶未登錄,無法訪問請求。");
  17. }
  18. mmap.put("user", user);
  19. return "index";
  20. }
  21. }

根據(jù)上面代碼含義,當我們在訪問/index時就會發(fā)生LoginException業(yè)務邏輯異常,按照我們之前的全局異常配置以及統(tǒng)一返回實體實例化,訪問后會出現(xiàn)AjaxResult格式JSON數(shù)據(jù), 下面我們運行項目訪問查看效果。
界面輸出內容如下所示:

  1. {
  2. "msg": "用戶未登錄,無法訪問請求。",
  3. "code": 500
  4. }

這個代碼示例寫的非常淺顯易懂,但是需要注意的是:基于@ControllerAdvice注解的全局異常統(tǒng)一處理只能針對于Controller層的異常,意思是只能捕獲到Controller層的異常, 在service層或者其他層面的異常都不能捕獲。

若依系統(tǒng)的全局異常處理器GlobalExceptionHandler
注意:如果全部異常處理返回json,那么可以使用@RestControllerAdvice代替@ControllerAdvice,這樣在方法上就可以不需要添加@ResponseBody

系統(tǒng)日志

在實際開發(fā)中,對于某些關鍵業(yè)務,我們通常需要記錄該操作的內容,一個操作調一次記錄方法,每次還得去收集參數(shù)等等,會造成大量代碼重復。 我們希望代碼中只有業(yè)務相關的操作,所有的異常我們單獨設立一個注解來處理它。

在需要被記錄日志的controller方法上添加@Log注解,使用方法如下:

  1. @Log(title = "用戶管理", businessType = BusinessType.INSERT)

支持參數(shù)如下:

參數(shù) 類型 默認值 描述
title String 操作模塊
businessType BusinessType BusinessType.OTHER 操作功能
operatorType OperatorType OperatorType.MANAGE 操作人類別
isSaveRequestData boolean true 是否保存請求的參數(shù)

邏輯實現(xiàn)代碼 com.ruoyi.framework.aspectj.LogAspect
查詢操作詳細記錄可以登錄系統(tǒng)(系統(tǒng)管理-操作日志)

數(shù)據(jù)權限

在實際開發(fā)中,需要設置用戶只能查看哪些部門的數(shù)據(jù),一般稱為數(shù)據(jù)權限
默認系統(tǒng)管理員admin擁有所有數(shù)據(jù)權限(userId=1)
在需要數(shù)據(jù)權限控制方法上添加@DataScope注解
@DataScope(tableAlias = "u"),其中u用來表示表的別名

  1. /** 表的別名 */
  2. String tableAlias() default "";

在mybatis查詢標簽中添加數(shù)據(jù)范圍過濾 ${params.dataScope}

會生成如下關鍵代碼:

  1. select u.user_id, u.dept_id, u.login_name, u.user_name, u.email , u.phonenumber,
  2. u.password, u.sex, u.avatar, u.salt, u.status, u.del_flag, u.login_ip,
  3. u.login_date, u.create_by, u.create_time, u.remark, d.dept_name
  4. from sys_user u
  5. left join sys_dept d on u.dept_id = d.dept_id
  6. where u.del_flag = '0'
  7. and u.dept_id in ( select dept_id from sys_role_dept where role_id = 2 )

邏輯實現(xiàn)代碼 com.ruoyi.framework.aspectj.DataScopeAspect

多數(shù)據(jù)源

在實際開發(fā)中,經(jīng)??赡苡龅皆谝粋€應用中可能需要訪問多個數(shù)據(jù)庫的情況
在需要切換數(shù)據(jù)源ServiceMapper方法上添加@DataSource注解
@DataSource(value = DataSourceType.MASTER),其中value用來表示數(shù)據(jù)源名稱

  1. /** 切換數(shù)據(jù)源名稱 */
  2. public DataSourceType value() default DataSourceType.MASTER;

注解實現(xiàn)數(shù)據(jù)源切換

  1. @DataSource(value = DataSourceType.MASTER)
  2. public List<SysUser> selectUserList(SysUser user)
  3. {
  4. return userMapper.selectUserList(user);
  5. }

手動實現(xiàn)數(shù)據(jù)源切換

  1. public List<SysUser> selectUserList(SysUser user)
  2. {
  3. DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
  4. List<SysUser> userList = userMapper.selectUserList(user);
  5. DynamicDataSourceContextHolder.clearDataSourceType();
  6. return userList;
  7. }

邏輯實現(xiàn)代碼 com.ruoyi.framework.aspectj.DataSourceAspect

注意:目前配置了一個從庫,默認關閉狀態(tài)。可新增多個從庫,支持不同數(shù)據(jù)源(Mysql、Oracle、SQLServer)

代碼生成

大部分項目里其實有很多代碼都是重復的,幾乎每個基礎模塊的代碼都有增刪改查的功能,而這些功能都是大同小異,如果這些功能都要自己去寫,將會大大浪費我們的精力降低效率。所以這種重復性的代碼可以使用代碼生成。 1、修改代碼生成配置
編輯resources目錄下的generator.yml
author: # 開發(fā)者姓名,生成到類注釋上
packageName: # 默認生成包路徑
autoRemovePre: # 是否自動去除表前綴
tablePrefix: # 表前綴

2、新建數(shù)據(jù)庫表結構(需要表注釋)

  1. drop table if exists sys_test;
  2. create table sys_test (
  3. test_id int(11) auto_increment comment '測試id',
  4. test_name varchar(30) default '' comment '測試名稱',
  5. primary key (test_id)
  6. ) engine=innodb auto_increment=1 default charset=utf8 comment = '測試表';

3、登錄系統(tǒng)-系統(tǒng)工具 -> 代碼生成
找到sys_test表,點擊生成代碼會得到一個ruoyi.zip
執(zhí)行sql文件,覆蓋文件到對應目錄即可

所有代碼生成的相關業(yè)務邏輯代碼在ruoyi-generator模塊,可以自行調整或剔除

定時任務

在實際項目開發(fā)中,除了Web應用、還有一類不可缺少的,那就是定時任務。 定時任務的場景可以說非常廣泛,比如某些視頻網(wǎng)站,購買會員后,每天會給會員送成長值,每月會給會員送一些電影券; 比如在保證最終一致性的場景中,往往利用定時任務調度進行一些比對工作;比如一些定時需要生成的報表、郵件;比如一些需要定時清理數(shù)據(jù)的任務等。 所有我們提供方便友好的web界面,實現(xiàn)動態(tài)管理任務,可以達到動態(tài)控制定時任務啟動、暫停、重啟、刪除、添加、修改等操作,極大地方便了開發(fā)過程。

1、新建定時任務信息(系統(tǒng)監(jiān)控 -> 定時任務)
任務名稱:對應后臺bean注解名稱,如@Component("ryTask")
任務組名:對應的定時任務組名 隨意填寫。
方法名稱:對應后臺任務方法名稱如ryParams
方法參數(shù):對應后臺任務方法名稱值如ry,沒有可不填。
執(zhí)行表達式:可查詢官方cron表達式介紹
執(zhí)行策略:
立即執(zhí)行(所有被misfire的執(zhí)行會被立即執(zhí)行,然后按照正常調度繼續(xù)執(zhí)行trigger。 9點和10點的被忽略掉,好像什么都沒發(fā)生一樣。下次執(zhí)行將在11點被執(zhí)行。) 執(zhí)行一次(立即執(zhí)行第一次misfire的操作,并且放棄其他misfire的(類似所有misfire的操作被合并執(zhí)行了)。然后繼續(xù)按調度執(zhí)行。無論misfire多少次trigger的執(zhí)行,都只會立刻執(zhí)行1次 9點和10點的被合并執(zhí)行一次(換句話說,10點需要執(zhí)行的那次,被pass了)。下次執(zhí)行將在11點被準時執(zhí)行)
放棄執(zhí)行(所有被misfire的執(zhí)行都被忽略掉,調度器會像平時一樣等待下次調度 9點和10點的執(zhí)行(misfire的2個)被立即執(zhí)行,下次執(zhí)行將在11點被準時執(zhí)行。)
并發(fā)執(zhí)行:是否需要多個任務間同時執(zhí)行
狀態(tài):是否啟動定時任務
備注:描述信息

2、點擊執(zhí)行一次,測試定時任務是否正常及調度日志是否正確記錄

所有定時任務的相關業(yè)務邏輯代碼在ruoyi-quartz模塊,可以自行調整或剔除

注意:不同數(shù)據(jù)源定時任務都有對應腳本,Oracle、Mysql已經(jīng)有了,其他的可自行下載執(zhí)行

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號