2012-12-13 3 views
5

방금 ​​ActiveMQ로 시작했고 몇 가지 질문이있었습니다..Net NMS.ActiveMQ 세션과 메시지 전송 사이의 연결을 저장해야합니까

내가 지금 무슨 짓을

ActiveMQ를

를 사용하여 메시지를 보내야합니다 :

public class ActiveMQSender 
{ 
    private readonly Uri connectionUri; 
    private readonly IConnectionFactory connectionFactory; 

    private readonly string destinationName; 

    public ActiveMQSender() 
    { 
     this.connectionUri = new Uri("activemq:tcp://localhost:61616"); 
     this.connectionFactory = new NMSConnectionFactory(this.connectionUri); 
     this.destinationName = "queue://testQ"; 
    } 

    public void Send(string msg) 
    { 
     using (var connection = this.connectionFactory.CreateConnection()) 
     using (var session = connection.CreateSession()) 
     { 
      var destination = SessionUtil.GetDestination(session, this.destinationName); 

      using (var producer = session.CreateProducer(destination)) 
      { 
       connection.Start(); 
       var message = session.CreateTextMessage(msg); 
       producer.Send(message); 
      } 
     } 
    } 
} 

생성자 매개 변수로 주입 될이 클래스의 인스턴스가 하나만있을 것입니다.

메시지가 자주 전송되므로 (10 초당 하나의 메시지 이상) 연결, 세션 또는 제작자 인스턴스를 재사용해야합니까? 연결 실패? 그러한 시나리오에서 일반적인 패턴은 무엇입니까?

답변

2

Java 클라이언트와 같은 NMS.ActiveMQ는 연결이 끊어지면 브로커에 자동으로 다시 연결을 시도하는 장애 조치 전송을 제공합니다. 이를 사용하여 오류 처리 코드를 최소화 할 수 있습니다. AMQ에서 장애 조치 전송에 관한 주제로 Google 검색을 수행하십시오.

연결 및 관련 리소스를 다시 만드는 것은 간단한 작업이 아니므로 캐시해야하며 필요할 때만 다시 사용할 수 있습니다. 페일 오버와 함께 동일한 MessageProducer를 안정적으로 반복적으로 사용할 수 있습니다.

NMS의 모델은 JMS와 거의 동일하므로 JMS에서 일부 읽기를 수행하면 계몽을 제공해야합니다.

1

아마 NMS를 사용하고 계시겠습니까? 제안 사항으로는 차단 대기열을 사용하여 메시지를 차단 한 다음 일괄 처리로 n 개의 메시지 묶음을 보내는 것이 좋습니다. 그런 다음 코드를 보관하고 연결 및 세션과 생산자를 처리하는 동안 일괄 처리를 게시 할 수 있습니다 작업을 마쳤을 때 ...

연결이 실패한 경우 예외 리스너를 세션에 연결하여 문제를 알릴 수 있어야합니다.