Бин, управляемый сообщениями, не отвечает, пока клиентский метод не завершен - PullRequest
1 голос
/ 27 апреля 2010

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

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

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

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

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

Заранее спасибо! PJ

1 Ответ

1 голос
/ 27 апреля 2010

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

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

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

...