2012-06-09 4 views
3

작동하는이 코드를 작성했지만 MSMQ를 사용해야하는 방법을 생각하게되었습니다. 메시지 큐를 가져 오기 위해 "using"문을 사용해야합니까? Using 문을 사용하면 큐를 제거 할 때 처리 할 수 ​​있지만 끝내면 언제 끝낼 수 있습니까? 다시 사용할 수 있도록 내 MessageQueue 개체를 저장해야합니까? 이것은 ASP.Net 응용 프로그램에 있으며 같은 작업에서 동일한 대기열에 3 개의 메시지를 보내려고합니다. 객체를 저장하고 재사용하거나 작성하여 처리하십시오.MSMQ는 어떻게 사용해야합니까?

using (MessageQueue msgQueue = new MessageQueue(this.queueName)) 
{ 
    using (MessageQueueTransaction msgTx = new MessageQueueTransaction()) 
    {      
     Message recoverableMessage = null; 
     msgTx.Begin(); 
     try 
     { 
      recoverableMessage = new Message(); 
      recoverableMessage.Body = message; 
      recoverableMessage.Formatter = new BinaryMessageFormatter(System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, System.Runtime.Serialization.Formatters.FormatterTypeStyle.TypesAlways); 
      recoverableMessage.Recoverable = true; 

      msgQueue.Send(recoverableMessage, msgTx); 
      ////this.msgQ.Send(recoverableMessage, msgTx); //whats up here??? this will teach me for taking time off. not sure whuc I shuold use 
      msgTx.Commit(); 
      result = recoverableMessage.Id; 
      //recoverableMessage.Dispose(); 
     } 
     catch (Exception) 
     { 
      msgTx.Abort(); 
      ////recoverableMessage.Dispose(); 
     } 
     finally 
     { 
      if (recoverableMessage != null) 
      { 
       recoverableMessage.Dispose(); 
      } 
     } 
    } 
} 

답변

4

일반적으로 가능한 한 개체의 수명을 짧게 유지해야합니다. 이것은 .NET 가비지 수집자가 0 세대에서 1 세대로 해당 객체를 이동하는 것을 방지하기위한 것입니다. 이렇게하면 메모리 사용량을 줄일 수 있습니다. & 가비지 콜렉션 수.

메시지 큐 개체를 유지하는 유일한 이유는 단일 트랜잭션 또는 범위의 일부로 동일한 큐에 여러 메시지를 게시하는 것입니다.

단일 페이지 요청 중에 세 개의 메시지가 전송 된 경우 페이지를 렌더링 할 때마다 메시지 큐의 새 인스턴스를 만들고 메시지를 보내고 큐를 삭제합니다.

스레드 satefy 등은 설명서를 참조해야합니다에 대한 자세한 내용은 편집
.
예를 들어 MSDNGetAllMessages 메서드 만 스레드로부터 안전하다고 말합니다. 그런 다음 나머지 API는 스레드로부터 안전하지 않다고 가정합니다. 그러나이 경우 MessageQueue 개체의 단일 인스턴스에 여러 스레드가 동시에 액세스하면 안됩니다. 동일한 대기열을 가리키는 MessageQueue의 여러 인스턴스를 만들 수 있습니다.

실적과 관련하여 조기에 최적화하려고하는 것으로 보입니다. 나는 당신의 소프트웨어 (단지 릴리즈 빌드)를 프로파일 링하고 약간의 부하를 가하는 것을 제안한다. 그것이 신뢰할 수있는 대답을 얻는 유일한 방법입니다.

+0

감사합니다. 제 질문은 MSMQ에 관한 것입니다. 지정된 이름의 서버에 단 하나의 대기열이 있으므로 대기열에 대한 참조를 유지하는 데 장점이 있는지 또는 단점인지 궁금합니다. 당연히 나는 두포의 밑에 무슨 일이 일어나는지 이해하지 않는다. 대기열에 대한 참조를 얻는 것이 더 비쌉니까? 아니면 참조를 유지하는 것이 더 비쌉니까? 여러 스레드가 대기열의 인스턴스를 가져 와서 대기열에 쓰려고 시도 할 때 동시성 문제가 발생할 수 있습니다. – Noel

+0

@ 노르 - 내 대답 업데이트 –

관련 문제