Better reconnect logic.

This commit is contained in:
Tony Garnock-Jones 2012-05-01 15:39:06 -04:00
parent dd969a4b31
commit 8ae2c89490
8 changed files with 96 additions and 50 deletions

View File

@ -17,13 +17,15 @@
</head> </head>
<body> <body>
<div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container"> <div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="http://github.com/tonyg/ocamlmsg/">Ocamlmsg</a><div class="nav-collapse"> <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">Ocamlmsg</a><div class="nav-collapse">
<ul class="nav"> <ul class="nav">
<li class="btn-danger"><a href="about.html">About</a></li>
<li><a href="/">Main</a></li> <li><a href="/">Main</a></li>
<li><a href="/nodes.html">Nodes</a></li> <li><a href="/nodes.html">Nodes</a></li>
</ul> </ul>
<ul class="nav pull-right"><li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li></ul> <ul class="nav pull-right">
<li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li>
<li><a href="about.html">About</a></li>
</ul>
</div> </div>
</div></div></div> </div></div></div>
<div class="container"><body> <div class="container"><body>
@ -33,6 +35,11 @@
Ocamlmsg is a prototype of a sensible recursive message broker. Ocamlmsg is a prototype of a sensible recursive message broker.
</p> </p>
<h2>Homepage</h2>
<p>
The project is currently hosted on github at <a href="http://github.com/tonyg/ocamlmsg/">http://github.com/tonyg/ocamlmsg/</a>.
</p>
<h2>Copyright &amp; Licence</h2> <h2>Copyright &amp; Licence</h2>
<p> <p>
Ocamlmsg is Copyright (C) 2012 Tony Garnock-Jones. Ocamlmsg is Copyright (C) 2012 Tony Garnock-Jones.
@ -66,6 +73,6 @@
</p> </p>
</body></div> </body></div>
<script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script> <script>Ocamlmsg.install_tap({});</script><script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script>
</body> </body>
</html> </html>

View File

@ -39,10 +39,9 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</a> </a>
<a class="brand" href="http://github.com/tonyg/ocamlmsg/">Ocamlmsg</a> <a class="brand" href="/">Ocamlmsg</a>
<div class="nav-collapse"> <div class="nav-collapse">
<ul class="nav"> <ul class="nav">
<li class="btn-danger"><a href="about.html">About</a></li>
<xsl:for-each select="document('nav.xml')/navitems/navitem"> <xsl:for-each select="document('nav.xml')/navitems/navitem">
<li> <li>
<xsl:if test="@id = $active-section"> <xsl:if test="@id = $active-section">
@ -54,6 +53,7 @@
</ul> </ul>
<ul class="nav pull-right"> <ul class="nav pull-right">
<li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li> <li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li>
<li><a href="about.html">About</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -65,6 +65,7 @@
</div> </div>
<xsl:copy-of select="script" /> <xsl:copy-of select="script" />
<script>Ocamlmsg.install_tap({});</script>
<script src="bootstrap/js/bootstrap-transition.js"></script> <script src="bootstrap/js/bootstrap-transition.js"></script>
<script src="bootstrap/js/bootstrap-alert.js"></script> <script src="bootstrap/js/bootstrap-alert.js"></script>

View File

@ -7,6 +7,12 @@
Ocamlmsg is a prototype of a sensible recursive message broker. Ocamlmsg is a prototype of a sensible recursive message broker.
</p> </p>
<h2>Homepage</h2>
<p>
The project is currently hosted on github at <a
href="http://github.com/tonyg/ocamlmsg/">http://github.com/tonyg/ocamlmsg/</a>.
</p>
<h2>Copyright &amp; Licence</h2> <h2>Copyright &amp; Licence</h2>
<p> <p>
Ocamlmsg is Copyright (C) 2012 Tony Garnock-Jones. Ocamlmsg is Copyright (C) 2012 Tony Garnock-Jones.

View File

