본문 바로가기
VB.net

이벤트 Retry(재시도) 로직 - 문자발송 포함

by 호야호잇 2020. 9. 28.
Imports System.IO

'======================================================
''< RepeatCall과 SendException 두개의 함수는 하나로 동작함으로 같이 있어야함 >
'======================================================
Module ReTry_Module
    ''' <summary>
    ''' RetryCount 이용하여 재시도 횟수 지정하고, WorkAction 이용하여 수행 할 동작을 설정함, 재시도 실패 시 문자 발송
    ''' </summary>
    ''' <param name="RetryCount">재시도 횟수</param>
    ''' <param name="WorkAction">시도할 동작<br/>
    ''' 사용예제 : RepeatCall(3, Function() Call_Action(True)) <br/><br/>
    ''' Function Call_Action(T As Boolean) <br/>
    '''If T = True Then <br/>
    '''(실제 이용할 이벤트 입력) <br/>
    '''End If <br/>
    '''End Function
    ''' <param name="SMS_Title">재시도 실패 시 발송될 SMS 타이틀 </param>
    ''' <param name="SMS_Message">재시도 실패 시 발송될 SMS 내용 </param>
    ''' </param>
    Public Sub RepeatCall(ByVal RetryCount As Integer, ByVal WorkAction As Action, ByVal SMS_Title As String, ByVal SMS_Message As String)
       
        Dim TryCount As Integer = 0
        Dim wasSuccessful As Boolean = False

        Do
            Try
                WorkAction()
                wasSuccessful = True
            Catch
                TryCount += 1
            End Try
        Loop Until wasSuccessful = True OrElse TryCount >= RetryCount

        '재시도 횟수만큼 진행했으나 실패한 경우 로직 동작
        If Not wasSuccessful Then
            SendException(SMS_Title, SMS_Message, "FailureLog", "01063485390", "01063485390")
        End If

    End Sub

    ''' <summary>
    ''' 원하는 내용으로 SMS발송 진행하며. 실패 시 실행경로 내 로그파일을 생성
    ''' </summary>
    ''' <param name="ProgramName">타이틀 입력</param>
    ''' <param name="Message">타이틀 포함 최대 90Byte 입력가능</param>
    ''' <param name="SaveFileName">발송 실패 시 로그 저장 될 파일명 지정</param>
    ''' <param name="SenderPhoneNum">발신자 번호 입력(최대 1개)</param>
    ''' <param name="ReciverPhoneNum">수신자 번호 입력(다중입력 시 번호 사이에 세미콜론(;)입력 필수</param>
    Public Sub SendException(ByVal ProgramName As String, ByVal Message As String, ByVal SaveFileName As String, ByVal SenderPhoneNum As String, ByVal ReciverPhoneNum As String)
        Try
            Dim Sender, ToCellPhoneNum, SendMsg As String
            Sender = SenderPhoneNum
            ToCellPhoneNum = ReciverPhoneNum  '발송하는휴대폰번호가 2개이상일 경우 휴대폰번호 사이에 ;(세미콜론)이 들어감
            SendMsg = $"[시스템통보] {vbNewLine}- 시스템명: {ProgramName}{vbNewLine}- 내용: {Message}{vbNewLine}- 시간: {Now}"

            Dim E_ToCellPhoneNum, E_SendMsg As String

            E_ToCellPhoneNum = Uri.EscapeDataString(ToCellPhoneNum) '인코딩
            E_SendMsg = Uri.EscapeDataString(SendMsg) '인코딩

            Dim DefaultURL As String = "http://114.svctop.com/SMS.aspx?__VIEWSTATE=%2FwEPDwUJMzUwODk5NjgzD2QWAgIDD2QWBgIFDxYCHglpbm5lcmh0bWwFFzAxMDYyNDI2MDUxLDAxMDYzNDg1MzkwZAIJDxYCHwAFR1vsi5zsiqTthZwt7Jik66WY7Ya167O0XQ0K67O07J2064qU7IOB64u0IOuPmeq4sO2ZlCDtlITroZzqt7jrnqgg7KKF66OMZAINDxYCHgRUZXh0BUw8ZGl2IGNsYXNzPSdzdHlsZTUnPkVycm9yIDAxMDYyNDI2MDUxLDAxMDYzNDg1MzkwIOuwnOyGoSDsl5Drn6whITxici8%2BPC9kaXY%2BZGT4PATQV5LGFbIIKeXWKf3%2FzJuk1Q%3D%3D&__VIEWSTATEGENERATOR=3995FEA5&__EVENTVALIDATION=%2FwEWBwKnutaUBgKu35naAwKPuYW%2BBwKF%2B%2FqxCwKJrqqqDQKrmr31CQKct7iSDDyjUIBYbnCsauNF2Ig07drZuBfi&hdTo=&hdFrom=&txtTo="
            Dim SendText As String = DefaultURL & E_ToCellPhoneNum & "&txtSender=" & Sender & "&txtContent=" & E_SendMsg & "&btnSave="

            Dim WinHttp As Object

            WinHttp = CreateObject("Winhttp.WinHttpRequest.5.1")

            WinHttp.Open("GET", SendText)
            WinHttp.Send()


        Catch ex As Exception
            '만약 문자발송 시스템이 에러날 경우 LocalPC에 파일을 떨굼

            Dim strPath As String = Application.StartupPath & "\" & SaveFileName & ".Log"

            Dim strTxt As String = vbNewLine & "===============(" & Now & ")==============" & vbNewLine & ex.ToString & vbNewLine

            If File.Exists(strPath) = True Then
                Dim sr As StreamReader = New StreamReader(strPath, System.Text.Encoding.UTF8) '인코딩 지정
                Dim str As String = ""
                Do While sr.Peek() >= 0
                    str = sr.ReadLine()
                Loop
                sr.Close()
                Dim objWriter As StreamWriter = New StreamWriter(strPath, True)   '파일이 존재하는 경우 파일덮어씌우기 위해 True 옵션을 줌
                objWriter.Write(str & strTxt)
                objWriter.Close()
            Else
                Dim objWriter As StreamWriter = New StreamWriter(strPath)
                objWriter.Write(strTxt)
                objWriter.Close()
            End If


        End Try


    End Sub
End Module

'VB.net' 카테고리의 다른 글

Key입력(VirtureKey and HardwareKey)  (0) 2021.03.31
Windows 암호정책 확인하는 Class (VB 버전)  (0) 2020.12.01
윤달 체크 로직  (0) 2020.09.28
전역 오류 확인 및 전달 로직  (0) 2020.09.24
오류 확인 로직_테스트중  (0) 2020.09.23