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 은 다 중 스 레 드 개발 이 가능 하 며, 현재 사용 해 본 적 이 없 으 며, 앞으로 시간 이 있 으 면 잘 연구 해 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.