Java tutorial
/** * Copyright (c) 2005-2012 https://github.com/zhangkaitao * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.sishuok.chapter3.web.controller; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.async.DeferredResult; import java.io.IOException; import java.util.Iterator; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; /** * * DeferredResult????callable???? * * ? * * <p>User: Zhang Kaitao * <p>Date: 13-7-17 ?7:13 * <p>Version: 1.0 */ @Controller public class DeferredResultController { private Queue<DeferredResult> queue = new ConcurrentLinkedQueue<DeferredResult>(); @RequestMapping("/message") @ResponseBody public DeferredResult<String> newMessage() throws IOException { //1?DeferredResult long timeout = 30L * 1000; final DeferredResult<String> result = new DeferredResult<String>(timeout); result.onCompletion(new Runnable() { @Override public void run() { queue.remove(result); } }); result.onTimeout(new Runnable() { @Override public void run() { queue.remove(result); } }); //2???? queue.add(result); return result; } @Scheduled(fixedRate = 5L * 1000) public void pushMessage() { Iterator<DeferredResult> iter = queue.iterator(); while (iter.hasNext()) { DeferredResult<String> result = iter.next(); result.setResult("new message : " + System.currentTimeMillis()); } } }