ActiveMQ .net клиент блокируется
Вопрос
Я написал службу Windows с использованием библиотек Apache.NMS и Apcahe.NMS.ActiveMQ (версия 1.0). Служба использует сообщения от ActiveMQ с сервера поставщика.
Служба раскручивает соединение и прослушивает сообщения (я обрабатываю событие OnMessage)
Соединение является транзакционным, поэтому я вызываю commit после каждого сообщения.
Когда служба запускается, все работает очень хорошо и работает некоторое время. Однако после некоторого времени он больше не будет принимать сообщения. Даже если я сбросил сервис. Обычно для возобновления работы требуется перезапуск моей службы И сервера поставщика (tomcat). Продавец настаивает на том, что с их стороны все в порядке.
Нет исключений с обеих сторон (клиент или сервер) - он просто "застрял".
Стоит ли использовать Spring.Messaging.Nms? Р>
Решение
Я обнаружил проблему. После установления соединения и прослушивателя сообщений служба зациклилась на Thread.Sleep (500). Тупой. Я реорганизовал сервис, чтобы запустить все в OnStart и избавиться от него в OnStop.
С тех пор все работает отлично.
Классическая ошибка ID-10-T, возникающая между клавиатурой и креслом.
Другие советы
Не берите в голову, я нашел это здесь:
Обработка транзакционных сообщений с помощью ActiveMQ и NMS а> р>
Мой код немного отличается. Вместо опроса в цикле я настраивал слушателя, который отвечает на «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);
}