Skip to content

Instantly share code, notes, and snippets.

@keesun
Created January 16, 2012 16:32
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save keesun/1621658 to your computer and use it in GitHub Desktop.
Save keesun/1621658 to your computer and use it in GitHub Desktop.
Servlet 3.0's Asynchronous Support sample
package me.whiteship.board.modules.servlet.async;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.*;
/**
* @author Keesun Baik
* To test this class, turn off all filters in web.xml.
*/
@WebServlet(value = "/stocks", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
final AsyncContext asyncContext = req.startAsync(req, res);
asyncContext.getResponse().getWriter().println("Start");
asyncContext.start(new StockPriceRunner(asyncContext));
}
private class StockPriceRunner implements Runnable {
AsyncContext asyncContext;
public StockPriceRunner(AsyncContext asyncContext) {
this.asyncContext = asyncContext;
}
@Override
public void run() {
String ticker = "GOOG";
Double price = YahooFinance.getPrice(ticker);
try {
asyncContext.getResponse().getWriter().printf("ticker: %s, price: %.2f", ticker, price);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
asyncContext.complete();
}
}
}
}
package me.whiteship.board.modules.servlet.async;
import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Keesun Baik
* To test this class, turn off all filters in web.xml.
*/
@WebServlet(value = "/stocks2", asyncSupported = true)
public class AsyncServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
if(req.getDispatcherType() == DispatcherType.REQUEST) {
final AsyncContext asyncContext = req.startAsync(req, res);
asyncContext.getResponse().getWriter().println("Start");
asyncContext.start(new StockPriceRunner(asyncContext));
} else if(req.getDispatcherType() == DispatcherType.ASYNC) {
Double price = (Double) req.getAttribute("price");
String ticker = (String) req.getAttribute("ticker");
res.getWriter().printf("ticker: %s, price: %.2f", ticker, price);
}
}
private class StockPriceRunner implements Runnable {
AsyncContext asyncContext;
public StockPriceRunner(AsyncContext asyncContext) {
this.asyncContext = asyncContext;
}
@Override
public void run() {
String ticker = "GOOG";
Double price = YahooFinance.getPrice(ticker);
asyncContext.getRequest().setAttribute("price", price);
asyncContext.getRequest().setAttribute("ticker", ticker);
asyncContext.dispatch();
}
}
}
package me.whiteship.board.modules.servlet.async;
import org.springframework.web.client.RestTemplate;
/**
* @author Keesun Baik
* Referenced from NFJS 2011 April
*/
public class YahooFinance {
private static final String YAHOO_FINANCE_API = "http://download.finance.yahoo.com/d/quotes.csv?s=";
private static final String API_PARAMS = "&f=nsl1op&e=.csv";
public static double getPrice(final String ticker) {
RestTemplate restTemplate = new RestTemplate();
String data = restTemplate.getForObject(YAHOO_FINANCE_API + ticker + API_PARAMS, String.class);
final String[] dataItems = data.split(",");
return Double.parseDouble(dataItems[dataItems.length - 1]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment