用起來比較簡單,網上資料也比較多(參考:開源框架Pushlet入門),就不多費筆墨了。
最常見的用法如下:
package com.ljq.test;
import java.io.Serializable;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;
@SuppressWarnings("serial")
publicclass HelloWorldPlushlet extends EventPullSource implements Serializable {
/**
* 設置休眠時間
*/
@Override
protectedlong getSleepTime() {
return1000;
}
/**
* 創建事件
*
* 業務部分寫在pullEvent()方法中,這個方法會被定時調用。
*/
@Override
protected Event pullEvent() {
Event event = Event.createDataEvent("/linjiqin/hw");
event.setField("hw", "HelloWorld!!!!");
return event;
}
}
在使用的過程中發現,如果要在pullEvent()方法中獲取參數比較麻煩,看了半天官方文檔也沒有找到好的方法(也可能是我沒有找對地方,總感覺pushlet不會有這種問題,如果你們知道請一定告訴我)。只好去看源代碼,發現在nl.justobjects.pushlet.servlet.Pushlet中已經將request參數傳進了Session(注意是nl.justobjects.pushlet.core.Session)。但是在session構造的時候沒有用到request。看到這裏,就大概知道改怎麼改了。代碼如下:
1. nl.justobjects.pushlet.core.Session,添加了event域和getEvent()方法,修改了public static Session create(String anId, Event anEvent)方法
publicclass Session implements Protocol, ConfigDefs {
private Controller controller;
private Subscriber subscriber;
private Event event;
...
/**
* Create instance through factory method.
*
* @param anId a session id
* @return a Session object (or derived)
* @throws PushletException exception, usually misconfiguration
*/
publicstatic Session create(String anId, Event anEvent) throws PushletException {
Session session;
try {
session = (Session) Config.getClass(SESSION_CLASS, "nl.justobjects.pushlet.core.Session").newInstance();
} catch (Throwable t) {
thrownew PushletException("Cannot instantiate Session from config", t);
}
// Init session
session.id = anId;
session.controller = Controller.create(session);
session.subscriber = Subscriber.create(session);
session.event = anEvent;
return session;
}
...
/**
* Return event.
*/
public Event getEvent() {
return event;
}
...
}
/**
* Create new Session (but add later).
*/
public Session createSession(Event anEvent) throws PushletException {
// Trivial
return Session.create(createSessionId(), anEvent);
}
3. ajax-pushlet-client.js,PL添加了parameters屬性,修改了_doRequest函數,在函數的最後加了如下一段:
if(PL.parameters.length > 0) {
for (var i = 0; i < PL.parameters.length; i++) {
var para = PL.parameters[i];
url += "&" + para.name + "=" + para.value;
}
}
修改後的ajax-pushlet-client.js -_doRequest()函數:
_doRequest: function(anEvent, aQuery) {
...
// Construct base URL for GET
var url = PL.pushletURL + '?p_event=' + anEvent;
// Optionally attach query string
if (aQuery) {
url = url + '&' + aQuery;
}
// Optionally attach session id
if (PL.sessionId != null) {
url = url + '&p_id=' + PL.sessionId;
if (anEvent == 'p_leave') {
PL.sessionId = null;
}
}
if(PL.parameters.length > 0) {
for (var i = 0; i < PL.parameters.length; i++) {
var para = PL.parameters[i];
url += "&" + para.name + "=" + para.value;
}
}
PL.debug('_doRequest', url);
PL._getXML(url, PL._onResponse);
},
好了,源代碼修改完畢,下面是一個如何傳遞參數的例子
在頁面上js代碼:
// pushlet服務器推送,更新實時監控模塊
var initPushlet = function() {
PL.parameters.push({"name":"user-id", "value":"001");
PL._init();
PL.joinListen('/source/event');
};
在HelloWorldPlushlet的pullEvent()方法調用:
Session[] sessions = SessionManager.getInstance().getSessions();
String userId = sessions[0].getEvent().getField("user-id");