문제

WebSphere MQ 대기열에 메시지를 게시 한 다음 다른 대기열을 설문 조사하여 .NET Windows Forms Application을 작성하고 응답을 위해 다른 대기열을 폴링합니다. 응답이 반환되면 응용 프로그램은 응답을 실시간으로 부분적으로 처리합니다. 그러나 응답은 대기열에 머무르기 위해 대기열에 머물러 있어야하므로 응답 대기열에서 읽는 일일 배치 작업이 나머지 처리를 수행 할 수 있습니다.

나는 메시지를 읽는 것까지 얻었습니다. 내가 알아낼 수 없었던 것은 제거하지 않고 읽는 방법입니다.

내가 지금까지 얻은 것은 다음과 같습니다. 저는 MQ 초보자이므로 모든 제안에 감사드립니다. 그리고 C#에서 자유롭게 응답하십시오.

Public Function GetMessage(ByVal msgID As String) As MQMessage
    Dim q = ConnectToResponseQueue()
    Dim msg As New MQMessage()
    Dim getOpts As New MQGetMessageOptions()
    Dim runThru = Now.AddMilliseconds(CInt(ConfigurationManager.AppSettings("responseTimeoutMS")))
    System.Threading.Thread.Sleep(1000) 'Wait for one second before checking for the first response'
    While True
        Try
            q.Get(msg, getOpts)
            Return msg
        Catch ex As MQException When ex.Reason = MQC.MQRC_NO_MSG_AVAILABLE
            If Now > runThru Then Throw ex
            System.Threading.Thread.Sleep(3000)
        Finally
            q.Close()
        End Try
    End While
    Return Nothing 'Should never reach here'
End Function

노트: 내 코드가 실제로 메시지를 제거하는지 확인하지 않았습니다. 그러나 그것이 내가 MQ를 작동시키는 방법이며, 그것이 일어나고있는 것으로 보입니다. 그것이 기본 동작이 아닌 경우 저를 수정 해주세요.

도움이 되었습니까?

해결책

mqoo_browse 옵션으로 큐를 열어야합니다. 그런 다음 처음 읽을 때 MQGMO_BROWSE_FIRST 옵션을 사용하여 얻을 수 있습니다. 마지막으로, 후속 get 's는 mqgmo_browse_next 옵션을 사용해야합니다.

참고 : MQOO는 MQ 오픈 옵션이며 MQGMO는 MQ Get 메시지 옵션입니다.

다른 팁

당신은 실제로 별도의 줄을 가지고 이것을해야합니다. 하루 종일 처리에는 자체 대기열이 있어야합니다. 메시지의 일부를 처리 한 후에는 EOD 대기열로 보냅니다.

찾아보기 옵션을 사용하면 이미 어딘가에서 처리 한 메시지를 추적해야합니다.

또한 GET에서 대기 시간 초과를 설정할 수 있습니다. 따라서 "대기열을 확인하기 전에 1 초 기다릴 필요가 없습니다". 지금 작성된대로 GET 메시지 옵션에서 Nowait을 설정하지 않았기 때문에 사용 가능한 MSG 없음 조건을 누를 수 없습니다.

후손을 위해서, 여기에 Mamboking 및 Jmucchiello의 답변을 기반으로 한 방법의 훨씬 개선 된 버전이 있습니다.

Public Function GetMessage(ByVal correlID As Byte()) As MQMessage
    Dim waitInterval = CInt(ConfigurationManager.AppSettings("responseTimeoutMS"))
    Dim q As MQQueue = Nothing
    Try
        Dim msg As New MQMessage()
        Dim getOpts As New MQGetMessageOptions()
        q = ConnectToResponseQueue()
        msg.MessageId = MQC.MQMI_NONE
        msg.CorrelationId = correlID
        getOpts.MatchOptions = MQC.MQMO_MATCH_CORREL_ID
        getOpts.WaitInterval = waitInterval
        getOpts.Options = MQC.MQGMO_BROWSE_FIRST Or MQC.MQGMO_WAIT
        q.Get(msg, getOpts)
        Return msg
    Finally
        If q IsNot Nothing AndAlso q.IsOpen() Then q.Close()
    End Try
End Function

나는이 토론에 조금 늦게오고 있다는 것을 알고 있으며 아마도 당신은 이미이 앱을 코딩했을 것입니다. 수정해야 할 경우 또는 비슷한 일을 해야하는 다른 사람을 위해 몇 가지 관찰이 있습니다.

