ScheduleTaskHelper.Core
1.0.7
dotnet add package ScheduleTaskHelper.Core --version 1.0.7
NuGet\Install-Package ScheduleTaskHelper.Core -Version 1.0.7
<PackageReference Include="ScheduleTaskHelper.Core" Version="1.0.7" />
<PackageVersion Include="ScheduleTaskHelper.Core" Version="1.0.7" />
<PackageReference Include="ScheduleTaskHelper.Core" />
paket add ScheduleTaskHelper.Core --version 1.0.7
#r "nuget: ScheduleTaskHelper.Core, 1.0.7"
#:package ScheduleTaskHelper.Core@1.0.7
#addin nuget:?package=ScheduleTaskHelper.Core&version=1.0.7
#tool nuget:?package=ScheduleTaskHelper.Core&version=1.0.7
ScheduleTaskHelper - 資料同步服務
📘 專案概述
ScheduleTaskHelper 是一個專注於資料同步的高效排程工具,支援 Cron 表達式與定時任務排程,具備錯誤重試、分散式鎖機制及同步狀態監控功能。其插件式架構允許動態擴展,適用於多節點部署環境。核心功能包括任務優先級管理、資料一致性驗證及重試佇列,並提供靈活的配置與高效能的執行管理。
🛠️ 主要功能
- 自動化資料同步排程
- 支援 Cron 表達式的任務排程
- 錯誤處理和重試機制
- 同步狀態監控與記錄
- 資料一致性驗證
- 插件式架構,支援動態擴展
- 分散式鎖機制
- 任務重試佇列
🏗️ 架構設計
核心元件
1. 工作群組管理器 (WorkerGroup)
WorkerGroup
├── 任務佇列管理
├── 優先級排序
└── 背景執行緒控制
關鍵特性:
- 使用
SortedDictionary
實現優先級佇列 - 基於背景執行緒的任務處理
- 執行緒安全的佇列操作
- 支援任務的動態新增和移除
實作細節:
_taskQueue
: 使用SortedDictionary<int, Queue<IScheduledTask>>
實現優先級佇列_lock
: 使用物件鎖確保執行緒安全_signal
: 使用AutoResetEvent
控制執行緒同步WorkerLoop
: 背景執行緒的主要處理邏輯
2. 排程執行池 (ScheduledThreadPool)
關鍵特性:
- 管理多個工作群組
- 支援定時任務排程
- 支援 Cron 表達式排程
- 控制任務執行順序
- 防止任務重疊執行
- 確保準確的時間點執行
實作細節:
_groups
: 管理不同的工作群組_timers
: 管理任務計時器_taskStates
: 追蹤每個任務的執行狀態Schedule()
: 基於時間間隔的排程方法ScheduleCron()
: 基於 Cron 表達式的排程方法
3. 任務執行狀態管理 (TaskExecutionState)
關鍵特性:
- 追蹤任務執行狀態
- 防止任務重疊執行
- 記錄上次執行時間和下次排程時間
實作細節:
LastExecutionTime
: 記錄任務最後一次執行時間NextScheduledTime
: 儲存任務下次排程時間IsExecuting
: 標記任務當前是否正在執行中
4. 排程任務 (Scheduled Tasks)
4.1 基礎任務介面與類別
- IScheduledTask: 定義基本任務介面
- ICronScheduledTask: 擴展支援 Cron 表達式的任務介面
- BaseTask: 實現基本任務功能的抽象類別
- BaseCronTask: 實現 Cron 任務功能的抽象類別
5. Cron 表達式支援
關鍵特性:
- 支援標準 NCrontab 格式的 Cron 表達式
- 提供常用排程模式的預定義表達式
- 基於 NCrontab 庫實現表達式解析
實作細節:
CronUtils
: Cron 表達式解析工具CronExpressions
: 常用 Cron 表達式常數GetNextExecution()
: 計算下一次執行時間
6. 插件架構 (Plugin Architecture)
關鍵特性:
- 支援動態載入外部任務插件
- 可配置的插件管理
- 熱插拔能力
- 任務執行優先級配置
實作細節:
IPlugin
: 插件介面,定義插件功能BasePlugin
: 基本插件抽象類別,簡化插件開發PluginLoader
: 負責發現和載入插件PluginConfiguration
: 插件配置管理PluginTaskInfo
: 插件任務信息定義
更新:
GetAvailableTasks
方法現在支援從pluginconfig.json
動態加載任務。- 詳細說明:
pluginconfig.json
中的TaskConfigurations
定義了所有任務的配置。- 系統會根據
Enabled
屬性自動加載啟用的任務。
範例:
{
"TaskConfigurations": {
"ScheduledTask": {
"Enabled": true,
"Group": "SyncTasks",
"Priority": 1,
"InitialDelay": "00:00:10",
"Period": "00:05:00"
},
"CronTask": {
"Enabled": false,
"Group": "SyncTasks",
"Priority": 2,
"CronExpression": "0 */5 * * * *"
}
}
}
7. 分散式鎖機制 (Distributed Lock)
關鍵特性:
- 支援多節點部署環境下的任務執行互斥
- 防止同一任務在不同節點上並發執行
- 支援鎖過期自動釋放
- 支援鎖自動延期
- 優雅處理鎖獲取失敗
實作細節:
IDistributedLockProvider
: 分散式鎖提供者介面IDistributedLock
: 分散式鎖介面InMemoryDistributedLockProvider
: 基於記憶體的鎖實作,適用於單節點環境RedisDistributedLockProvider
: 基於 Redis 的鎖實作,適用於多節點環境- 鎖獲取和釋放過程的異步支持
- 指數退避重試策略
8. 任務重試佇列 (Task Retry Queue)
關鍵特性:
- 自動管理失敗任務的重試
- 支援指數退避重試間隔
- 可配置最大重試次數
- 失敗後的事件通知
- 詳細的執行統計和日誌
實作細節:
TaskRetryQueue
: 重試佇列實作RetryTaskInfo
: 重試任務信息- 基於定時器的重試調度
- 並行度控制
- 任務優先級處理
⚙️ 程式碼說明
1. 排程任務介面 (IScheduledTask.cs)
public interface IScheduledTask
{
string Name { get; } // 任務唯一識別名稱
string Group { get; } // 任務群組
TimeSpan InitialDelay { get; }
TimeSpan Period { get; }
int Priority { get; } // 群組內排序用
Task<int> Execute();
void Stop();
}
- 定義基本任務介面
- 支援任務名稱、群組和優先級
- 提供執行和停止方法
2. Cron 排程任務介面 (ICronScheduledTask.cs)
public interface ICronScheduledTask : IScheduledTask
{
bool Immediate { get; }
string CronExpression { get; }
DateTime GetNextExecution(DateTime now);
}
- 擴展基本任務介面
- 支援 Cron 表達式
- 提供計算下一次執行時間的方法
3. 工作群組 (WorkerGroup.cs)
public class WorkerGroup
{
private readonly SortedDictionary<int, Queue<IScheduledTask>> _taskQueue;
private readonly object _lock = new object();
private readonly AutoResetEvent _signal = new AutoResetEvent(false);
private readonly IDistributedLockProvider _lockProvider;
private readonly TaskRetryQueue _retryQueue;
// ...
private async void WorkerLoop()
{
while (_running)
{
// ...獲取任務...
// 嘗試獲取分散式鎖
IDistributedLock lock = await _lockProvider.TryAcquireLockAsync(resourceName, owner, expiryTime);
if (lock != null)
{
try
{
// 執行任務
result = await task.Execute();
}
catch (Exception ex)
{
// 添加到重試佇列
await _retryQueue.AddForRetryAsync(task, ex);
}
finally
{
// 釋放鎖
await lock.ReleaseAsync();
}
}
}
}
}
- 實現任務佇列管理和執行
- 支援優先級排序
- 提供執行緒安全的操作
- 整合分散式鎖和重試機制
4. 排程執行池 (ScheduledThreadPool.cs)
public class ScheduledThreadPool
{
private readonly Dictionary<string, WorkerGroup> _groups;
private readonly Dictionary<string, Timer> _timers;
private readonly Dictionary<string, TaskExecutionState> _taskStates;
private readonly IDistributedLockProvider _lockProvider;
private readonly TaskRetryQueue _retryQueue;
// ...
private class TaskExecutionState
{
public DateTime LastExecutionTime { get; set; } = DateTime.MinValue;
public DateTime NextScheduledTime { get; set; } = DateTime.MinValue;
public bool IsExecuting { get; set; } = false;
public int ExecutionCount { get; set; } = 0;
public int SuccessCount { get; set; } = 0;
public int FailureCount { get; set; } = 0;
}
}
- 管理多個工作群組
- 支援定時任務排程
- 支援 Cron 表達式排程
- 追蹤任務執行狀態,防止任務重疊執行
- 整合分散式鎖和重試佇列的創建
5. 任務重疊處理機制
當任務執行時間到達,但前一個任務實例尚未完成時,系統會採取以下處理策略:
// 檢查任務是否正在執行中
if (state.IsExecuting)
{
taskBusy = true;
// 記錄任務重疊執行的情況
LogWarning($"任務 {task.Name} 的上一個執行實例仍在運行中,跳過本次執行");
// 更新下次執行時間為下一個排程點
DateTime currentTime = DateTime.Now;
state.NextScheduledTime = task.GetNextExecution(currentTime);
LogWarning($"任務 {task.Name} 的下次執行時間已調整為: {state.NextScheduledTime:yyyy-MM-dd HH:mm:ss}");
}
- 檢測任務是否處於執行中狀態
- 如果任務正在執行中,則跳過此次執行
- 計算並排程下一次執行時間
- 記錄詳細的日誌信息,方便監控和調試
6. Cron 工具類 (CronUtils.cs)
public static class CronUtils
{
public static DateTime GetNextOccurrence(string cronExpression, DateTime baseTime)
{
// Cron 表達式解析邏輯...
var schedule = CrontabSchedule.Parse(cronExpression, parseOptions);
var nextOccurrence = schedule.GetNextOccurrence(baseTime);
// 確保下次執行時間不是當前時間(防止秒級重複執行)
// ...
return nextOccurrence;
}
}
- 提供 Cron 表達式解析功能
- 計算下一次執行時間
- 包含驗證機制,確保表達式解析準確
7. 插件架構 (Plugins)
7.1 插件介面 (IPlugin.cs)
public interface IPlugin
{
IPluginMetadata Metadata { get; }
Task<bool> InitializeAsync(IServiceCollection services);
void RegisterServices(IServiceCollection services);
IEnumerable<PluginTaskInfo> GetAvailableTasks();
Task ShutdownAsync();
}
- 定義插件的基本功能
- 支援插件初始化和關閉
- 提供任務註冊機制
7.2 插件載入器 (PluginLoader.cs)
public class PluginLoader
{
private readonly Dictionary<string, IPlugin> _loadedPlugins = new Dictionary<string, IPlugin>();
// ...
public async Task<int> LoadPluginsAsync()
{
// 載入插件的邏輯...
}
public void RegisterTasks(IServiceCollection services)
{
// 註冊插件任務的邏輯...
}
}
- 負責發現和載入插件
- 支援動態載入外部程式集
- 管理插件生命週期
7.3 插件配置 (PluginConfiguration.cs)
public class PluginConfiguration
{
public List<string> EnabledPlugins { get; set; } = new List<string>();
public Dictionary<string, TaskConfiguration> TaskConfigurations { get; set; } = new Dictionary<string, TaskConfiguration>();
// 載入和保存配置的方法...
}
public class TaskConfiguration
{
public bool Enabled { get; set; } = true;
public string? CronExpression { get; set; }
public TimeSpan? InitialDelay { get; set; }
public TimeSpan? Period { get; set; }
public int? Priority { get; set; }
public string? Group { get; set; }
public bool? ExecuteImmediately { get; set; }
public Dictionary<string, object>? Parameters { get; set; } = new Dictionary<string, object>();
}
- 管理插件啟用狀態
- 配置個別任務參數
- 支援配置檔的載入和保存
- 使用自訂 JSON 轉換器處理 TimeSpan 序列化
8. 分散式鎖 (Distributed Lock)
8.1 分散式鎖介面 (IDistributedLockProvider.cs)
public interface IDistributedLockProvider
{
Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime);
Task<IDistributedLock> AcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime, TimeSpan timeout, CancellationToken cancellationToken = default);
}
public interface IDistributedLock : IAsyncDisposable
{
string ResourceName { get; }
string Owner { get; }
DateTime AcquiredTime { get; }
DateTime ExpiryTime { get; }
Task<bool> ExtendExpiryTimeAsync(TimeSpan expiryTime);
Task<bool> ReleaseAsync();
}
- 定義分散式鎖的核心功能
- 支援嘗試獲取鎖、等待獲取鎖
- 支援鎖延期和釋放
8.2 記憶體內分散式鎖 (InMemoryDistributedLockProvider.cs)
public class InMemoryDistributedLockProvider : IDistributedLockProvider
{
private static readonly ConcurrentDictionary<string, InMemoryDistributedLock> _locks = new();
public async Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime)
{
// 嘗試獲取鎖的實現...
}
private class InMemoryDistributedLock : IDistributedLock
{
// 記憶體內鎖的實現...
}
}
- 單節點環境下的分散式鎖實現
- 使用 ConcurrentDictionary 儲存鎖
- 支援鎖過期自動清理
8.3 Redis 分散式鎖 (RedisDistributedLockProvider.cs)
public class RedisDistributedLockProvider : IDistributedLockProvider
{
private readonly IConnectionMultiplexer _redis;
public async Task<IDistributedLock?> TryAcquireLockAsync(string resourceName, string owner, TimeSpan expiryTime)
{
// 使用 Redis 實現分散式鎖...
}
private class RedisDistributedLock : IDistributedLock
{
// 支援看門狗自動延長鎖時間...
}
}
- 多節點環境下的分散式鎖實現
- 使用 Redis SET NX 命令
- 實現看門狗機制自動延長鎖
- 使用 Lua 腳本確保操作原子性
9. 任務重試佇列 (TaskRetryQueue.cs)
public class TaskRetryQueue : IDisposable
{
private readonly ConcurrentDictionary<string, RetryTaskInfo> _retryTasks = new();
private readonly Timer _retryTimer;
private readonly int _maxRetries;
public async Task<bool> AddForRetryAsync(IScheduledTask task, Exception error, TimeSpan? nextRetryDelay = null)
{
// 添加任務到重試佇列...
}
private async void CheckRetryQueue(object? state)
{
// 檢查重試佇列並執行到期的重試任務...
}
}
public class RetryTaskInfo
{
public IScheduledTask Task { get; set; } = null!;
public int RetryCount { get; set; }
public DateTime FirstFailureTime { get; set; }
public DateTime LastFailureTime { get; set; }
public DateTime NextRetryTime { get; set; }
public Exception LastError { get; set; } = null!;
}
- 管理失敗任務的重試
- 指數退避重試策略
- 最大重試次數限制
- 詳細的任務重試狀態追蹤
🔧 配置說明
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
"Redis": "localhost:6379,abortConnect=false"
},
"RedisLockOptions": {
"KeyPrefix": "tradevan:lock:",
"AutoExtend": true,
"DefaultExpiryTime": "00:00:30"
},
"RetryQueueOptions": {
"CheckInterval": "00:00:10",
"MaxRetries": 3
}
}
插件配置檔 (pluginconfig.json)
{
"EnabledPlugins": [
"TradeVanSync.SamplePlugin"
],
"TaskConfigurations": {
"SampleTask": {
"Enabled": true,
"Group": "SampleTasks",
"Priority": 1,
"InitialDelay": "00:00:10",
"Period": "00:05:00"
},
"SampleCronTask": {
"Enabled": true,
"Group": "SampleTasks",
"CronExpression": "0 */5 * * * *",
"ExecuteImmediately": true
}
}
}
插件配置檔案格式說明
EnabledPlugins: 列出所有已啟用的插件ID
- 每個插件由其唯一ID識別
- 未列出的插件即使存在也不會被載入
TaskConfigurations: 個別任務的配置
- 鍵是任務ID
- 值是TaskConfiguration對象,包含以下屬性:
- Enabled: 是否啟用此任務(布林值)
- Group: 任務群組名稱
- Priority: 執行優先級
- InitialDelay: 首次執行前的延遲時間(格式: "HH:mm:ss")
- Period: 定期任務的執行間隔(格式: "HH:mm:ss")
- CronExpression: Cron任務的排程表達式
- ExecuteImmediately: Cron任務是否在啟動時立即執行
- Parameters: 任務專用參數,可自訂
主要配置項目
配置項目 | 說明 | 預設值 |
---|---|---|
DevMode | 開發模式開關,決定使用沙箱或正式環境 | false |
SanxboxEndpoint | 沙箱環境 API 端點 | https://pmspmia.tradevan.com.tw/APMIA/ |
ProductEndpoint | 正式環境 API 端點 | https://pms.ia.gov.tw/APMIA/ |
Secret | API 密鑰 | 需要配置 |
ConnectionStrings:Redis | Redis 連線字串 | null (空字串使用記憶體內鎖) |
RedisLockOptions:KeyPrefix | Redis 鎖鍵前綴 | tradevan:lock: |
RedisLockOptions:AutoExtend | 是否自動延長鎖時間 | true |
RedisLockOptions:DefaultExpiryTime | 默認鎖過期時間 | 00:00:30 (30秒) |
RetryQueueOptions:CheckInterval | 重試佇列檢查間隔 | 00:00:10 (10秒) |
RetryQueueOptions:MaxRetries | 最大重試次數 | 3 |
🚀 效能考量
記憶體管理
- 使用佇列控制記憶體使用
- 實作資料批次處理
- 適當的記憶體回收策略
執行緒優化
- 使用執行緒池
- 避免執行緒阻塞
- 最佳化同步操作
資料庫操作
- 批次更新機制
- 交易管理
- 連線池優化
任務執行管理
- 防止任務重疊執行
- 精確計時的時間排程
- 自動處理錯過的執行時間
- 分散式鎖確保多節點部署安全
錯誤處理與重試
- 智能重試策略
- 指數退避算法
- 失敗記錄與通知
🔄 可擴展性設計
模組化架構
- 易於添加新的同步任務
- 可配置的任務參數
- 彈性的資料處理邏輯
介面抽象
IScheduledTask
介面定義標準任務合約ICronScheduledTask
介面擴展 Cron 排程功能IDistributedLock
介面定義分散式鎖功能- 可擴展的資料處理管道
- 可替換的元件實作
事件驅動架構
- 基於 EventBus 的事件發佈與訂閱
- 支援同步和非同步事件處理
- 任務生命週期事件通知
插件式架構
- 支援動態載入外部插件
- 熱插拔式設計
- 允許第三方擴展
- 獨立部署和更新
💡 改進建議
1. 架構優化
- 實作任務重試佇列
- 添加分散式鎖機制
- 實作事件驅動架構
- 防止任務重疊執行機制
- 支援插件式架構
2. 效能提升
- 實作非同步I/O操作
- 優化記憶體使用
- 添加快取機制
- 優化任務執行時間計算
3. 監控與維護
- 實作健康檢查端點
- 加強日誌記錄
- 添加效能指標收集
- 任務執行狀態監控
4. 錯誤處理
- 實作更細緻的錯誤分類
- 添加自動復原機制
- 強化資料驗證
- 改進任務錯誤處理邏輯
5. 擴展性
- 支援插件式架構
- 實作設定熱重載
- 添加動態任務調度
- 任務執行狀態管理
- 修復插件配置的 JSON 序列化問題
📑 API文件
Plugin API
IPlugin
: 插件介面BasePlugin
: 插件基類PluginLoader
: 插件載入器PluginConfiguration
: 插件配置
Distributed Lock API
IDistributedLockProvider
: 分散式鎖提供者介面IDistributedLock
: 分散式鎖介面
Task Retry API
TaskRetryQueue
: 任務重試佇列RetryTaskInfo
: 重試任務資訊
🔒 安全性考量
資料安全
- API金鑰管理
- 敏感資料加密
- 存取權限控制
系統安全
- 異常監控
- 存取日誌
- 資源限制
插件安全
- 插件簽名驗證
- 沙箱隔離
- 資源使用限制
分散式架構安全
- 節點認證
- 分散式鎖資源隔離
- 超時處理策略
❓ 故障排除
常見問題
同步失敗
- 檢查網路連線
- 驗證API認證
- 查看錯誤日誌
效能問題
- 監控資源使用
- 檢查資料庫效能
- 分析執行緒狀態
排程執行問題
- 檢查 CRON 表達式正確性
- 確認任務執行狀態
- 分析日誌中的時間記錄
- 監控是否有任務重疊執行警告
插件載入問題
- 檢查插件相容性
- 確認依賴項目已滿足
- 檢查插件目錄權限
- 確保插件配置檔案格式正確
分散式鎖問題
- 檢查 Redis 連線狀態
- 確認鎖過期時間設置
- 查看鎖獲取與釋放日誌
任務重試問題
- 檢查重試間隔配置
- 確認任務是否為冪等操作
- 監控重試次數和失敗原因
📊 效能基準
- 單次同步處理能力: 1000筆/分鐘
- 平均回應時間: < 100ms
- 記憶體使用上限: 1GB
- CPU使用率: < 30%
📝 版本歷程
v1.0.0
- 初始版本發布
- 基本同步功能實作
- 錯誤處理機制
v1.1.0
- 新增 Cron 表達式支援
- 優化任務排程機制
- 增強錯誤處理功能
v1.2.0
- 優化 Cron 表達式解析與執行
- 新增任務重疊執行防護機制
- 改進事件驅動架構
- 增強任務執行狀態監控
v1.3.0
- 實作插件式架構
- 支援動態載入外部插件
- 插件配置管理
- 改進任務執行監控
v1.3.1
- 修復插件配置 JSON 序列化/反序列化問題
- 改進 TimeSpan 類型處理
- 增強插件配置文檔
v1.4.0
- 新增分散式鎖機制
- 實作任務重試佇列
- 優化事件系統
- 強化任務執行統計和監控
IPluginStartup 使用說明
IPluginStartup
是一個用於初始化和管理外掛的介面,負責外掛的啟動、服務註冊以及任務的動態加載。此介面主要用於實現外掛的生命週期管理,並支援動態載入與配置。
介面定義
public interface IPluginStartup
{
/// <summary>
/// 初始化外掛,註冊必要的服務。
/// </summary>
/// <param name="services">DI 容器的服務集合。</param>
void ConfigureServices(IServiceCollection services);
/// <summary>
/// 啟動外掛,執行初始化邏輯。
/// </summary>
/// <param name="serviceProvider">DI 容器的服務提供者。</param>
void Start(IServiceProvider serviceProvider);
/// <summary>
/// 停止外掛,釋放資源。
/// </summary>
void Stop();
}
使用方式
- 實作
IPluginStartup
- 每個外掛需實作
IPluginStartup
介面,並提供初始化、啟動和停止的邏輯。 - 例如:
- 每個外掛需實作
public class SamplePluginStartup : IPluginStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 註冊外掛所需的服務
services.AddSingleton<IScheduledTask, SampleTask>();
}
public void Start(IServiceProvider serviceProvider)
{
// 啟動外掛邏輯
Console.WriteLine("SamplePlugin 已啟動");
}
public void Stop()
{
// 停止外掛邏輯
Console.WriteLine("SamplePlugin 已停止");
}
}
- 讀取外掛自定義設定檔
- 外掛可以使用
IConfiguration
來讀取自定義的設定檔,例如pluginconfig.SamplePlugin.json
。 - 例如:
- 外掛可以使用
public class SamplePluginStartup : IPluginStartup
{
public void ConfigureServices(IServiceCollection services)
{
string pluginDirectory = Path.Combine(AppContext.BaseDirectory, "Plugins", "SamplePlugin");
string configFilePath = Path.Combine(pluginDirectory, "pluginconfig.SamplePlugin.json");
if (!File.Exists(configFilePath))
{
throw new FileNotFoundException($"設定檔未找到: {configFilePath}");
}
var configBuilder = new ConfigurationBuilder()
.AddJsonFile(configFilePath, optional: false, reloadOnChange: false);
var configuration = configBuilder.Build();
// 使用設定
var pluginSetting = configuration["TestPlugin"];
Console.WriteLine($"TestPlugin 設定值: {pluginSetting}");
// 註冊服務
services.AddScoped<INotify>(provider => new SlackNotify(pluginSetting));
}
public void Start(IServiceProvider serviceProvider)
{
Console.WriteLine("SamplePlugin 已啟動");
}
public void Stop()
{
Console.WriteLine("SamplePlugin 已停止");
}
}
外掛自定義設定檔操作说明
外掛的自定義設定檔通常以 JSON 格式存儲,並由外掛自行讀取和使用。以下是操作說明:
設定檔範例
以下是一個典型的 pluginconfig.SamplePlugin.json
設定檔範例:
{
"TestPlugin": "https://hooks.slack.com/services/your/webhook/url",
"RetryCount": 3,
"EnableLogging": true
}
操作步驟
新增設定檔
- 在外掛目錄下新增自定義設定檔,例如
pluginconfig.SamplePlugin.json
。 - 確保設定檔的結構符合外掛的需求。
- 在外掛目錄下新增自定義設定檔,例如
讀取設定檔
- 在
IPluginStartup
的ConfigureServices
方法中,使用ConfigurationBuilder
讀取設定檔。 - 例如:
- 在
var configBuilder = new ConfigurationBuilder()
.AddJsonFile(configFilePath, optional: false, reloadOnChange: false);
var configuration = configBuilder.Build();
- 使用設定
- 從
IConfiguration
中讀取設定值,並將其用於外掛的初始化邏輯。 - 例如:
- 從
var pluginSetting = configuration["TestPlugin"];
services.AddScoped<INotify>(provider => new SlackNotify(pluginSetting));
- 修改設定檔
- 修改設定檔後,重新啟動服務以加載新的設定。
注意事項
- 確保設定檔的路徑正確,並與外掛的目錄結構一致。
- 修改設定檔時,建議備份原始檔案以防止配置錯誤。
- 若設定檔格式不正確,外掛可能無法正常啟動。
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net7.0
- Microsoft.Extensions.Caching.Memory (>= 8.0.1)
- Microsoft.Extensions.Configuration.Binder (>= 8.0.2)
- Microsoft.Extensions.Configuration.Json (>= 8.0.1)
- Microsoft.Extensions.Logging.Console (>= 8.0.1)
- Microsoft.Extensions.Logging.Debug (>= 8.0.1)
- ScheduleTaskHelper.Notify (>= 1.0.7)
- ScheduleTaskHelper.Plugins (>= 1.0.7)
- ScheduleTaskHelper.Tasks (>= 1.0.7)
-
net8.0
- Microsoft.Extensions.Caching.Memory (>= 9.0.8)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.8)
- Microsoft.Extensions.Configuration.Json (>= 9.0.8)
- Microsoft.Extensions.Logging.Console (>= 9.0.8)
- Microsoft.Extensions.Logging.Debug (>= 9.0.8)
- ScheduleTaskHelper.Notify (>= 1.0.7)
- ScheduleTaskHelper.Plugins (>= 1.0.7)
- ScheduleTaskHelper.Tasks (>= 1.0.7)
-
net9.0
- Microsoft.Extensions.Caching.Memory (>= 9.0.8)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.8)
- Microsoft.Extensions.Configuration.Json (>= 9.0.8)
- Microsoft.Extensions.Logging.Console (>= 9.0.8)
- Microsoft.Extensions.Logging.Debug (>= 9.0.8)
- ScheduleTaskHelper.Notify (>= 1.0.7)
- ScheduleTaskHelper.Plugins (>= 1.0.7)
- ScheduleTaskHelper.Tasks (>= 1.0.7)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.