后台程序针对不同客户,会定时有很多的数据交换,这些交换方式很多,有邮件,FTP,SFTP,网络调用等等,一般地对每个客户都有一个线程来定时处理。
这些连接并不总是稳定,会中断或者连接故障等。之前采用的方法是每个周期处理时记录一下当前时间,然后有一个线程定时检查 这些时间,太久远的判断成进程故障,然后重启整个程序
If JL.enable = "1" And JL.rst.AddHours(0.15) < Now Then
Res.idlist1 &= "JLPHY;"
ifrs = True
ElseIf msk.enable = "1" And msk.rst.AddHours(0.5) < Now Then
Res.idlist1 &= "MSK;"
ifrs = True
ElseIf kmt.enable = "1" And kmt.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "KMT;"
ifrs = True
ElseIf ckl.enable = "1" And ckl.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "CKL;"
ifrs = True
ElseIf MAT.enable = "1" And MAT.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "MAT;"
ifrs = True
ElseIf snl.enable = "1" And snl.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "SNL;"
ifrs = True
ElseIf cos.enable = "1" And (cos.rst.AddHours(0.5) < Now Or cose.rst.AddHours(0.1) < Now) Then
Res.idlist1 &= "COS;"
ifrs = True
ElseIf pil.enable = "1" And pil.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "PIL;"
ifrs = True
ElseIf pil.enable = "1" And pile.rst.AddHours(0.1) < Now Then
Res.idlist1 &= "PILE;"
ifrs = True
ElseIf ONEY.enable = "1" And ONEY.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "ONE;"
ifrs = True
ElseIf RCL.enable = "1" And RCL.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "RCL;"
ifrs = True
ElseIf CAI.enable = "1" And CAI.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "CAI;"
ifrs = True
ElseIf SKR.enable = "1" And SKR.rst.AddHours(2.5) < Now Then
Res.idlist1 &= "SKR;"
ifrs = True
ElseIf EMC.enable = "1" And EMC.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "EMC;"
ifrs = True
ElseIf HLC.enable = "1" And HLC.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "HLC;"
ifrs = True
ElseIf msc.enable = "1" And msc.rst.AddHours(0.6) < Now Then
Res.idlist1 &= "MSC;"
ifrs = True
ElseIf djs.enable = "1" And djs.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "DJS;"
ifrs = True
ElseIf ASL.enable = "1" And ASL.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "ASL;"
ifrs = True
ElseIf HMM.enable = "1" And HMM.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "HMM;"
ifrs = True
ElseIf tsl.enable = "1" And tsl.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "TSL;"
ifrs = True
ElseIf cul.enable = "1" And cul.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "CUL;"
ifrs = True
ElseIf NSL.enable = "1" And NSL.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "NSL;"
ifrs = True
ElseIf DYS.enable = "1" And DYS.rst.AddHours(0.9) < Now Then
Res.idlist1 &= "DYS;"
ifrs = True
End If
If ifrs Then
Try
Dim mydb As New DBCls(sdsmstr), selsql As String
selsql = "insert into ediloginfo(edi_type,adduser,addtime,rmk) values('RESTART','EUEMAIL','" & Format(Now, "yyyy-MM-dd HH:mm:ss") & "','" & Res.idlist1 & "')"
mydb.CmdExcTran(selsql)
mydb.close()
Catch ex As Exception
End Try
ReStart()
End If
Sub ReStart()
Application.Restart()
SEIcon.Dispose()
End Sub
现在发现当某个线程故障时不用每次都重启整个程序,只要重新建立这个线程就行了,这样不会影响其它线程的处理
If WHL.enable = "1" Then
If WHL.rst.AddMinutes(12) < Now Then
WHL.mytr.Stop()
WHL.mytr = New System.Timers.Timer(10000)
WHL.nowtr = False
With WHL.mytr
AddHandler WHL.mytr.Elapsed, AddressOf OnTimedEventWHL
.AutoReset = True
.Enabled = True
End With
ElseIf WHL.rst.AddMinutes(18) < Now Then
ifrs = True
Res.idlist1 &= "WHL;"
End If
End If
另外,对SFTP线程,我用的是SWCP的包,发现初次建立时留的间隔时间就要够长,这样可比较顺利地连接,减少阻塞。
经过这样的调整,发现各进程可不受干扰地有效快速运行,大大减少了程序的重启