먼저 V7 QMGR 및 V7 WMQ 클라이언트 로이 작업을 수행 할 수 있다면 선호하는 솔루션입니다. V7에서 .NET 지원은 지지대에서 기본 제품의 일부로 이동되었습니다. 상당한 새로운 기능, 일부 버그 수정 및 더 나은 성능이 있습니다. 또한 V7에서는 Pub-Sub를 사용할 수 있습니다. 두 번째 관찰을하게됩니다.

원래 게시물의 설명을 바탕으로 Pub-Sub 에서이 작업을 수행했을 것입니다. 메시지를 넣는 앱은 하나만 넣을 필요가 있으며 주제에 넣는다는 것을 알 필요조차 없습니다. 실제로 메시지 제작자의 대기열처럼 보이게하는 주제에 대해 별명을 올릴 수 있습니다. 그런 다음 소비 앱은 구독하거나 두 개의 관리 구독을 만들 수 있으므로 게시 된 메시지가 지정된 두 개의 대기열로 이동할 수 있습니다. 그런 다음 앱에는 각각 전용 대기열이 있으며 프로듀서 및 배치 앱에는 코딩 변경이 관련이 없으며 구성 일뿐입니다. 물론 트랜잭션을 추진하는 앱은 메시지를 탐색하는 대신 실제로 메시지를 소비해야합니다.

여기의 장점은 다음과 같습니다.

  • 대기열이 메시지로 가득 차면 인덱싱이 디스크로 플러시되고 임계 값 이상으로 성능이 히트 할 수 있습니다. 따라서 현재 방법은 모든 것을 잘 확장하지는 않습니다.
  • Pub-Sub 메소드를 사용하면 실시간 또는 배치 앱 또는 둘 다의 여러 인스턴스를 가질 수 있으며 동일하거나 다른 QMGR에있을 수 있습니다. 스케일링은 쉽습니다.
  • 동일한 QMGR에 필요한 실시간 앱과 배치 앱 간의 종속성을 제거합니다.
  • 보다 투명한 관리. 실시간 대기열에 메시지가 쌓이는 경우 문제가 있다는 것을 알고 있습니다.

여기에 완전히 다른 몇 가지 문제도 있습니다. 이 중 하나는 quiescation 옵션을 사용하는 것입니다. 이것의 목적은 QMGR이 깨끗하게 종료 될 때이 옵션으로 인해 API 호출이 QMGR이 종료되고 있음을 나타내는 반환 코드로 끝나게한다는 것입니다. 이 옵션을 포함하지 않으면 QMGR이 두 개 이상의 연결된 앱을 사용하면 가능합니다. 절대 깨끗하게 폐쇄하고 강제로 내려 가거나 무차별 한 힘으로 과정을 죽여야합니다. 원칙적으로, 지원하는 모든 API 호출을 Quies하는 경우 항상 실패를 사용하십시오. 그것이 존재하는 이유는 XA 트랜잭션이 필요한 사람들을위한 것이지만 어떤 이유로 든 사용할 수는 없습니다. 이 시나리오에서는 Quiescing set 및 후속 Get 또는 Put 작업이없는 경우 Connect 및 First Get 또는 Put Call 사용이 실패합니다. 이로 인해 QMGR은 전체 GET/PIT 호출 세트가 완료 될 때까지 기다릴 수 있지만 다음 연결 또는 GET/PIT 용도가 QMGR이 필요한 경우 종료 할 수있는 기회가 있으면 실패합니다.

여기서 또 다른 관찰은 여기에 코드에 어획이 없다는 것입니다. 콜 스택에 더 이상 범위가 있다고 생각합니까? 근본 원인을 추적 할 수 있도록 WMQ 리턴 코드를 예외에서 인쇄하는 것이 항상 권장됩니다. 컨설팅 교전에서 나는 항상 고객에게 반환 코드를 인쇄하지 않으면 (또는 JMS/XMS 코드의 링크 된 예외)는 앱의 프로덕션 홍보를 방지 해야하는 ShowStopper입니다. 정말 중요합니다. getMessage ()을 호출하는 코드에 캐치가 있더라도 여기에서 예제 코드 스 니펫을 재사용하는 사람은이 중요한 부분이 누락되었다는 것을 알지 못할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top