Что бы я сделал, это отправить cookie с уникальным значением с каждым запросом и сохранить это значение на карте в качестве ключа, при этом значение будет дочерним процессом, чтобы вы могли его убить.
Затем добавьте обработчик unload
на странице в Javascript, чтобы отправить запрос на новый URL с таким уникальным значением, чтобы вы могли совершить убийство.
например. Ваш экспресс-код становится чем-то вроде:
var javaSessions = {
_counter: -1
};
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
var spawn = require('child_process').spawn;
var javaSessionId = javaSessions._counter++;
res.cookie('java_session_id', javaSessionId);
var java = spawn("java", ['-cp', 'lib\\*;bin', 'com.my.app.App']);
javaSessions[javaSessionId] = java;
...
});
app.get('/unload/:id', function (req, res) {
var java = javaSessions[req.params.id];
javaSessions[req.params.id] = null;
java.kill();
});
Затем в index.html
, добавьте следующую разметку вниз в нижней (при условии, что вам не нужно целевой браузеры старше о Internet Explorer 8):
<script type="text/javascript">
window.onunload = function() {
var req = new XMLHttpRequest(),
javaSessionId = document.cookie.replace(/(?:(?:^|.*;\s*)java_session_id\s*\=\s*([^;]*).*$)|^.*$/, "$1"); // regex from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_.232.3A_Get_a_sample_cookie_named_test2
req.open("GET", "/unload/" + javaSessionId);
};
</script>
Вы также можете получить значение cookie из запроса, вместо того, чтобы явно прочитать его в Javascript и отправить его как параметр URL. Он может быть отправлен с запросом.
Вам нужно будет протестировать все это, это все очень гипотетический код, который вам придется попробовать самостоятельно.
Почему вы хотите, чтобы процесс работал во время просмотра страницы и только во время просмотра страницы? Похож на потенциальную проблему [XY] (http://meta.stackexchange.com/a/66378) мне – Plato
Также может быть способ сохранить запрос открытым, т. Е. [Длинный опрос] (https: // github.com/pascalopitz/long_polling_example/blob/master/test.js) и получить событие, когда соединение будет закрыто. ваша проблема действительно зная, когда нужно называть java.kill() и как сохранить ссылку вокруг – Plato