Class JobContextBinder

java.lang.Object
com.easydesk.web.scheduler.JobContextBinder

@Component public class JobContextBinder extends Object
Quartz job 을 "system 사용자" 로 실행하기 위해 ThreadLocal context 들을 바인딩해 준다. 웹 요청은 filter(WebSecurityContextFilter / WebRequestContextFilter / WebTransactionContextFilter)가 세션 값을 ThreadLocal(SecurityContextHolder / RequestContextHolder / TransactionContextHolder)에 매 요청마다 바인딩해 주지만, Quartz job 은 Quartz worker thread 에서 돌기 때문에 이 context 가 하나도 없다. core 쪽(RequiredPermissionAspect, ArtifactizableFactory, OMWorkflow 등)은 이 세 context 를 그대로 읽으므로, 그대로 두면 job 안에서 OM 을 저장/수정할 때 NullPointerException 이 난다. 그래서 job 실행 동안만 LoginController 가 로그인 시 만드는 것과 같은 구성으로 context 를 만들어 바인딩하고, 끝나면(예외가 나도) 원래 상태로 되돌린다. Quartz 는 thread pool 을 재사용하므로 되돌리지 않으면 다음 job 이 이전 job 의 context 를 보게 된다 (SecurityContextHolder#clear() 주석 참고). 실행 사용자는 app.scheduler.run-as (UserEnum 이름, 기본 EASYDESK = system owner) 로 정한다.
  • Constructor Details

    • JobContextBinder

      public JobContextBinder(@Qualifier("moduleSecurityService") SecurityService moduleSecurityService, @Value("${app.scheduler.run-as:EASYDESK}") String runAs)
  • Method Details

    • runAsSystemUser

      public void runAsSystemUser(String jobName, JobContextBinder.JobTask task) throws Exception
      system 사용자(app.scheduler.run-as)의 Security / Request / Transaction context 를 바인딩한 상태로 task 를 실행한다. 끝나면 실행 전 상태로 복원한다 (원래 없었으면 제거).
      Parameters:
      jobName - traceId 에 넣을 job 이름 (로그/ActivitySet 추적용)
      task - 실행할 작업
      Throws:
      Exception - task 또는 context 구성 중 발생한 예외