ActiveMQ .net клиент блокируется - PullRequest
1 голос
/ 06 ноября 2008

Я написал службу Windows, используя библиотеки Apache.NMS и Apcahe.NMS.ActiveMQ (версия 1.0). Служба принимает сообщения от ActiveMQ с сервера поставщика.

Служба раскручивает соединение и прослушивает сообщения (я обрабатываю событие OnMessage)

Соединение является транзакционным, поэтому я вызываю commit после каждого сообщения.

Когда служба запускается, все работает очень хорошо и делает это некоторое время. Однако после некоторого времени он больше не будет принимать сообщения. Даже если я сбросил сервис. Обычно для возобновления работы требуется перезапуск моей службы И сервера поставщика (tomcat). Продавец настаивает на том, что с их стороны все в порядке.

Нет исключений с обеих сторон (клиент или сервер) - он просто "застрял".

Должен ли я рассмотреть использование Spring.Messaging.Nms?

Ответы [ 4 ]

3 голосов
/ 14 ноября 2008

Я обнаружил проблему. После установления соединения и прослушивателя сообщений служба зациклилась на Thread.Sleep (500). Тупой. Я реорганизовал сервис, чтобы запустить все в OnStart и избавиться от него в OnStop.

С тех пор все работает отлично.

Классическая ошибка ID-10-T, возникающая между клавиатурой и стулом.

1 голос
/ 20 ноября 2008
1 голос
/ 20 ноября 2008

Мой код немного другой. Вместо опроса в цикле я настроил слушателя, который отвечает на событие «OnMessage». Мой код похож на код ниже. В моем настоящем коде много ненужных вещей, но дух тот же - надеюсь, это поможет.

factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");

connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)

consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg

consumer.Listener += new MessageListener(OnMessage);


private void OnMessage(IMessage message)
{
  //Process message here.;
}
0 голосов
/ 19 ноября 2008

Мы только что столкнулись с точно такой же проблемой, используя службу .Net, общающуюся с ActiveMQ, но наша блокируется только после доставки примерно 10-20 сообщений.

Пробовал с пружинными рамками и без них, и без них немного лучше (если только я не представляю).

Не могли бы вы проверить этот код и сообщить мне, имеет ли он какое-либо сходство с вашим собственным?

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");

Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();

Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");

MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);

for (int i = 0; i < 1000; i++)
{
    IMessage msg = consumer.Receive();
    if (msg != null)
        Console.WriteLine((msg as ITextMessage).Text);
}
...