データベースを定期的にバックアップします。この例のデモの間隔は2秒です。データベースはプロジェクトのプロパティで構成されていません(メインクラスの2つのメモに注意してください)
メインクラス
@SpringBootApplication(exclude= {
DataSourceAutoConfiguration.class})
@EnableScheduling
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
1つは、Windows環境下
package com.springboot.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
@Slf4j
public class task {
@Scheduled(cron = "*/2 * * * * ?")
public void dump() throws Exception {
log.info("备份数据库");
String backName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
dataBaseDump("localhost", "3306", "root", "123456", "excel", backName);
}
//mysqldump -hlocalhost -P3306 -uroot -p123456 db > E:/back.sql
//备份
public static void dataBaseDump(String host, String port, String username, String password, String databasename, String sqlname) throws Exception {
File file = new File("E:\\test");
if (!file.exists()) {
file.mkdir();
}
File datafile = new File(file + File.separator + sqlname + ".sql");
if (datafile.exists()) {
System.out.println(sqlname + "文件名已存在,请更换");
return;
}
//拼接cmd命令
Process exec = Runtime.getRuntime().exec("cmd /c mysqldump -h" + host + " -P" + port + " -u " + username + " -p" + password + " " + databasename + " > " + datafile);
if (exec.waitFor() == 0) {
System.out.println("数据库备份成功,备份路径为:" + datafile);
}
}
}
2、Linux環境下
package com.springboot.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
@Slf4j
public class task {
@Scheduled(cron = "*/2 * * * * ?")
public void dump() throws Exception {
log.info("备份数据库");
String backName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
dataBaseDump("localhost", "3306", "root", "123456", "excel", backName);
}
//mysqldump -hlocalhost -P3306 -uroot -p123456 db > E:/back.sql
//备份
public static void dataBaseDump(String host, String port, String username, String password, String databasename, String sqlname) throws Exception {
File file = new File("E:\\test");
if (!file.exists()) {
file.mkdir();
}
File datafile = new File(file + File.separator + sqlname + ".sql");
if (datafile.exists()) {
System.out.println(sqlname + "文件名已存在,请更换");
return;
}
//拼接cmd命令
Process exec = Runtime.getRuntime().exec("/bin/sh -c mysqldump -h" + host + " -P" + port + " -u " + username + " -p" + password + " " + databasename + " > " + datafile);
if (exec.waitFor() == 0) {
System.out.println("数据库备份成功,备份路径为:" + datafile);
}
}
}
3、cron式の詳細な説明
1.構造
左から右へトウモロコシ(スペースで区切る):秒、分、時間、月、日、月、週、日、年
2.各フィールドの意味
フィールド | 手当 | 使用できる特殊文字 |
---|---|---|
秒(秒) | 0から59までの整数 | 、-* / 4文字 |
分(分) | 0から59までの整数 | 、-* / 4文字 |
時間 | 0から23までの整数 | 、-* / 4文字 |
日付(DayofMonth) | 1から31までの整数(ただし、月の日数を考慮する必要があります) | 、-*?/ LWC 8文字 |
月 | 1から12までの整数またはJAN-DEC | 、-* / 4文字 |
週(DayofWeek) | 1から7までの整数またはSUN-SAT(1 = SUN) | 、-*?/ LC#8文字 |
年(オプション、空白のまま) | (年)1970〜2099 | 、-* / 4文字 |
3.注意が必要な事項
各フィールドは数字を使用しますが、次の特殊文字も表示される可能性があり、その意味は次のとおりです。
(1)*
:フィールドに一致する任意の値を示します。「分」フィールドで*を使用すると、イベントが毎分トリガーされることを意味します。
(2)?
:DayofMonthおよびDayofWeekドメインでのみ使用できます。また、ドメインの任意の値と一致しますが、一致しません。DayofMonthとDayofWeekは互いに影響し合うからです。たとえば、毎月20日にスケジューリングをトリガーする場合、20日が何曜日であるかに関係なく、次の表記法のみを使用できます。13 13 15 20 *?、最後の桁のみ使用できますか?、および*は使用できません。*を使用すると、曜日に関係なくトリガーされますが、実際にはそうではありません。
(3)-
:範囲を示します。たとえば、[分]フィールドで5〜20を使用すると、5分から20分まで毎分トリガーされます。
(4)/
:トリガーが開始時刻に開始され、その後一定時間ごとにトリガーされることを示します。たとえば、[分]フィールドで5/20を使用すると、5分ごとに1回トリガーされ、25、45などが1回トリガーされます。
(5),
:列挙値をリストすることを示します。例:[分]フィールドで5,20を使用すると、毎分5分と20分でトリガーされます。
(6)L
:最後に、DayofWeekおよびDayofMonthフィールドにのみ表示できることを示します。5LがDayofWeekドメインで使用されている場合は、最終木曜日にトリガーされます。
(7)W
:有効な稼働日(月曜日から金曜日)を示します。これはDayofMonthドメインでのみ表示でき、システムは指定された日付から最も近い有効な稼働日にイベントをトリガーします。例:DayofMonthで5Wを使用し、5日が土曜日の場合、最も近い稼働日である金曜日、つまり4日でトリガーされます。5日が日曜日の場合、6日(月曜日)にトリガーされ、5日が月曜日から金曜日の1日の場合、5日にトリガーされます。別の点として、Wの最近の検索は月にまたがらないでしょう。
(8)LW
:これら2つの文字を一緒に使用して、月の最後の稼働日、つまり最後の金曜日を示すことができます。
(9)#
:毎月の曜日を決定するために使用されます。DayofWeekドメインでのみ表示できます。たとえば、4#2は特定の月の第2水曜日を意味します。
4.一般的に使用される式の例
(0)0/20 * * * * ?
20秒ごとにタスクを調整することを意味します
(1)0 0 2 1 * ?
毎月1日の午前2時にタスクを調整することを意味します
(2)0 15 10 ? *
MON-FRIは、月曜日から金曜日まで毎日午前10:15にタスクを実行することを意味します
(3)0 15 10 ? 6L 2002-2006
2002-2006を意味します毎月の最終金曜日は、午前10時15分に実行されます
(4)0 0 10,14,16 * * ?
毎日午前10時、午後2時、午後4時
(5)0 0/30 9-17 * * ?
勤務時間中の30 分ごと(9
)0 0 12 ? * WED
は、毎週水曜日の正午を意味します12時
(7)0 0 12 * * ?
毎日12時にトリガー
(8)0 15 10 ? * *
毎日10:15にトリガー
(9)0 15 10 * * ?
毎日10:15にトリガー
(10)0 15 10 * * ? *
毎日10:15にトリガー
(11)0 15 10 * * ? 2005
2005年の毎日10:15にトリガー
( 12)0 * 14 * * ?
毎日午後2時から午後2時59分まで1 分ごとにトリガー
(13)0 0/5 14 * * ?
毎日午後2時から午後2時55分まで5分ごとにトリガー
(14)0 0/5 14,18 * * ?
午後2時から午後2時55分まで5分ごとにトリガーまた、毎年3月の水曜日の午後6時から午後6時55分までの5分ごと
(15)0 0-5 14 * * ?
午後2時から午後2時5分までの1分ごと
(16)0 10,44 14 ? 3 WED
午後2時10分および午後2時44分引き金
(17)0 15 10 ? * MON-FRI
月曜日から金曜日の午前10時15分にトリガー
(18)0 15 10 15 * ?
毎月15日の午前10時15分にトリガー
(19)毎月の0 15 10 L * ?
最終日の午前10時15分にトリガー
(20)0 15 10 ? * 6L
毎月の最終金曜日の午前10時にトリガー:15トリガー
(21)0 15 10 ? * 6L 2002-2005
2002年から2005年まで、毎月最後の金曜日の午前10:15にトリガー
(22)毎月0 15 10 ? * 6#3
第3金曜日の午前10:15にトリガー