2012-04-22 5 views
1

어떻게 처리기의 현재 호출이 작업 대기열에서 호출되고 있는지 여부를 코드 내에서 확실히 감지 할 수 있습니까?작업 대기열에서 코드가 실행되고 있는지 여부를 안정적으로 감지하는 방법은 무엇입니까?

나는 내가 HttpServletRequest 객체를 선택하면 GAE/J에서, 나는 following headers이 설정되어 있는지 확인할 수 있습니다, 이해 :

  • X-AppEngine-QueueName
  • X-AppEngine-TaskName
  • X-AppEngine-TaskRetryCount
  • X-AppEngine-FailFast
  • X-AppEngine-TaskETA

여기서 이러한 헤더 중 하나가 있으면 핸들러가 태스크 큐에 의해 호출되고 있음을 나타냅니다.

하지만 탐지를해야하는 코드의 일부가 여러 추상화 레이어 내에 깊숙이 있습니다. 여기서는 HttpServletRequest 개체에 액세스 할 수 없으며 현재 실행 환경이 안정적인지 여부를 감지 할 수있는 방법이 있습니다. 작업 대기열에서 호출 되었습니까? 코드가 SystemProperty.environment.value() == Value.Development를 사용하여 GAE 또는 dev에 서버에서 실행되고 있는지 여부를 우리가 확인할 수있는 방법에

SystemProperty.environment.value() == Value.TaskQueue 

유사 : 내가 바라고 무엇

같은 쉽게 접근 할 뭔가가있을 수 있다는 것입니다.

+0

무엇이'doPost()'에서 헤더를 검사하고 그 결과를 추상화 된 로직에 전달하는 것을 멈추게 할 것인가? 'fromTaskQueue' 부울로? – alex

+0

@alex : 체크가 필요한 부분은 추상화 레이어 내에 너무 깊게 묻혀 있으며, 아키텍처를 느슨하게 결합하고 싶습니다. 변수를 전달하면 불행히도 유연성이 떨어집니다. –

+0

추상화 계층의 요점은 추상적입니다. 이런 종류의 추상화가 코드에서 깨지는 것을 피해야합니까? –

답변

0

요청 헤더에 X-AppEngine-TaskName이 있는지 여부를 확인한 결과, AlexR의 제안 덕분에 검사 결과가 스레드 로컬 변수에 저장되었습니다.

아래의 에릭 빌리거 (Eric Willigers)의 말에 따르면 Google은 이미 외부 요청으로부터 X-AppEngine-TaskName 헤더를 삭제하고 악의적 인 공격자가이 헤더를 가짜로 만든 것으로부터 앱을 보호하므로 이것이 지금까지 가장 안전한 접근 방법입니다.

+1

악의적 인 공격자가 X-AppEngine-TaskName 헤더를 설정하려고 시도하면 성공하지 못합니다. 요청이 애플리케이션에 도달하기 전에 사기성 헤더가 삭제됩니다. –

+0

@EricWilligers : 설명해 주셔서 감사합니다. –

-1

스택 추적 : new Throwable().getStackTrace()을 검사 해보십시오. StackTraceElement의 배열을 반환합니다. 배열을 반복 할 수 있고 대기열에서 호출 할 때 일반적인 class + 메소드를 식별 할 수 있습니다.

+0

이것은 가능한 접근법이며'Thread.currentThread(). getStackTrace()'를 사용하여'Throwable' 객체를 생성하지 않고 스택 추적을 얻을 수도 있습니다. 더 신뢰할 수있는 접근법을 찾고 있는데, 앞으로 Google에서 호출 단계를 변경하면이 접근법을 사용하는 검사가 잘못된 결과를 반환 할 수 있습니다. –

+1

HttpSession에 액세스 할 수있는 HttpFilter를 사용할 수 있습니다. 언급 한 속성을 추출하고 사용자 정의 플래그를 ThreadLocal에 넣을 수 있습니다. 그런 다음이 값을 HttpSession에 액세스 할 수없는 코드의 다른 위치에서 사용할 수 있습니다. – AlexR

+0

@AlexR : IMO 올바른 방법입니다. 그것을 대답으로 만들면, 나는 upvote 할 것이다. –

관련 문제