Spring 과 다 중 스 레 드

3590 단어 spring
프롤로그 배경
새로운 프로젝트 를 하고 있 습 니 다. 중간 부품 의 프로젝트 로 서 주로 데이터 서 비 스 를 합 니 다.이번 에는 프로젝트 를 간결 하 게 하려 고 합 니 다. 이전에 사 용 했 던 어떤 ActiveMq 등 미들웨어 제품 을 이번 에는 모두 사용 하지 않 고 스스로 실현 할 수 있 으 면 스스로 실현 하 겠 습 니 다.스스로 BlockingQueue 로 대기 열 을 막 고 자신의 데이터 양 에 따라 1G 메모리 에 도 2 천 여 만 개의 데 이 터 를 저장 할 수 있 습 니 다.디자인 에 있어 서 하나의 스 레 드 가 대기 열 에서 데 이 터 를 가 져 오 는 것 을 막 아야 합 니 다. 시스템 이 시 작 될 때 가 져 가 야 합 니 다.데이터 가 올 때 까지 차단 합 니 다.우선, spring 프로젝트 에서 사용자 정의 New 대상 과 스 레 드 는 spring 관 리 를 받 지 않 습 니 다.그래서 예전 의 처리 에서 하나의 예 를 써 서 응용 프로그램 Context 를 가 져 오 는 방식 이 가능 했다.하지만 주 해 를 쓸 때 는 이런 방식 을 사용 하면 추 해 보인다.그래서 우 리 는 스 레 드 를 사용 할 때 예전 처럼 우리 가 필요 로 하 는 bean 을 자동 으로 주입 할 수 있 기 를 바 랍 니 다.
시작 하 다
아니면 실제 프로젝트 로 밤 을 들 까?데이터 서비스 로 서 입 구 는 웹 서비스의 인터페이스 입 니 다. 역사적 인 이유 로 soap 방식 을 사용 합 니까?입 구 는 다음 과 같 습 니 다.
      @WebMethod
        public FeedResult send(NocPacket nocPacket) {
                logger.info("Receive data");
                QueueManager.getInstance().put(nocPacket,Const.nocQueue);
                return "successful";
        }

여 기 는 생산자 와 소비자 의 모델 을 사용 합 니 다. 그 중의 Const. nocQueue 는 우리 의 BlockingQueue 로 데이터 버퍼 로 사용 합 니 다.그렇다면 소비자 가 한 명 더 있어 야 한다.전에 말 했 듯 이 우 리 는 시스템 이 시 작 될 때 quue 에서 우리 의 데 이 터 를 찾 고 있 으 면 꺼 내 업무 처리 로 서 막 히 지 않 으 면 데이터 가 오 기 를 기다 리 고 있다.동시에 데 이 터 를 받 은 후 이 데 이 터 를 입고 합 니 다.두 가지 종류 가 필요 합 니 다. 하 나 는 시스템 과 함께 시작 되 는 것 입 니 다. 데 몬 이 라 고 부 르 세 요.다른 하 나 는 주 업무 다.데 몬 코드:
/**
 * Created by Wl on 15-6-17.
 *      
 */

@Component
public class Business  {
        private Logger logger = Logger.getLogger(Business.class);

        @Autowired
        private FlowDataService<FlowData> flowDataService;

        public void doBusi() {
                logger.info("      ");
                ExecutorService executor = Executors.newCachedThreadPool();
                BusiTask task = new BusiTask(Const.nocQueue,flowDataService);
                executor.submit(task);
                FlowData data = flowDataService.queryById(1);
                logger.info("Get Data :"+data.getPlateNo());
        }
}

업무 처리 클래스:
/**
 * Created by Wl on 15-6-17.
 *        
 */
public class BusiTask implements Callable<BlockingQueue<NocPacket>> {
        private Logger logger = Logger.getLogger(BusiTask.class);
        private BlockingQueue<NocPacket> queue;
        private FlowDataService<FlowData> flowDataService;

        public BusiTask(BlockingQueue<NocPacket> queue,FlowDataService<FlowData> flowDataService) {
                this.queue = queue;
                this.flowDataService = flowDataService;
        }

        public BlockingQueue<NocPacket> call() throws Exception {
                NocPacket nocPacket = queue.take();
                logger.info("Data:"+nocPacket.getGWName());
                Payload sc = NocUtil.getPayload(nocPacket);
                FlowData data = new FlowData();
                flowDataService.add(data);
                logger.info("      ");
                return null;
        }
}

데 몬 은 시스템 과 함께 시 작 됩 니 다. 이 점 은 spring 으로 설정 할 수 있 습 니 다.이 데 몬 은 특수성 이 있어 서 는 안 됩 니 다. 이것 은 우리 가 자체 적 으로 만 든 스 레 드 일 수도 없고 new 방법 일 수도 없습니다. 다시 doBusi 를 호출 할 수도 없습니다. 그러면 spring 관 리 를 받 지 않 기 때 문 입 니 다.그것 의 첫 번 째 목적 은 주입 한 서 비 스 를 받 는 것 이다.이 두 가지 유형 은 Future 와 Callable 방식 으로 비동기 스 레 드 처 리 를 합 니 다.Busi Task 의 임 무 를 직접 처리 하면 quue 의 take 에 막 힐 것 입 니 다.아울러 데 몬 을 통 해 부시 태 스 크 도 서 비 스 를 받 아 입고 등 을 할 수 있다.
엔 딩
spring 은 다 중 스 레 드 개발 이 가능 하 며, 현재 사용 해 본 적 이 없 으 며, 앞으로 시간 이 있 으 면 잘 연구 해 보 세 요.

좋은 웹페이지 즐겨찾기