Я написал службу Windows, используя библиотеки Apache.NMS и Apcahe.NMS.ActiveMQ (версия 1.0). Служба использует сообщения ActiveMQ с сервера поставщика.
Служба устанавливает соединение и прослушивает сообщения (я обрабатываю событие OnMessage)
Соединение является транзакционным, поэтому я вызываю фиксацию после каждого сообщения.
Когда служба запускается, все работает очень хорошо и работает какое-то время. Однако по прошествии некоторого времени он больше не будет потреблять сообщения. Даже если я сброслю сервис. Обычно требуется перезапуск моей службы И сервера поставщика (tomcat), чтобы все снова заработало. Продавец настаивает на том, что с их стороны все в порядке.
Никаких исключений не возникает ни на одной стороне (клиентской или серверной) - он просто «застрял».
Стоит ли использовать Spring.Messaging.Nms?





Я обнаружил проблему. После установления соединения и прослушивателя сообщений служба вошла в цикл с Thread.Sleep (500). Тупой. Я реорганизовал службу, чтобы все запускалось в OnStart и удалялось в OnStop.
С тех пор все работает отлично.
Классическая ошибка ID-10-T между клавиатурой и стулом.
мы только что столкнулись с точно такой же проблемой при использовании службы .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);
}
Мой код немного отличается. Вместо опроса в цикле я установил прослушиватель, который реагирует на событие «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.;
}
Ничего, я нашел его здесь: