Регистрация глобального идентификатора в нескольких компонентах - PullRequest
2 голосов
/ 09 ноября 2009

У меня есть система, которая содержит несколько приложений, соединенных вместе с помощью JMS и Spring Integration. Сообщения отправляются по цепочке заявок.

[Приложение A] -> [Приложение B] -> [Приложение C]

Мы установили глобальный идентификатор в заголовке сообщения, чтобы можно было отслеживать каждый жизненный цикл сообщения в системе.

Я хотел бы иметь возможность добавлять любое сообщение журнала в системе к глобальному идентификатору сообщения.

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

Ответы [ 4 ]

2 голосов
/ 09 ноября 2009

Я думаю, что ThreadLocal может быть тем, что вам нужно, хотя некоторые могут посчитать, что этот подход является нарушением цели ThreadLocal или хорошим дизайном. Что-то вроде:

public class MyIDManager {
  public static final ThreadLocal<Long> myID = new ThreadLocal<Long>();
}

...
// set ID at some point
MyIDManager.myID.set(theNewID);

...
// read it later
long currentID = MyIDManager.get();

Волшебство здесь в том, что значение myID действительно специфично для потока и будет отличаться при доступе из разных потоков.

После этого вы можете делать с идентификатором все, что захотите, включая его регистрацию.

1 голос
/ 09 ноября 2009
Thread t = Thread.currentThread();
t.setName("Your ID Here");
0 голосов
/ 11 июля 2015

Кстати, этот подход является частью более широкой схемы ведения журнала предприятия. Я попытался задокументировать этот шаблон здесь . Резюме:

TL; DR

В самом начале «процесса» создайте идентификатор, который является комбинация «исходного идентификатора» и «уникального идентификатора». Это не бизнес связанный глобальный начальный ID (GIID), должен использоваться для каждого журнала вывод для обеспечения читабельности машины и использования инструмента. Когда каждый новый бизнес-уровень или операционный идентификатор получен или сгенерирован, это зарегистрирован, чтобы обеспечить "связь" с этим GIID. Это похоже на различные существующие практики, поэтому он представлен в виде программного дизайна Шаблон.

0 голосов
/ 09 ноября 2009

Другой ответ, на который, как я полагаю, ссылается в первом посте, состоит в том, чтобы просто попросить вашу среду ведения журналов включить имя потока в инструкцию log. Например, log4j позволяет вам добавить имя потока с 't' в его PatternLayout: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html Я видел это и в других платформах.

...