2012-01-18 2 views
0

내 응용 프로그램은 각 호출의 고유 식별자를 추적해야하는 로깅 구성 요소를 사용합니다.자바 스레드의 고유 ID

출발점은 분명히 여러 클래스에 대한 일련의 메소드 호출을 시작하는 MDB입니다. 각 클래스는 log4j와 비슷한 새로운 logger-object를 작성하고이를 사용하여 이벤트를 데이터베이스에 기록합니다. 그리고 생성 된 로거 객체마다 고유 한 식별자가 할당됩니다. 이 식별자는 후속 호출이 모두 반환되고 내 MDB의 onMessage 메서드가 종료 될 때까지 스레드를 따라야합니다.

하나의 JmsMessage를 처리하는 동안 다른 메시지가 MDB에 수신되고 내 ID가 섞여서 문제가 발생합니다.

저는 책상을 머리에 대고 머리를 숙이고있었습니다. 나는 그 대답이 내 앞에 있다는 것을 알았지 만 아이디어가 있습니까? 첫 번째 작업이 완료되기 전에 다른 프로세스가 시작된 경우에도 "프로세스"가 자체 ID를 사용하여 기록 할 수 있도록하려면 어떻게해야합니까?

미리 감사드립니다.

답변

1

보통은 그러나 "친숙한"이름

String name = Thread.currentThread().getName(); 

를 사용하려면,이 어떤 고유하거나 경우에 고유 한 ID를 사용할 수 있습니다 의미 일 수 있습니다.

int id = Thread.currentThread().getId(); 
+0

대부분의 Java EE 서버는 요청을 처리하기 위해 스레드 풀을 사용하므로 메시지 당 스레드 ID가 고유하지 않습니다. –

+0

@Peter Lawrey'Thread.currentThread(). getName()'을 사용할 때,'weblogic.kernel.Default (self-tuning) '>'와 같이'Thread name : [ACTIVE] ExecuteThread :'4 ' 출력, 이것은별로 도움이되지 않습니다. 'Thread.currentThread(). getId()'는 두 자리수의 int를 제공하는데, 이것은 내가 찾고있는 것보다 약간 적습니다. – Morten

+0

스레드에 좀 더 의미있는 이름을 지정해야합니다. 자동으로하지 않으려면 의미있는 이름을 만들어야합니다. –

2

Message.getJMSMessageID()을 사용할 수없는 이유가 있습니까?

만약 있다면, AtomicLong.incrementAndGet() 만 있으면됩니다. 하나의 정적 인스턴스를 유지하고 MDB의 onMessage() 메서드는 메시지가 처리되는 동안 ID를 가져 와서 처리합니다 (아마도 ThreadLocal).

+0

문제는 실제로 ID를 얻는 것이 아니며 로거 객체를 만들 때 ID를 얻습니다. 문제는 각 스레드에 대해 ID를 일관되게 유지하는 것입니다. 아마 내가 의사 코드를 줄 경우 : 'onMessage() { log = LogFactory.getLogger(); messageHandler.processMessage(); } processMessage() { log = LogFactory.getLogger(); ... 메시지 처리 중 ... } 메시지 A가 처리 될 때까지 다른 메시지 B가 수신되었고 다른 ID가 생성되었습니다. MessageA를 처리하는 스레드는 여전히 첫 번째 ID를 사용해야하지만 두 번째 스레드는 두 번째 ID를 사용해야합니다. – Morten

+0

AtomicLong과 같은 것을 사용하더라도 프로세스간에 고유성을 제공하지 못하거나 프로세스 재시작 후에도 일부 값을 깎지 않고도 계속 살아남을 수 있습니다. 메시지 ID를 사용할 수 없으면 고유 한 스레드 식별자 (IP 주소 + 임의 UUID)를 작성하고 AtomicLong과 함께 사용하십시오. – philwb

+0

내 게시물에 형식이 잘못되어 불쌍히 여겨서 죄송합니다.) – Morten