@ -17,13 +17,15 @@
</head> </head>
<body> <body>
<div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container"> <div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="http://github.com/tonyg/ocamlmsg/">Ocamlmsg</a><div class="nav-collapse"> <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">Ocamlmsg</a><div class="nav-collapse">
<ul class="nav"> <ul class="nav">
<li class="btn-danger"><a href="about.html">About</a></li>
<li class="active"><a href="/">Main</a></li> <li class="active"><a href="/">Main</a></li>
<li><a href="/nodes.html">Nodes</a></li> <li><a href="/nodes.html">Nodes</a></li>
</ul> </ul>
<ul class="nav pull-right"><li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li></ul> <ul class="nav pull-right">
<li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li>
<li><a href="about.html">About</a></li>
</ul>
</div> </div>
</div></div></div> </div></div></div>
<div class="container"><body> <div class="container"><body>
@ -49,6 +51,6 @@
<h2>Debug</h2> <h2>Debug</h2>
<pre id="debug_container"></pre> <pre id="debug_container"></pre>
</body></div> </body></div>
<script>$(document).ready(ui_main);</script><script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script> <script>$(document).ready(ui_main);</script><script>Ocamlmsg.install_tap({});</script><script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script>
</body> </body>
</html> </html>

View File

@ -1,30 +1,40 @@
function server_disconnected() {
$("#server_stats_connection_count").text("—");
$("#server_stats_boot_time").text("—");
$("#server_stats_uptime").text("—");
$("#server_classes").text("—");
}
function refresh_server_stats() {
$.getJSON("/_/server_stats", function (data) {
$("#server_stats_connection_count").text(data.connection_count);
$("#server_stats_boot_time").text(new Date(data.boot_time * 1000));
$("#server_stats_uptime").text(data.uptime);
$("#server_classes").text(data.classes.join(", "));
switch (Ocamlmsg.$tap.readyState) {
case 0: // connecting
case 1: // open
case 2: // closing
break;
case 3: // closed
Ocamlmsg.force_reinstall();
}
}).error(server_disconnected);
}
function ui_main() { function ui_main() {
refresh_server_stats(); var uptime = -1;
setInterval(refresh_server_stats, 5000); var refresh_pending = false;
function server_disconnected() {
$("#server_stats_connection_count").text("—");
$("#server_stats_boot_time").text("—");
set_uptime(-1);
$("#server_classes").text("—");
}
function set_uptime(new_uptime) {
uptime = new_uptime;
if (uptime == -1) {
$("#server_stats_uptime").text("—");
} else {
$("#server_stats_uptime").text(uptime);
}
}
function refresh_server_stats() {
$.getJSON("/_/server_stats", function (data) {
$("#server_stats_connection_count").text(data.connection_count);
$("#server_stats_boot_time").text(new Date(data.boot_time * 1000));
set_uptime(data.uptime);
$("#server_classes").text(data.classes.join(", "));
}).error(server_disconnected);
refresh_pending = false;
}
function bump_uptime() {
if (uptime != -1) {
set_uptime(uptime + 1);
}
}
setInterval(bump_uptime, 1000);
Ocamlmsg.$open_hooks.push(function (event, stream) { Ocamlmsg.$open_hooks.push(function (event, stream) {
refresh_server_stats(); refresh_server_stats();
@ -34,9 +44,11 @@ function ui_main() {
Ocamlmsg.subscribe("system.log", "", "log_messages", "completion3"); Ocamlmsg.subscribe("system.log", "", "log_messages", "completion3");
}); });
Ocamlmsg.$close_hooks.push(server_disconnected); Ocamlmsg.$close_hooks.push(server_disconnected);
Ocamlmsg.install_tap({ Ocamlmsg.$message_hooks.push(function (event, stream) {
message: function (event, stream) { if (!refresh_pending) {
$("#debug_container").append(JSON.stringify(event.data) + "\n"); refresh_pending = true;
}, setTimeout(refresh_server_stats, 1000);
}
$("#debug_container").append(JSON.stringify(event.data) + "\n");
}); });
} }

View File

@ -17,13 +17,15 @@
</head> </head>
<body> <body>
<div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container"> <div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="http://github.com/tonyg/ocamlmsg/">Ocamlmsg</a><div class="nav-collapse"> <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">Ocamlmsg</a><div class="nav-collapse">
<ul class="nav"> <ul class="nav">
<li class="btn-danger"><a href="about.html">About</a></li>
<li><a href="/">Main</a></li> <li><a href="/">Main</a></li>
<li class="active"><a href="/nodes.html">Nodes</a></li> <li class="active"><a href="/nodes.html">Nodes</a></li>
</ul> </ul>
<ul class="nav pull-right"><li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li></ul> <ul class="nav pull-right">
<li><a id="server_status_message_container"><span id="server_status_message">Connected</span></a></li>
<li><a href="about.html">About</a></li>
</ul>
</div> </div>
</div></div></div> </div></div></div>
<div class="container"><body> <div class="container"><body>
@ -47,6 +49,6 @@
</div> </div>
</div> </div>
</body></div> </body></div>
<script>$(document).ready(nodes_main);</script><script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script> <script>$(document).ready(nodes_main);</script><script>Ocamlmsg.install_tap({});</script><script src="bootstrap/js/bootstrap-transition.js"></script><script src="bootstrap/js/bootstrap-alert.js"></script><script src="bootstrap/js/bootstrap-modal.js"></script><script src="bootstrap/js/bootstrap-dropdown.js"></script><script src="bootstrap/js/bootstrap-scrollspy.js"></script><script src="bootstrap/js/bootstrap-tab.js"></script><script src="bootstrap/js/bootstrap-tooltip.js"></script><script src="bootstrap/js/bootstrap-popover.js"></script><script src="bootstrap/js/bootstrap-button.js"></script><script src="bootstrap/js/bootstrap-collapse.js"></script><script src="bootstrap/js/bootstrap-carousel.js"></script><script src="bootstrap/js/bootstrap-typeahead.js"></script>
</body> </body>
</html> </html>

View File

@ -27,5 +27,4 @@ function refresh_node_list() {
function nodes_main() { function nodes_main() {
Ocamlmsg.$open_hooks.push(refresh_node_list); Ocamlmsg.$open_hooks.push(refresh_node_list);
Ocamlmsg.install_tap({});
} }

View File

@ -3,12 +3,17 @@ var Ocamlmsg = {
$args: null, $args: null,
$open_hooks: [], $open_hooks: [],
$message_hooks: [],
$close_hooks: [], $close_hooks: [],
run_open_hooks: function (event, stream) { run_open_hooks: function (event, stream) {
$.each(Ocamlmsg.$open_hooks, function (i, f) { f(event, stream); }); $.each(Ocamlmsg.$open_hooks, function (i, f) { f(event, stream); });
}, },
run_message_hooks: function (event, stream) {
$.each(Ocamlmsg.$message_hooks, function (i, f) { f(event, stream); });
},
run_close_hooks: function (event, stream) { run_close_hooks: function (event, stream) {
$.each(Ocamlmsg.$close_hooks, function (i, f) { f(event, stream); }); $.each(Ocamlmsg.$close_hooks, function (i, f) { f(event, stream); });
}, },
@ -67,21 +72,33 @@ var Ocamlmsg = {
Ocamlmsg._send(Ocamlmsg._create(classname, arg, reply_name, factory)); Ocamlmsg._send(Ocamlmsg._create(classname, arg, reply_name, factory));
}, },
install_tap: function (args) { _install_tap: function () {
Ocamlmsg.$args = args;
Ocamlmsg.$tap = $.stream("/_/tap", { Ocamlmsg.$tap = $.stream("/_/tap", {
type: "http", type: "http",
dataType: "json", dataType: "json",
enableXDR: true, enableXDR: true,
open: Ocamlmsg.run_open_hooks, open: Ocamlmsg.run_open_hooks,
message: args.message, message: Ocamlmsg.run_message_hooks,
error: Ocamlmsg.run_close_hooks, error: Ocamlmsg.run_close_hooks,
close: Ocamlmsg.run_close_hooks close: Ocamlmsg.run_close_hooks
}); });
}, },
force_reinstall: function () { install_tap: function (args) {
Ocamlmsg.install_tap(Ocamlmsg.$args); Ocamlmsg.$args = args;
Ocamlmsg._install_tap();
setInterval(Ocamlmsg.check_connectivity, 5000);
},
check_connectivity: function () {
switch (Ocamlmsg.$tap.readyState) {
case 0: // connecting
case 1: // open
case 2: // closing
break;
case 3: // closed
Ocamlmsg._install_tap();
}
} }
} }