有沒有一種方式,當客戶端從服務器流星斷開檢測,或者通過刷新或從頁面導航離開,從而使服務器可以嘗試一些清理工作?服務器斷開清理
服務器斷開清理
回答
一種技術是實現「保活」的方法,每個客戶端調用定期。這假定你有一個user_id
在每個客戶的Session
舉行。
// server code: heartbeat method
Meteor.methods({
keepalive: function (user_id) {
if (!Connections.findOne(user_id))
Connections.insert({user_id: user_id});
Connections.update(user_id, {$set: {last_seen: (new Date()).getTime()}});
}
});
// server code: clean up dead clients after 60 seconds
Meteor.setInterval(function() {
var now = (new Date()).getTime();
Connections.find({last_seen: {$lt: (now - 60 * 1000)}}).forEach(function (user) {
// do something here for each idle user
});
});
// client code: ping heartbeat every 5 seconds
Meteor.setInterval(function() {
Meteor.call('keepalive', Session.get('user_id'));
}, 5000);
如果您使用的是Auth,您可以在Method and Publish函數中訪問用戶的ID,那麼您可以在那裏實現您的跟蹤。當用戶切換房間時,你可以設置「最後看到」:
Meteor.publish("messages", function(roomId) {
// assuming ActiveConnections is where you're tracking user connection activity
ActiveConnections.update({ userId: this.userId() }, {
$set:{ lastSeen: new Date().getTime() }
});
return Messages.find({ roomId: roomId});
});
我認爲更好的方法是捕獲發佈函數中的套接字關閉事件。
Meteor.publish("your_collection", function() {
this.session.socket.on("close", function() { /*do your thing*/});
}
UPDATE:
更新的版本流星的使用_session這樣的:
this._session.socket.on("close", function() { /*do your thing*/});
太棒了。但後來我顯然遇到這個問題:http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz 2012-09-28 08:53:23
謝謝。這是回答我的問題:[流星觀摩運行下去(http://stackoverflow.com/q/12902392/599991) – zVictor 2012-10-16 17:29:40
我用流星0.6.1和此行'this.session.socket.on(」關閉「,函數(){/ *做你的事* /});'我的服務器返回_TypeError:無法讀取undefined_的屬性'套接字'但是當我糾正它'this._session.socket.on(」close「,函數(){/ *做你的事情* /});'它工作得很好,謝謝 – fantom 2013-04-13 18:04:26
我已經實現了一個流星智能包,跟蹤從不同會話的所有連接的會話,並檢測這兩個會話註銷並斷開事件,而不需要昂貴的Keepalive。
爲了檢測斷開/註銷事件,你可以做到以下幾點:
UserStatus.on "connectionLogout", (info) ->
console.log(info.userId + " with session " + info.connectionId + " logged out")
你也可以用它被動。一探究竟!
編輯:v0.3.0
用戶狀態現在跟蹤用戶空閒以及!
這可以在每個頁面的基礎上完成,而不是通過整個應用程序? – Scalahansolo 2014-06-26 15:56:26
是的,雖然這還沒有實施。打開功能請求! – 2014-06-26 15:57:33
我使用Iron Router,並呼籲unload
事件我的主控制器我清理代碼。當然,這不會趕上標籤關閉的事件,但仍然感覺很好用於許多用例
ApplicationController = RouteController.extend({
layoutTemplate: 'root',
data: {},
fastRender: true,
onBeforeAction: function() {
this.next();
},
unload: function() {
if(Meteor.userId())
Meteor.call('CleanUpTheUsersTrash');
},
action: function() {
console.log('this should be overridden by our actual controllers!');
}
});
- 1. php socket服務器斷開
- 2. 突然WCF的資源清理會話服務斷開連接
- 3. 摩卡服務器清理
- 4. 清理斷開的網絡驅動器
- 5. 的WebPack開發服務器不斷斷開
- 6. psycopg2與服務器斷開連接
- 7. 從服務器TCP斷開客戶
- 8. TCP服務器斷開/電纜拔出
- 9. SQL服務器定期斷開連接
- 10. 時間在Ubuntu服務器斷開
- 11. 斷開了遠程Linux服務器
- 12. Autobahn Android:如何斷開服務器
- 13. 的Clojure(ALEPH)當服務器斷開
- 14. Python的服務器瞬間斷開
- 15. 從服務器端斷開的java socket
- 16. 如何連接/斷開服務器?
- 17. ASP.NET開發服務器沒有清理值?
- 18. 代理已斷開,但TeamCity服務器顯示已連接
- 19. 處理服務器端事件斷開連接
- 20. 處理WinRT StreamSocket斷開連接(服務器端和客戶端)
- 21. 服務器端JavaScript清理或沙箱?
- 22. 執行器服務中斷處理
- 23. ES2015代理服務器:斷言代理服務器與目標對象相同
- 24. 處理/清理Web服務代理
- 25. Azure診斷清理
- 26. 使用servlet開發代理服務器
- 27. 測試/開發服務器的理由
- 28. MySQL服務器:3306 [根](斷開)> nodeUnable註冊MySQL服務器5.6的Netbeans 8.1
- 29. RabbitMQ的客戶機/服務器的服務器上通知斷開
- 30. 當客戶端斷開連接時保持服務器打開
經過多次搜索,我認爲這是現在的最佳解決方案。謝謝!! – greggreg 2012-04-24 05:38:19
這幾乎是僞代碼,因爲它不起作用:第一個setInterval沒有指定間隔。 Connections.update命令也沒有指定更新{'user_id':user_id}。可能還有其他錯誤。不過這是一個好的開始。 – 2012-09-08 16:53:05
@debergalis這仍然是推薦的方式,看看客戶是否已經死了? – user2602152 2014-01-19 12:46:09