Приостановка между попытками сетевых подключений - PullRequest
0 голосов
/ 11 февраля 2009

Я пишу приложение для сервера JBoss Java EE. Я хотел бы иметь код надежного доступа к БД. Таким образом, я создал повторные циклы, чтобы запрос не сбился из-за временных проблем в сети. Теперь я бы хотел, чтобы выполнение запроса было приостановлено между попытками.

Поток сервера был порожден запросом к веб-службе Axis. Безопасно ли перевести поток сервера в спящий режим или для этого мне придется создавать собственный поток?

Ответы [ 3 ]

1 голос
/ 11 февраля 2009

Если вы пытаетесь подключить процесс к базе данных в случае, если соединение потеряно, вам лучше позволить JBoss обработать это для вас, просто определите ваш источник данных в JBoss, и он будет управлять пулом соединений для вас , проверяя соединения и отбрасывая те, которые больше не действительны, поэтому вы всегда получаете действительное соединение.

1 голос
/ 24 февраля 2009

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

Как правило, вы будете отлавливать любые ошибки отката на стороне клиента и обрабатывать попытки там. Но если вам действительно нужно ввести поведение «повторных попыток» на стороне сервера, я бы порекомендовал использовать MessageDrivenBeans для асинхронного выполнения этих операций. Когда клиент вызывает метод для вашего сессионного компонента, вместо запуска бизнес-логики конструирует и доставляет Сообщение JMS в локальную очередь. Это сообщение будет содержать имя вызываемого метода и карту параметров, переданных клиентом. Прослушивание этой очереди будет MDB, который деконструирует сообщение, чтобы либо напрямую выполнить бизнес-логику, либо сделать вызов сессионному компоненту для выполнения логики. При наличии отката транзакции сообщение отправляется обратно в очередь и позже доставляется в MDB.

Для обмена сообщениями JBoss 4.2.3 вы можете добавить следующие свойства к своему сообщению JMS, чтобы контролировать время доставки и время, которое JBoss должен ждать, чтобы повторно доставить сообщение после сбоя:

  • JMS_JBOSS_SCHEDULED_DELIVERY - принимает время доставки в миллис
  • JMS_JBOSS_REDELIVERY_DELAY - количество миллисекунд ожидания до повторной доставки

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

1 голос
/ 11 февраля 2009

Да, вы можете перевести поток в спящий режим, используя Thread.currentThread (). Sleep (XXX). Но вам следует ограничить количество попыток, в противном случае в случае продолжительной сетевой проблемы поток будет зависать так долго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...