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