2013-07-01 3 views
0

다소 지능적인 MQ 통신 모듈을 구현하기를 기대하고 있습니다.이 모듈은 네트워크 연결의 중단을 허용해야합니다. 기본적으로 연결이 끊어진 경우 5 초마다 다시 연결을 시도해야합니다.MQ로 다시 연결 - 문제

문제는 다음과 같습니다. 나는 독서에 대해 다음 코드를 사용

queueMessage = new MQMessage(); 
       queueMessage.Format = MQC.MQFMT_STRING; 
       queueGetMessageOptions = new MQGetMessageOptions(); 
       queueGetMessageOptions.Options = MQC.MQGMO_SYNCPOINT + MQC.MQGMO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING; 
       queueGetMessageOptions.WaitInterval = 50; 
       producerQueue.Get(queueMessage, queueGetMessageOptions); 
       msg = queueMessage.ReadBytes(queueMessage.MessageLength); 

(물론 내가 성공적 등 전에 여기서 queueManager에 연결)
나는 다음과 같은 문제를 가지고 :이 루틴을 실행하지만, .Get시 아무런 관련이 없을 때 , 코드는 단순히 멈추고 .Get에 머물러 있습니다. 타이머를 사용하여 시간 제한이 있는지 (이론적으로 필요하지 않아도되는 것은 맞습니까?) 시간 초과시 재 연결을 시도합니다. 하지만이 시간 초과가 만료되면 queuemanager가 연결되었음을보고하고 명확하게 연결되어 있지 않음을 알 수 있습니다 (물리적 연결이 더 이상 존재하지 않음). SYNCPOINT를 사용하기 때문에이 문제가 발생했습니다. 작성 중에 연결을 끊을 때도 마찬가지입니다.이 경우 queuemanager에서 연결 끊기를 시도합니다. 제발 도와주세요, GetPut에 갇히지 않도록하려면 어떤 설정을 사용해야하며 MQException을 던지거나 제어 할 수 있도록 설정해야합니까? 감사합니다.

업데이트 : 다음 코드를 사용하여 QueueManager에 연결했습니다.

Hashtable props = new Hashtable(); 
props.Add(MQC.HOST_NAME_PROPERTY, Host); 
props.Add(MQC.PORT_PROPERTY, Port); 
props.Add(MQC.CHANNEL_PROPERTY, ChannelInfo); 
if(User!="") props.Add(MQC.USER_ID_PROPERTY, User); 
if(Password!="") props.Add(MQC.PASSWORD_PROPERTY, Password); 
props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); 

queueManager = new MQQueueManager(QueueManagerName, props); 
producerQueue = queueManager.AccessQueue(
ProducerQueueName, 
MQC.MQOO_INPUT_AS_Q_DEF     // open queue for input 
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping 
consumerQueue = queueManager.AccessQueue(
ConsumerQueueName, 
MQC.MQOO_OUTPUT + MQC.MQOO_BROWSE + MQC.MQOO_INPUT_AS_Q_DEF     // open queue for output 
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping 

정상적으로 코드가 정상적으로 작동한다고는 할 수 없습니다. 읽기/쓰기, 연결/끊기가 정상적으로 작동하므로 현재 문제를 파악해야합니다. 감사합니다.

+0

전체 코드를 표시 할 수 있습니까? 재 연결 옵션은 연결이 생성되는 동안 설정됩니다. 즉 qm = new MQQueueManager ("", options); – Shashi

+0

당신의 의견을 기다리며 방금 업데이트했습니다! – user1771386

답변

2

어떤 MQ 버전을 사용하고 있습니까? 자동 재 연결이 작동하려면 큐 관리자가 적어도 MQ v701에 있어야하고 MQ .NET 클라이언트는 MQ v7.1 레벨이어야합니다.

MQ v7.1 .NET 클라이언트를 사용한다고 가정하고 연결 작성 중에 다시 연결 옵션을 지정해야합니다.

props.Add(MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT); 

재 연결은 mqclient.ini 파일에서도 활성화/비활성화 할 수 있습니다.

하지만 놀라운 것은 네트워크 연결이 없을 때 Get/Put이 멈추는 이유입니다. 응용 프로그램과 동일한 시스템에서 실행중인 큐 관리자를 연결하지 않기를 바랍니다. 타이머 등을 설정할 필요가 없습니다. MQ 호출을 실행할 수 있으며 연결에 문제가 있으면 예외가 발생합니다.

업데이트 :

난 당신이 MQQueueManager 클래스의 IsConnected 속성에 언급하는 것 같아요. 이 등록 정보의 값은이 등록 정보의 값을 나타냅니다. "참인 경우, 대기열 관리자와의 연결이 이루어졌으며 중단되지 않았 음을 알 수 있습니다. IsConnected에 대한 호출은 적극적으로 대기열 관리자에 도달하려고 시도하지 않으므로 물리적 연결이 중단 될 수 있지만 IsConnected 상태는 여전히 true를 반환 할 수 있음 IsConnected 상태는 메시지 (예 : 메시지 가져 오기)를 큐 관리자에서 수행 할 때만 업데이트됩니다 .. false 인 경우 큐 관리자에 연결하면 만들어지지 않았거나 부서 졌거나 연결이 끊겼습니다. "

True 값을 볼 수 있다고해서 연결이 계속 켜져있는 것은 아닙니다. 내 제안은 메서드를 호출하고, Put/Get 및 throw 된 예외를 처리하는 것입니다.

걸기/받기/끊기 전화 걸기가 문제가되는 것 같습니다. 내 제안은 IBM과 PMR을 높일 것입니다.

+0

타이머는이 경우 실제 시간 초과 측정 대신 디버깅 용으로 만 사용되었습니다. 물론 원격 MQ 서버에 연결합니다. 정말 놀랍습니다. 네트워크를 끊고 queuemanager의 연결 상태를 확인하면 사실입니다 (더 이상 연결되어 있지 않은 반면). 실제로 확인할 수 없기 때문에 문제가 발생합니다. . 또한이 경우 연결을 끊으려고하면 예외가 throw되지 않고 멈 춥니 다. – user1771386

+0

위의 업데이트를 참조하십시오. – Shashi

+0

저는 실제로 이전 버전으로 되 돌리지 않을 생각입니다. 그리고이 기능을 구현하려고합니다. 그런 다음 쿼리를 새로운 작업으로 시작하기 만하면 특정 시간 초과 후 죽일 수 있습니다. 연결이 끊어진 것입니다. 이전의 "조건"과 데이터 (쓰기가 시도 된 경우)를 저장할 수 있으며 나중에 다시 연결을 시도합니다. – user1771386