SSE Method
Since 1.2.2
Server
服务器发送事件方法是轮询方法的替代。从JavaScript EventSource对象调用。
一个服务器发送方法用@ExtDirectMethod(value = ExtDirectMethodType.SSE)注释。如果SSE方法有参数需要用@RequestParam注释。value属性必须跟请求参数名一致,是可选的如果编译时带有调试信息。如果没有value属性Spring会试着读取参数名称从调试信息。
一个SSE方法可以返回一个SSEvent实例,或者任何其它的对象将会转换成字符串用对象的toString()方法。
@Service
public class Poll {
@ExtDirectMethod(value = ExtDirectMethodType.SSE)
public SSEvent sse1(@RequestParam int id) {
SSEvent event = new SSEvent();
event.setRetry(10000);
event.setData("some data");
return event;
}
@ExtDirectMethod(value = ExtDirectMethodType.SSE)
public String sse2() {
return "some data";
}
}
注释@RequestParam使用方法跟Spring MVC一致。
SSE方法也可以包含服务器对象参数(见简单方法参数)。
@ExtDirectMethod(value = ExtDirectMethodType.SSE)
public SSEvent sse1(HttpServletResponse response, HttpServletRequest request,
HttpSession session, Locale locale,
@RequestParam(value = "id") int id) {
...
}
方法参数顺序无关,跟参数名称有关。
Http Streaming (since 1.3.0)
事件可以通过类SSEWriter写入流。添加SSEWriter作为方法参数,用对象的的write方法写事件。有两个write方法可用。一个方法参数类型为SSEvent,另一个方法参数类型可以任意对象。这个对象可以转换成字符串用对象的toString()方法,通过类库包装成SSEvent对象。
@ExtDirectMethod(ExtDirectMethodType.SSE)
public void sse(SSEWriter sseWriter) {
SSEvent event = new SSEvent();
event.set....
sseWriter.write(event);
//do something else or wait for something or ...
sseWriter.write("a string");
sseWriter.write(2);
//...
}
方法可以什么也不返回,返回SSEvent对象或任意其它对象。无论函数返回什么类库把返回对象写入输出流,然后关闭输出流。
Client
客户端通过EventSource对象跟SSE方法交互。
api.js会创建一个变量为每个SSE方法,变量包含EventSource构造函数需要的URL.默认的变量格式如Ext.app.SSE.name_of_the_bean.name_of_the_method
调用方法sse1的例子如下:
var es = new EventSource(Ext.app.SSE.poll.sse1);
es.addEventListener('message', sse1MessageHandler, false);
function sse1MessageHandler(event) {
//...
}
Polyfill 补充
并不是所有浏览器支持Server-Sent Events。浏览器支持情况可以从CanIuse.com查到。Yaffle/EventSource提供了EventSource实现。支持大部分浏览器。
IE6-IE9需要一些特殊处理。首先服务器发送消息需要添加两个头参数:
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Access-Control-Allow-Origin", "*");
然后服务器需要发送2kb的数据作为第一个消息。一种方法可以发送2048个空格。
例子可以看extdirectspring-demo的Poll类。
更多参考:
http://www.w3.org/TR/eventsource/
https://developer.mozilla.org/en-US/docs/Server-sent_events/EventSource
https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events
http://www.html5rocks.com/en/tutorials/eventsource/basics/