2012-02-19 6 views
4

이제는 동료가 로깅 하위 시스템에서 작업하고 일부 비즈니스 방법에서 시작된 별도의 작업을 바인드하려고합니다. 예를 들어, bean A의 메소드가 bean B의 메소드로 호출 한 다음 bean C에서 호출하면 bean B의 비즈니스 메소드보다 잘 알 수 있고 bean C는 bean A의 메소드에 대해 일부 staff를 수행합니다. 특히 B와 C의 메소드가 콩 A의 구체적인 호출을위한 작업 단위를 수행했다는 것을 알고있다.EJB3 상관 ID

그래서이 작업 단위를 어떻게 묶어서 합하는 것이 문제인가? 분명히 바인딩에 메소드 인자를 사용하는 것은 아름답 지 않습니다!

그리고 다른 질문을 할 때가되었다고 생각합니다. 이전 질문과 충분히 비슷합니다. A에서 호출 된 다른 빈에 A 컨텍스트 정보를 전파하려면 어떻게해야합니까? 보안 자격 증명 및 보안 주체와 같은 것이 있습니까? 내가 무엇을 할 수 있을지? 내가 묻는 질문이 어떤 종류의 나쁜 습관 일 수 있습니까?

답변

3

에 대한 유용한 사용 예 (LogbackLog4J 모두 사용 가능). 본질적으로 사용자 정의 값을 스레드에 첨부하고 해당 스레드에서 오는 모든 로깅 메시지는 해당 값을 메시지에 첨부 할 수 있습니다. 이제 당신이해야 할 모든이 추가됩니다

public class MdcInterceptor { 

    @AroundInvoke 
    public Object addMdcValue(InvocationContext context) throws Exception { 
     MDC.put("cid", RandomStringUtils.randomAlphanumeric(16)); 
     try { 
      return context.proceed(); 
     } finaly { 
      MDC.remove("cid"); 
     } 
    } 
} 

:

%X{user} 

를 로깅 패턴 (logback.xml 또는 log4j.xml

나는 가장 좋은 방법은 interceptor 될 것 EJB에서이를 구현하는 생각).

당신이 를 사용할 수있는 범용 컨텍스트 정보도

+0

감사! 내일 볼게. – gkuzmin

+0

로컬 EJB를 사용하는 한 그렇게해야합니다. Remote EJB를 사용하기 시작하면 ThreadLocal을 기반으로하는 모든 메소드가 실패합니다. – Bogdan

+0

아마도 '% X {user}'대신에'% X {cid} '을 (를) 의미했을 것입니다. – alesch

0

참조하십시오. 그것은이 같은 것을 볼 수 있었다 :

@Stateless 
public class MyBean { 

    @Resource 
    TransactionSynchronizationRegistry registry; 

    @AroundInvoke 
    public Object setEntryName(InvocationContext ic) throws Exception { 
     registry.putResource(NAME, "MyBean"); 
     return ic.proceed(); 
    } 
} 

@Stateless 
public class MyBean2 { 

    @Resource 
    TransactionSynchronizationRegistry registry; 

    public void doJob() { 
     String entryName = (String)registry.getResource(NAME); 
     ... 
    } 
} 

내가 보통 일반적으로 각 트랜잭션은 애플리케이션 서버에서 sigle 스레드에 매핑 등 ThreadLocal 변수를 사용하여 구현됩니다 생각합니다. 따라서 TransactionSynchronizationRegistry가 AS에 구현되지 않은 경우 (예 : JBoss 4.2.3) 또는 낮은 수준의 도구가 필요한 경우 ThreadLocal 변수를 직접 사용할 수 있습니다.

BTW MDC 유틸리티는 커버 아래에서 동일한 것을 사용합니다.