Компонент, управляемый сообщениями, не отвечает до завершения клиентского метода

У меня есть MDB, развернутый на Jboss 4.2.2, и клиент на том же сервере, который создает сообщения и ожидает ответа от MDB через временную очередь, созданную до отправки сообщения.

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

Если я запускаю тот же клиент с удаленного сервера, у меня нет проблем... MDB сразу забирает сообщение из очереди, и клиент получает свой ответ сразу после завершения обработки.

Я использую транзакции, управляемые контейнером. Я подозреваю, что это как-то связано с этим... Я думаю, что "отправить сообщение/получить ответ" клиента можно было бы считать транзакцией до того, как он поместит сообщение в очередь... но я не уверен, что это верно. Если это так, то почему я не видел такого же поведения удаленного клиента? является ли транзакция, управляемая клиентом, настройкой по умолчанию, и это то, что использовал мой удаленный сервер?

Есть идеи, как это исправить?

Заранее спасибо! ПиДжей


person poijoi    schedule 27.04.2010    source источник


Ответы (1)


Похоже, здесь есть две проблемы. Во-первых, сообщение запроса не фиксируется при отправке и, вероятно, находится в той же единице работы, что и вызов получения. Как вы заметили, ключ здесь будет заключаться в том, чтобы определить, почему поведение меняется при удалении. Либо явно зафиксируйте отправленное сообщение.

Вторая проблема заключается в том, что сообщение в конечном итоге фиксируется по истечении времени ожидания. Устранение первой проблемы превратит ее в скрытую проблему, которая будет казаться исправленной, но вернется, чтобы укусить вас позже. Поведение может различаться в зависимости от того, считает ли поставщик транспорта это исключение или нет. В идеале тайм-аут считается исключением, и транзакция откатывается. Предполагая, что вы можете справиться с отправкой сообщения запроса, единственной транзакцией, на которую распространяется тайм-аут, является получение ответа, что вы определенно не хотите приводить к фиксации после тайм-аута. или другое исключение.

Извините, у меня нет более определенного ответа. Сохраните свое согласие для того, кто это делает, но следит за границами транзакций при получении.

person T.Rob    schedule 27.04.2010
comment
Привет. Спасибо за ответ. Пытаясь упростить свое объяснение, я опустил детали, которые я вижу сейчас. Клиент при локальном запуске запускается из EJB 3.0. Я создал удаленный интерфейс, к которому я получаю доступ из простого приложения командной строки, и EJB отправляет сообщения в очередь. Когда я помещаю session.commit, я получаю исключение о том, что его нельзя использовать в XASession. Может быть, я не могу использовать транзакции внутри EJB? - person poijoi; 27.04.2010