ext direct spring sse method

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/


 

 



 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值