storm 에서 볼트 가 emit 와 같은 유형의 메 시 지 를 여러 번 보 냅 니 다.

3040 단어 빅 데이터
storm 의 Bolt 에서 논 리 를 처리 한 후 뒤의 Blot 에 메 시 지 를 계속 보 낼 수 있 습 니 다.
여러 개의 다른 메 시 지 를 보 낼 수 있 습 니 다. 예 를 들 어:
collector.emit("update-delivered-status",new Values(emailDeliverStatus));

collector.emit("save-request",new Values(udsn));

같은 유형의 메 시 지 를 여러 가지 다른 내용 으로 보 낼 수도 있다.
for (int i = 0; i < emailParamVo.getReceiverNum(); i++) 
			{
				EmailDeliverStatus emailDeliverStatus = new EmailDeliverStatus();
				emailDeliverStatus.setCategoryId(emailParamVo.getCategoryId());
				emailDeliverStatus.setUpdateTime(emailParamVo.getUpdateTime());
				emailDeliverStatus.setStatus(emailParamVo.getEventType());
				emailDeliverStatus.setUserId(emailParamVo.getUserId());
				emailDeliverStatus.setMessageDetail(emailParamVo.getMessageDetail());
				
				StringBuilder receiverBuilder = new StringBuilder(emailParamVo.getReceivers());
				receiverBuilder = receiverBuilder.deleteCharAt(0);
				receiverBuilder = receiverBuilder.deleteCharAt(receiverBuilder.length()-1);
				String[] receivers = receiverBuilder.toString().split(" ");
				String receiver = receivers[i];
				emailDeliverStatus.setEmailId(emailParamVo.getEmailIdPre() + i + "$" + receiver);
				emailDeliverStatus.setReceiver(receiver);
				collector.emit("update-delivered-status",new Values(emailDeliverStatus));
			}

위의 쓰기 방법 은 문제 가 없습니다. for 순환 에서 보 내 는 대상 은 매번 새로운 인 스 턴 스 이기 때 문 입 니 다. 그러나 인 스 턴 스 를 만 드 는 동작 을 밖으로 내 놓 으 면 다음 과 같 습 니 다.
EmailDeliverStatus emailDeliverStatus = new EmailDeliverStatus();
			emailDeliverStatus.setCategoryId(emailParamVo.getCategoryId());
			emailDeliverStatus.setUpdateTime(emailParamVo.getUpdateTime());
			emailDeliverStatus.setStatus(emailParamVo.getEventType());
			emailDeliverStatus.setUserId(emailParamVo.getUserId());
			emailDeliverStatus.setMessageDetail(emailParamVo.getMessageDetail());
			
			for (int i = 0; i < emailParamVo.getReceiverNum(); i++) 
			{
				StringBuilder receiverBuilder = new StringBuilder(emailParamVo.getReceivers());
				receiverBuilder = receiverBuilder.deleteCharAt(0);
				receiverBuilder = receiverBuilder.deleteCharAt(receiverBuilder.length()-1);
				String[] receivers = receiverBuilder.toString().split(" ");
				String receiver = receivers[i];
				emailDeliverStatus.setEmailId(emailParamVo.getEmailIdPre() + i + "$" + receiver);
				emailDeliverStatus.setReceiver(receiver);
				collector.emit("update-delivered-status",new Values(emailDeliverStatus));
			}

 
이렇게 하면 문제 가 있 습 니 다. 논리 적 으로 저 희 는 emit 에 여러 개의 서로 다른 emailDeliverStatus 대상 의 소식 을 전하 고 싶 습 니 다. 그러나 실제 적 으로 이렇게 하면 안 됩 니 다. storm 의 emit 작업 은 바로 실행 되 는 것 이 아니 기 때 문 입 니 다.
위의 코드 는 emit 호출 을 가정 한 후에 storm 에서 바로 메 시 지 를 보 내 는 것 입 니 다.위 에 쓰 여 있 는 대로 메 시 지 를 받 은 bolt 가 받 은 for 순환 의 여러 메 시 지 는 마지막 메시지 가 여러 번 반복 되 는 것 을 발견 할 수 있 습 니 다.
storm 은 emit 를 즉시 실행 하 는 것 이 아니 라 이 bolt 에서 실 행 된 고정 시간 에 emit 를 실행 하기 때문에 emailDeliverStatus 인 스 턴 스 의 초기 화 는 for 순환 의 밖 에 두 어야 합 니 다.

좋은 웹페이지 즐겨찾기