Вопрос

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

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

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

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

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

Стоит ли использовать Spring.Messaging.Nms?

Это было полезно?

Решение

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

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

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

Другие советы

Мой код немного отличается. Вместо опроса в цикле я настраивал слушателя, который отвечает на «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.;
}

Мы только что столкнулись с точно такой же проблемой, используя службу .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);
}
scroll top