Package com.easydesk.web.scheduler
Class JobContextBinder
java.lang.Object
com.easydesk.web.scheduler.JobContextBinder
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) 로 정한다.
-
Nested Class Summary
Nested Classes -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidrunAsSystemUser(String jobName, JobContextBinder.JobTask task) system 사용자(app.scheduler.run-as)의 Security / Request / Transaction context 를 바인딩한 상태로 task 를 실행한다.
-
Constructor Details
-
JobContextBinder
public JobContextBinder(@Qualifier("moduleSecurityService") SecurityService moduleSecurityService, @Value("${app.scheduler.run-as:EASYDESK}") String runAs)
-
-
Method Details
-
runAsSystemUser
system 사용자(app.scheduler.run-as)의 Security / Request / Transaction context 를 바인딩한 상태로 task 를 실행한다. 끝나면 실행 전 상태로 복원한다 (원래 없었으면 제거).- Parameters:
jobName- traceId 에 넣을 job 이름 (로그/ActivitySet 추적용)task- 실행할 작업- Throws:
Exception- task 또는 context 구성 중 발생한 예외
-