前言:
在發(fā)布完:開源:Taurus.DTC 微服務(wù)分布式事務(wù)框架,支持 .Net 和 .Net Core 雙系列版本,之后想想,好像除了事務(wù)外,感覺里面多了一個任務(wù)發(fā)布訂閱的基礎(chǔ)功能。
本想既然都有了基礎(chǔ)發(fā)布訂閱功能了,那要不要順帶加上延時發(fā)布功能呢?加上了會不會讓事務(wù)組件不純了?
經(jīng)過一翻深思,是在其上補上功能,還是,重新寫一個組件,起初起名是個難題,因為 DTC 也可以是 Distributed Task Cxxxxx, 組件重名了?
經(jīng)過一翻英文大作戰(zhàn),找到了:Distributed?Task?Scheduler,簡寫可以是DTS了,才開始重啟一個組件。
于是就有了這個Taurus.DTS 任務(wù)組件,而且功能除了原有的即時任務(wù)發(fā)布訂閱,和本來想加上的延時任務(wù),后面又補上了基于Cron表達(dá)式的定時任務(wù),和廣播群發(fā)任務(wù)。
經(jīng)過一翻大作戰(zhàn),有 Taurus.DTC 的基礎(chǔ)代碼作底層支持,花了大幾天,解決了各種疑難雜癥之后,終于出來了。
1、開源地址:
https://github.com/cyq1162/Taurus.DTS
2、Nuget?包引用ID:
由于?CYQ.Data?Orm 組件本身支持10多種數(shù)據(jù)庫,因此提供的包,只根據(jù)消息隊列的需要分拆提供。
默認(rèn)Taurus.DTS 支持同時使用?RabbitMQ?和 Kafka?兩種消息隊列。
如果一個項目中只用RabbitMQ,則引入 Tarurus.DTS.RabbitMQ,減少對 Kafka?的依賴包。
編繹的版本:支持太多,發(fā)布是個苦力活:
.Net 系列:由于引用依賴關(guān)系(RabbitMQ最低是 4.0,Kafka最低是 4.5); .Net Core系列、支持 2.1 到 8.0 版本及以后。 Standard 標(biāo)準(zhǔn)庫:支持2.1 及以后。
3、Taurus.DTS 微服務(wù)分布式任務(wù)框架基礎(chǔ)說明:
基礎(chǔ)說明:
1、框架分為: Client(客戶端,即任務(wù)發(fā)起端)和 Server(服務(wù)端,即方法訂閱方)。 2、框架支持:即時任務(wù)、延時任務(wù)、Cron表達(dá)式任務(wù)定時任務(wù)、廣播任務(wù),四種方式。 3、項目需要配置的參數(shù):1、數(shù)據(jù)庫(可選);2、MQ(必選)。
數(shù)據(jù)存儲:
可選擇數(shù)據(jù)庫(MSSQL、MySql、Oracle、PostgreSql 等 CYQ.Data 所支持的10多種數(shù)據(jù)庫之一)
MSSQL配置示例如下:
{ "ConnectionStrings": { "DTS.Server.Conn": "server=.;database=MSLog;uid=sa;pwd=123456" } }
消息隊列:
目前消息隊列支持 RabbitMQ 或者 Kafka(配置其中一方即可):
{ "AppSettings": { "DTS.Server.Rabbit":"127.0.0.1;guest;guest;/",//ip;username;password;virtualpath; "DTS.Server.Kafka":"127.0.0.1:9092" } }
以上配置為Server端,客戶端更改 Server 為 Client 即可。
4、Server 端 使用示例:
1、Nuget 搜索 Taurus.DTS 引入工程項目中。
2、如果是 ASP.Net Core 程序:Program 或 Startup 添加服務(wù)使用引入:
services.AddTaurusDts(); // 服務(wù)添加。 app.UseTaurusDts(TaskStartType.Server); //服務(wù)使用,啟用服務(wù)端
3、appsettings.json 配置基本屬性:
{ "ConnectionStrings": { "DTS.Server.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;" }, "AppSettings": { "DTS.Server.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath }
4、選擇數(shù)據(jù)庫對應(yīng)的依賴組件,如MySql,可以:
Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (會自動引入MySql.Data) 都可, 引入項目即可。
5、代碼編寫,可以參考源碼中提供的示例代碼,如下為控制臺示例代碼:
using System; using Taurus.Plugin.DistributedTask; namespace Console_App_Server { internal class Program { static void Main(string[] args) { DTSConfig.Server.Rabbit = "127.0.0.1;guest;guest;/"; //DTSConfig.Server.Kafka = "127.0.0.1:9092;"; //DTSConfig.Server.Conn = DTSConfig.Client.Conn; DTSConfig.ProjectName = "ConsoleApp5"; DTS.Server.Start();//start client and server Console.WriteLine("---------------------------------------"); Console.ReadLine(); } } /// <summary> /// 服務(wù)端 server class need to public /// </summary> public class Server { [DTSSubscribe("DoInstantTask")] public static bool A(DTSSubscribePara para) { para.CallBackContent = "show you a."; return true; } [DTSSubscribe("DoDelayTask")] private static bool B(DTSSubscribePara para) { para.CallBackContent = "show you b."; return true; } [DTSSubscribe("DoCronTask")] private static bool C(DTSSubscribePara para) { para.CallBackContent = "show you c."; return true; } /// <summary> /// 定時任務(wù) /// </summary> [DTSSubscribe("DoBroadastTask")] private static bool TimerTask(DTSSubscribePara para) { para.CallBackContent = "show you d."; return true; } } }
5、Client 端 使用示例:
1、Nuget 搜索 Taurus.DTS 引入工程項目中。
2、如果是ASP.Net Core 程序:Program 或 Startup 添加服務(wù)使用引入:
services.AddTaurusDts(); // 服務(wù)添加 app.UseTaurusDts(StartType.Client); //服務(wù)使用,啟用服務(wù)端
3、appsettings.json 配置基本屬性:
{ "ConnectionStrings": { "DTS.Client.Conn": "host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;" }, "AppSettings": { "DTS.Client.Rabbit": "127.0.0.1;guest;guest;/" //IP;UserName;Password;VirtualPaath }
4、選擇數(shù)據(jù)庫對應(yīng)的依賴組件,如MySql,可以:
Nuget 上可以搜索 MySql.Data 、或者 CYQ.Data.MySql (會自動引入MySql.Data) 都可, 引入項目即可。
5、代碼編寫,可以參考源碼中提供的示例代碼,如下為控制臺示例代碼:
using System; using System.Threading; using Taurus.Plugin.DistributedTask; namespace Console_App_Client { internal class Program { static void Main(string[] args) { DTSConfig.Client.IsPrintTraceLog = false; //AppConfig.Redis.Servers = "127.0.0.1:6379"; DTSConfig.Client.Rabbit = "127.0.0.1;guest;guest;/"; //DTSConfig.Client.Kafka = "127.0.0.1:9092;"; DTSConfig.Client.Conn = "server=.;database=mslog;uid=sa;pwd=123456"; DTSConfig.ProjectName = "ConsoleApp5"; DTS.Client.Start();//start client and server Console.WriteLine("---------------------------------------"); Console.WriteLine("1-InstantTask、2-DelayTask(1Minutes)、3-CronTask、4-DeleteCronTask、5-BroadastTask"); Console.WriteLine("Input :1、2、3、4、5,Press Enter."); while (true) { string line = Console.ReadLine(); try { Client.Run(int.Parse(line)); } catch(Exception err) { Console.WriteLine(err.Message); } } } } /// <summary> /// 客戶端 client class need to public if has callback method. /// </summary> public class Client { public static void Run(int i) { if (i == 2) { //發(fā)布一個延時1分鐘的任務(wù) DTS.Client.Delay.PublishAsync(1, "i publish a delay task.", "DoDelayTask", "DelayCallBack"); Console.WriteLine("Wait for 1 minute..."); } else if (i == 3) { //發(fā)布一個秒在30時的循環(huán)任務(wù)。 DTS.Client.Cron.PublishAsync("10,30,50 * * * * ?", "i publish a timer task with cron express.", "DoCronTask", "CronCallBack"); Console.WriteLine("Wait for execute task when second is 10,30,50..."); } else if (i == 4) { //發(fā)布一個秒在30時的循環(huán)任務(wù)。 DTS.Client.Cron.DeleteAsync("DoCronTask", null, "CronCallBack"); } else if (i == 5) { //發(fā)布一個廣播任務(wù) DTS.Client.Broadast.PublishAsync("i publish a task for all server.", "DoBroadastTask", "BroadastCallBack"); } else { for (int k = 0; k < 1; k++) { //發(fā)布一個即時任務(wù) DTS.Client.Instant.PublishAsync("i publish a task instantly.", "DoInstantTask", "InstantCallBack"); Console.WriteLine(k); } } } [DTSCallBack("InstantCallBack")] [DTSCallBack("DelayCallBack")] [DTSCallBack("CronCallBack")] [DTSCallBack("BroadastCallBack")] private static void OnCallBack(DTSCallBackPara para) { Console.WriteLine("Client callback : " + para.TaskType + " - " + para.CallBackKey + " - " + para.CallBackContent); } } }
6、Demo?運行示例:
demo?地址:https://github.com/cyq1162/Taurus.DTS/tree/master/demo
啟動運行截圖:
?輸入1,發(fā)布即時任務(wù):
7、其它:CYQ.Data?支持的數(shù)據(jù)庫鏈接語句示例
###--------------------------------------------------------###
Txt:: Txt Path=E:\
Xml:: Xml Path=E:\
Access:: Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\cyqdata.mdb
Sqlite:: Data Source=E:\cyqdata.db;failifmissing=false;
MySql:: host=localhost;port=3306;database=cyqdata;uid=root;pwd=123456;Convert Zero Datetime=True;
Mssql:: server=.;database=cyqdata;uid=sa;pwd=123456;provider=mssql;
Sybase:: data source=127.0.0.1;port=5000;database=cyqdata;uid=sa;pwd=123456;provider=sybase;
Postgre: server=localhost;uid=sa;pwd=123456;database=cyqdata;provider=pg;
DB2: Database=SAMPLE;User ID=administrator;Server=127.0.0.1;password=1234560;provider=db2;
FireBird user id=SYSDBA;password=123456;database=d:\\test.dbf;server type=Default;data source=127.0.0.1;port number=3050;provider=firebird;
Dameng:: user id=SYSDBA;password=123456789;data source=127.0.0.1;schema=test;provider=dameng;
KingBaseES server=127.0.0.1;User Id=system;Password=123456;Database=test;Port=54321;schema=public;provider=kingbasees;
Oracle ODP.NET::
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SID = orcl)));User ID=sa;password=123456
由于各種數(shù)據(jù)庫鏈接語句基本一致,除了特定寫法外,可以通過鏈接補充:provider=mssql、provider=mysql、provider=db2、provider=postgre等來區(qū)分。
###--------------------------------------------------------###
8、總結(jié):
由于 Taurus.DTS?分布式任務(wù)發(fā)布組件的獨立發(fā)布,原有發(fā)布的 Taurus.DTC?分布式事務(wù)組件,下一版本會移除掉其基礎(chǔ)的任務(wù)發(fā)布訂閱功能,保留事務(wù)的純潔屬性。
今天發(fā)布的 Taurus.DTS 組件,為 .Net?和? .Net?Core?微服務(wù)系列又又貢獻(xiàn)了一個新的組件。文章來源:http://www.zghlxwxcb.cn/news/detail-801507.html
后續(xù)會發(fā)布分布式鎖的教程,這個已經(jīng)在 CYQ.Data?里實現(xiàn)了,并且在也在 Taurus.DTC?和 Taurus.DTS?中使用到了。文章來源地址http://www.zghlxwxcb.cn/news/detail-801507.html
到了這里,關(guān)于開源:Taurus.DTS 微服務(wù)分布式任務(wù)框架,支持即時任務(wù)、延時任務(wù)、Cron表達(dá)式定時任務(wù)和廣播任務(wù)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!