后台程序线程的数据连接的检查和恢复

后台程序针对不同客户,会定时有很多的数据交换,这些交换方式很多,有邮件,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的包,发现初次建立时留的间隔时间就要够长,这样可比较顺利地连接,减少阻塞。

经过这样的调整,发现各进程可不受干扰地有效快速运行,大大减少了程序的重启

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值