1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// **********************************************************************
//
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
(function(global){
require("Ice/Class");
require("Ice/Debug");
require("Ice/ExUtil");
var Ice = global.Ice || {};
var Debug = Ice.Debug;
var ExUtil = Ice.ExUtil;
var ConnectionMonitor = Ice.Class({
__init__: function(instance, interval)
{
this._instance = instance;
this._interval = interval;
this._scheduledInterval = 0;
this._timerToken = -1;
this._connections = [];
},
destroy: function()
{
Debug.assert(this._instance !== null);
this._instance.timer().cancel(this._timerToken);
this._instance = null;
this._connections = null;
},
checkIntervalForACM: function(acmTimeout)
{
if(acmTimeout <= 0)
{
return;
}
//
// If Ice.MonitorConnections isn't set (_interval == 0), the given ACM is used
// to determine the check interval: 1/10 of the ACM timeout with a minmal value
// of 5 seconds and a maximum value of 5 minutes.
//
// Note: if Ice.MonitorConnections is set, the timer is scheduled only if ACM
// is configured for the communicator or some object adapters.
//
var interval;
if(this._interval === 0)
{
interval = Math.floor(Math.min(300, Math.max(5, acmTimeout / 10)));
}
else if(this._scheduledInterval === this._interval)
{
return; // Nothing to do, the timer is already scheduled.
}
else
{
interval = this._interval;
}
//
// If no timer is scheduled yet or if the given ACM requires a smaller interval,
// we re-schedule the timer.
//
if(this._scheduledInterval === 0 || this._scheduledInterval > interval)
{
this._scheduledInterval = interval;
this._instance.timer().cancel(this._timerToken);
var self = this;
this._timerToken = this._instance.timer().scheduleRepeated(
function() { self.runTimerTask(); }, interval * 1000);
}
},
add: function(connection)
{
Debug.assert(this._instance !== null);
this._connections.push(connection);
},
remove: function(connection)
{
Debug.assert(this._instance !== null);
var pos = this._connections.indexOf(connection);
Debug.assert(pos !== -1);
this._connections.splice(pos, 1);
},
runTimerTask: function()
{
var now = Date.now();
for(var i = 0; i < this._connections.length; ++i)
{
try
{
this._connections[i].monitor(now);
}
catch(ex)
{
if(this._instance === null)
{
return;
}
var msg = "exception in connection monitor:\n" + ExUtil.toString(ex);
this._instance.initializationData().logger.error(msg);
}
}
}
});
Ice.ConnectionMonitor = ConnectionMonitor;
global.Ice = Ice;
}(typeof (global) === "undefined" ? window : global));
|