Imports System.Threading Imports System.Xml.Serialization Imports UTS_Core.Database Imports UTS_Core.UTSModule Imports UTS_Core.UTSModule.Service ''' ''' 数据库同步类 ''' Public Class DbSyncServiceTask Inherits ServiceTask Sub New() TaskType = ServiceTaskTypeEnum.DbSync TaskStatus = ServiceTaskStatusEnum.Stop TaskName = "DbSync_Default" Interval = 5 LocalDbType = UtsDb.LocalDbType LocalConnString = UtsDb.LocalConnString RemoteDbType = UtsDb.RemoteDbType RemoteConnString = UtsDb.RemoteConnString RemotePublicDb = UtsDb.RemotePublicDb RemotePrivateDb = UtsDb.RemotePrivateDb End Sub Sub New(name As String, param As Dictionary(Of String, String)) TaskType = ServiceTaskTypeEnum.DbSync TaskStatus = ServiceTaskStatusEnum.Stop TaskName = name LocalDbType = UtsDb.LocalDbType LocalConnString = UtsDb.LocalConnString RemoteDbType = UtsDb.RemoteDbType RemoteConnString = UtsDb.RemoteConnString RemotePublicDb = UtsDb.RemotePublicDb RemotePrivateDb = UtsDb.RemotePrivateDb SetParams(param) End Sub Private Sub StartCallback(stat As Object) While TaskStatus = ServiceTaskStatusEnum.Start '同步任务 Try Dim syncParam As DbSynchronizer.SyncParam syncParam.LocalConnString = LocalConnString syncParam.LocalType = LocalDbType syncParam.RemoteType = RemoteDbType syncParam.RemoteConnString = RemoteConnString syncParam.PublicDb = RemotePublicDb syncParam.PrivateDb = RemotePrivateDb '开始数据库同步 Dim sync As DbSynchronizer sync = New DbSynchronizer(syncParam) sync.SyncDatabase() ServiceLog.WriteInfoLog($"DbSynchronizer Succeeded!") '更新数据库更新时间 LastUpdateTime = $"{Now:yyyy-MM-dd HH:mm:ss}" Catch ex As Exception ServiceLog.WriteErrorLog($"TaskName:{TaskName},SyncDatabase Error:{ex.Message}") End Try '等待任务 Dim lastTime As Date = Now While (Now - lastTime).TotalMinutes < Interval If TaskStatus = ServiceTaskStatusEnum.Stop Then Return End If Thread.Sleep(1000) End While End While End Sub Public Overrides Sub Start() TaskStatus = ServiceTaskStatusEnum.Start If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then ServiceLog.WriteDebugLog($"SyncThread IsAlive!") Return End If _syncThread = New Thread(AddressOf StartCallback) _syncThread.IsBackground = True _syncThread.Start() ServiceLog.WriteDebugLog($"DbSync Start!") End Sub Public Overrides Sub [Stop]() TaskStatus = ServiceTaskStatusEnum.Stop Dim lastTime As Date = Now While _syncThread IsNot Nothing AndAlso _syncThread.IsAlive If (Now - lastTime).TotalMilliseconds > 10000 Then _syncThread.Abort() End If Thread.Sleep(100) End While ServiceLog.WriteInfoLog($"DbSync Stop!") End Sub Public Overrides Sub Restart() If _syncThread IsNot Nothing AndAlso _syncThread.IsAlive Then [Stop]() End If Start() ServiceLog.WriteInfoLog($"DbSync Restart!") End Sub Public Overrides Sub SetParams(params As Dictionary(Of String, String)) Dim tmpStatus As ServiceTaskStatusEnum = TaskStatus Dim tmpInterval As Integer = Interval '将转换后的数据填充至临时缓存,一遍设置失败时可以保留上一次数据 For Each param As KeyValuePair(Of String, String) In params Select Case param.Key Case "Interval" If Integer.TryParse(param.Value, tmpInterval) = False Then Throw New Exception($"Error Interval :{param.Value}") End If Case "LocalDbType" 'If [Enum].TryParse(param.Value, tmpLocalType) = False Then ' Throw New Exception($"Error LocalDbType :{param.Value}") 'End If Case "LocalConnString" 'tmpLocalConnString = UTS_Core.Security.Aes128.DecryptStr(param.Value, UTS_Core.Security.Aes128.ServerAesKey) Case "Status", "Type", "Name" '不处理的字段 Case Else ServiceLog.WriteWarningLog($"DbSync Unknown param name :{param.Key}") End Select Next TaskStatus = tmpStatus Interval = tmpInterval End Sub Public Overrides Function GetParams() As Dictionary(Of String, String) Dim params As New Dictionary(Of String, String) params.Add("Type", TaskType.ToString()) params.Add("Name", TaskName) params.Add("Status", TaskStatus.ToString()) params.Add("Interval", Interval.ToString()) params.Add("LocalDbType", LocalDbType.ToString()) params.Add("LocalConnString", UTS_Core.Security.Aes128.EncryptStr(LocalConnString, UTS_Core.Security.Aes128.ServerAesKey)) Return params End Function ''' ''' 远程数据库的类型 ''' Private RemoteDbType As DbExecutor.DbTypeEnum ''' ''' 远程数据库的连接字符串 ''' Private RemoteConnString As String ''' ''' 远端公共数据库名 ''' Private RemotePublicDb As String ''' ''' 远端私有库名 ''' Private RemotePrivateDb As String ''' ''' 本地数据库的类型 ''' Private LocalDbType As DbExecutor.DbTypeEnum ''' ''' 本地数据库的连接字符串 ''' Private LocalConnString As String ''' ''' 同步间隔,单位分钟,默认5分钟,最小值为1分钟 ''' ''' Public Property Interval() As Integer Private _syncThread As Thread ''' ''' 最后一次更新的时间字符串 ''' Public Shared LastUpdateTime As String = "" End Class