2010-07-30 4 views
1

Есть ли какой-нибудь опрятный способ сохранить одно и то же имя потока при вызове RMI? На данный момент, если у меня есть именованный поток, который вызывает вызов RMI, на стороне сервера вызова RMI, Thread.currentThread().getName() возвращает что-то не освещающее, как «RMI TCP Connection (4) -10.0.0.2».Сохранение одного и того же имени потока над RMI

Конечно, я мог бы добавить и добавить ко всем моим методам RMI параметр String callingThreadName и сделать первую строку реализации каждого метода RMI Thread.currentThread().setName(callingThreadName), но это вряд ли самый простой способ сделать это. Есть ли способ получить хотя бы часть смысла имени потока, переданного через соединение RMI?

+0

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

+0

Как полагает ниже Ромайн, в основном отслеживать потоки последовательно в разных файлах журналов. Система представляет собой распределенное вычисление - каждый рабочий компьютер создает один объект, содержащий метод, который вызывается несколькими потоками от ведущего, чтобы выполнить фактическое вычисление. Из-за характера вычислений потоки должны идти назад и вперед между мастером и рабочими, поэтому начало потоков на рабочем месте оставило бы меня с той же проблемой на хозяине. – Scott

ответ

0

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

1

Что вы пытаетесь сделать, это соотнести действия в разных процессах при просмотре файлов журнала. Лучший способ сделать это - добавить уникальную transaction_id в ваш RPC, который используется именно для этой цели. Это позволяет отслеживать поток через систему.

+0

Существует уникальный идентификатор транзакции, но он частично основан на имени потока (и сгенерирован на сервере). Даже если отдельная была создана и добавлена ​​к вещам, которые были переданы, как это будет улучшением для решения, предложенного в исходном вопросе (если что-нибудь, это будет дополнительный параметр для перетаскивания в вспомогательные методы, тогда как имя потока приходит «бесплатно»). – Scott

+0

@Scott Темы обычно объединяются и, кроме того, если вы используете RMI, вы работаете с несколькими процессами. Невозможно сохранить синхронизацию ThreadID, если вы не передадите значение вызываемому абоненту для изменения имени Thread. Кроме того, поскольку вы работаете в ThreadPool, вам нужно будет указать имя для каждого вызова. Нет никакой пользы от попыток сделать это в любом случае. Передайте идентификатор транзакции с вашими вызовами и в своей учетной записи, затем установите переменную ThreadLocal, если хотите, и используйте это. забудьте о имени или имени темы. –

Смежные вопросы