Spring 은 Deferred Result 를 사용 하여 긴 연결 을 실현 합 니 다.
@RestController
@RequestMapping("/notifications")
public class NotificationResource implements ReleaseMessageListener {
private static final Logger logger = LoggerFactory.getLogger(NotificationResource.class);
private final Multimap deferredResults =
Multimaps.synchronizedSetMultimap(HashMultimap.create());
//
private final ExecutorService largeNotificationBatchExecutorService;
public NotificationResource() {
largeNotificationBatchExecutorService = Executors.newFixedThreadPool(20, BambooThreadFactory.create
("NotificationResource", true));
}
/**
*
* @return
*/
@RequestMapping(method = RequestMethod.GET)
public DeferredResult> pollNotification(@RequestParam(value = "instanceId") String instanceId) {
DeferredResultWrapper deferredResultWrapper = new DeferredResultWrapper(instanceId);
deferredResultWrapper.onTimeout(() -> logger.debug("notifications timeout"));
deferredResultWrapper.onCompletion(() -> deferredResults.remove("server", deferredResultWrapper));
this.deferredResults.put("server", deferredResultWrapper);
return deferredResultWrapper.getResult();
}
/**
*
*/
@Override
public void handleMessage() {
logger.info("gray map modified");
for (DeferredResultWrapper wrapper : (List) new ArrayList(deferredResults.get("server"))) {
largeNotificationBatchExecutorService.submit(() -> wrapper.setResult(true));
}
}
}
알림 인터페이스
/**
*
*/
public interface ReleaseMessageListener {
void handleMessage();
}
deferred Result 포장 류
/**
*
*/
public class DeferredResultWrapper {
private static final long TIMEOUT = 60 * 1000;//60 seconds
// 304
private static final ResponseEntity
NOT_MODIFIED_RESPONSE = new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
private String instanceId;
private DeferredResult> result;
/**
*
*/
public DeferredResultWrapper(String instanceId) {
this.instanceId = instanceId;
result = new DeferredResult<>(TIMEOUT, NOT_MODIFIED_RESPONSE);
}
//
public void onTimeout(Runnable timeoutCallback) {
result.onTimeout(timeoutCallback);
}
public void onCompletion(Runnable completionCallback) {
result.onCompletion(completionCallback);
}
/**
*
* @param notification
*/
public void setResult(boolean notification) {
result.setResult(new ResponseEntity<>(notification, HttpStatus.OK));
}
public DeferredResult> getResult() {
return result;
}
}
인 터 페 이 스 를 호출 할 때 로 컬 에 등록 합 니 다.
60s 시간 초과 에 도착 하면 호출 자 304 에 게 돌아 갑 니 다.
60s 내 에 호출 자 에 게 알 리 려 면 true 와 200 으로 돌아 갑 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.