com.sishuok.chapter3.web.controller.DeferredResultController.java Source code

Java tutorial

Introduction

Here is the source code for com.sishuok.chapter3.web.controller.DeferredResultController.java

Source

/**
 * 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());
        }
    }
}