생각의 표현들

Project/개인프로젝트

ThreadLocal적용하여 Thread 안에서의 값을 공유하기

ThreadLocal이란? 스레드의 Stack마다 정보를 따로 저장할 수 있는 공간입니다. ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에, 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있습니다. 내부적으로 HashTable의 구조를 갖고 있습니다. 스레드 전용 전역변수라는 느낌을 받았습니다. 사용 이유 Spring Integration을 사용하여 Message기반 이벤트 처리를 하고 있습니다. Command가 성공적으로 Transaction Commit을 성공하였을때 AOP를 활용하여 Event 처리를 하고 있습니다. 이때 Commit을 성공한 정보를 ThreadLocal에 저장하여 Event Channel로 보낼때 사용하였습니다. 궁금하시..

Project/개인프로젝트

[Spring Integration] Direct Channel과 Executor Channel 차이

Spring Integration을 사용하던중 메세지 기반 처리를 하기위해 비동기 처리를 해야했습니다. 기존에 사용하던 Direct Channel을 사용했을때 비동기 처리가 되지않아던 것을 해결하는 과정을 정리한 글입니다. Direct Channel point-to-point 채널이지만 PublishSubscribeChannel입니다. 구독자에게직접 메시지를 발송하지만, point-to-point채널이기에 하나의 endPoint에 message를 전송한다는 점에서 PublishSubscribeChannel과 다릅니다. 특히 중요한 점은 단일 스레드로 구현이 됩니다. 문제 원인 Direct Channel을 단일 스레드입니다. 그래서 해결한 방법은 gateway로 넘겨줄때 ThreadPool을 직접 설정하여..

Project/개인프로젝트

TransactionSynchronizationManager를 사용해 Transaction 이후에 Event 등록하기

Message기반의 이벤트 처리를 위해 Spring Integration을 적용하였습니다. Command는 DB를 조작할때 사용했고, Event는 DB이후에 데이터를 처리할때 사용하려고 합니다. 원하는것은 DB관련 로직의 Transaction이 성공적으로 커밋되면 Event를 발행하여 Event채널로 보내는 것입니다. 🎯데이터 베이스의 Trigger와 비슷한 개념입니다! 검색해보니 TransactionSynchronizationManager가 동기화 작업을 등록하고 이후의 처리한다는 것을 알았고 바로 적용해 보았습니다. 전체 흐름도 트랜잭션 동기화 하나의 실행 단위에서 모든 작업은 모두 성공하거나 실패해야 합니다. 이것을 원자성이라고부릅니다. 원자성을 지킬수 있게 하나의 Connection으로 모든 작업..

Project/개인프로젝트

ThreadLocal 초기화 에러

ThreadLocal을 사용하여 메세지 기반의 이벤트 처리를 하고 있었습니다. Command가 성공하면 ThreadLocal에 Event가 등록되고 Aop를 사용하여 Transaction이 성공될때만 ThreadLocal에 있는 Event를 가져와 처리하는 로직입니다. 하지만 예상치 못한 에러를 발견하였습니다. public class Events { private static ThreadLocal eventThreadLocal = new ThreadLocal(); private Events() { throw new IllegalStateException("Do not Initialize."); } public static void register(T event) { if (event == null) { ..

Sol b
'분류 전체보기' 카테고리의 글 목록 (10 Page)