2010-01-15 3 views
2

'ActiveMq로 간단한 pub/sub를하려고합니다. 나는 그것을 전부 잘 일할 수있다, 그러나 구내 구독자는 대략 30 초 후에 연결을 끊는다. 내가 변경할 수있는 시간 초과 유형을 찾았지만 아무 것도 작동하지 않는 것 같습니다.ActiveMq NMS는 약 30 초 후에 연결을 끊습니다.

using System; 
using Apache.NMS; 
using Apache.NMS.ActiveMQ; 
using Apache.NMS.ActiveMQ.Commands; 

namespace ActiveMQCatcher 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/"); 

      using (IConnection connection = factory.CreateConnection()) 
      { 
       connection.ClientId = "MYID"; 
       connection.Start(); 

       using (ISession session = connection.CreateSession()) 
       { 
        IMessageConsumer consumer = session.CreateConsumer(new ActiveMQTopic("MYTOPIC"), null, false); 
        consumer.Listener += consumer_Listener; 

        Console.ReadLine(); 
       } 

       connection.Stop(); 
      } 
     } 

     private static void consumer_Listener(IMessage message) 
     { 
      Console.WriteLine("Got: " + ((ITextMessage) message).Text); 
     } 
    } 
} 

나는이 시도 : 다음은 가입자

connection.RequestTimeout = TimeSpan.MaxValue; 

그러나 아무것도 변경하는 것 같지 않았어요.

문제를 해결하려면 프로그램을 실행하고 약 30 초 동안 기다리십시오. ActiveMQ Console에서 연결이 사라지는 것을 볼 수 있습니다 (기본값 : http://localhost:8161/admin/connections.jsp)

아이디어가 있으십니까?

답변

1

물론 질문을 게시 한 후 몇 분 후에 알아낼 수 있습니다. 여기에 다른 사람들이 찾는 답이 있습니다 :

NMS는 OpenWire를 사용하고 있고 OpenWire는 기본적으로 30 초의 시간 제한을 가지고 있습니다. \ conf \ ActiveMq.xml 파일에서이를 변경할 수 있습니다. 다음은 변경해야 할 사항입니다.

<transportConnectors> 
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=0"/> 
</transportConnectors> 

해당 wireFormat.maxInactivityDuration 매개 변수가 핵심입니다.

1

경고! maxInactivityDuration=0으로 설정하면 소켓이 절대로 죽지 않는 것처럼 보입니다. IConnectionCloseDispose을 호출해도 기본 연결과 실행중인 스레드가 여전히 남아 있습니다. 구현에 따라 메모리 누수가 발생할 수 있습니다. 연결 URL에 클라이언트 측에서

그러나 우리의 NMS 사용, 우리가 지정 wireFormat.MaxInactivityDuration = -1 , 그것은 대답이나 질문 (또는 2)의 이상이 있는지

+0

좋은 캐치. 지금은 누수의 가능성이 있음을 알고 이런 식으로 구현해야합니다. 아직도 더 나은 방법을 찾지 못했습니다. – Kelly

0

확실하지.

"-1"또는 "0"을 사용하여 동일한 효과가있는 것으로 보입니다. 원더, 차이점은 무엇입니까 ...

또한 흥미롭게도 서버 구성에는 아무 것도 지정하지 않지만 모든 JAVA 앱 연결은 관계없이 유지됩니다 (JAVA 클라이언트가 다른 기본값을 사용하기 때문입니다). OpenWire config.params 또는 smtng 용)

+0

좋아요, "-1"이 "0"과 같음을 알았습니다 http://activemq.apache.org/configuring-wire-formats.html –

1

NMS의 이전 버전을 사용하는 것과 같은 소리가 나고 최신 릴리스 (1.5.5)로 업데이트하면이 문제가 해결됩니다. 마지막 몇 가지 릴리스에서 모두 해결 된 장애 조치 및 비활성 모니터와 관련된 몇 가지 문제가있었습니다. 최신 버전은 잘 강화되었습니다.

팀 Fusesource.com

관련 문제