Оказывается, мы думаем, что теперь мы немного больше знаем, о чем идет речь.
Когда наше приложение VB.NET WinForms, которое использует ActiveMQ DLL, в конечном итоге дает сбой, что обычно происходит несколько раз в неделю, у нас есть сторожевая программа, которая использует утилиты Winternals pslist и pskill, чтобы пожать зомби, и затем запустить новое клиентское соединение.
Когда это происходит, использование jconsole для анализа брокера показывает нам, что сессия зомби все еще зарегистрирована, как и новый новый клиент.
Моя теория сейчас такова: когда AMQ видит обе сессии, он пытается начать рассылку сообщений обоим сеансам в стиле циклического перебора. AMQ пытается отправить сообщение зомби, который не отвечает. Через определенное время (возможно, одну секунду) AMQ сдается и переходит к следующему сеансу в списке, новому новому клиенту.
В какой-то момент, брокер или стек TCP, вероятно, замечают, что зомби не сохранил активное соединение TCP, и он сдается; затем работа возвращается в нормальное состояние.
Таким образом, возникает вопрос, как написать клиент ActiveMQ, который а) не умирает или б) умирает грациозно, закрывая свой сеанс в процессе?
Редактировать: обновление до следующей версии ActiveMQ решило эту проблему. Кроме того, у нас было одно приложение, выполняющее отправку и получение, но оно не было поточно-ориентированным, поэтому, если оно получало при попытке отправки, это вызывало сбои. Мы переписали его как два консольных приложения, одно из которых отправляло данные, а другое - получало данные. Больше никаких сбоев. Кроме того, старая версия ActiveMQ, которую мы использовали в то время, не корректно обрабатывает сбои, обновление до 4.x решило эту проблему.