Crossbar を WAMP ルーターとして使用し、サブスクライブして Web ページのフロントエンドでレンダリングされるイベントを公開しています。
フロントエンドから、まずバックエンドに情報の公開を開始するように指示する呼び出しを行います。次に、トピックにサブスクライブします。
編集ここでのアイデアは、バックエンドからフロントエンドで表示する情報を公開したいということですが、常に公開する必要はありません。そのため、ページが読み込まれたときにメッセージを送信して、公開を開始し、不要になったら停止するように伝えたいと思います。
これは、フロントエンド コードの関連部分です。
function connect() {
var connection = new autobahn.Connection(
{
url: "ws://com.example.wamp:8765/ws",
realm: "info"
});
connection.onopen = function (session) {
// ...
session.call("com.example.startPublish");
// ...
session.subscribe("com.example.info", onInfo);
// ...
};
connection.onclose = function (reason, details) {
// ...
session.unsubscribe("com.example.info");
// ...
};
connection.open();
}
$(function() {
connect();
});
function onInfo(args, kwargs) {
$(".info").text(kwargs.info);
}
バックエンドでは、情報を取得して公開するための処理を行います。これはバックエンド コードです。
var publishInfoInterval = null;
var session;
var connection = new autobahn.Connection(
{
url: "ws://com.example.wamp:8765/ws",
realm: "info"
});
function getInfo() {
// ...
return duration;
}
function publishInfo() {
publishInfoInterval = setInterval(function() {
session.publish("com.example.info", [], {
"info": getInfo(),
});
}, 10000);
}
function startPublish() {
publishInfo();
}
function stopPublish() {
clearIntervals();
}
function clearIntervals() {
if(publishInfoInterval) {
clearInterval(publishInfoInterval);
publishInfoInterval = null;
}
}
connection.onopen = function(sess) {
session = sess;
sess.register("com.example.startPublish", startPublish).then(
function() {
console.log("Registered startPublish");
}
);
sess.register("com.example.stopPublish", stopPublish).then(
function() {
console.log("Registered stopPublish");
}
);
};
connection.onclose = function(reason, details) {
clearIntervals();
};
connection.open();
私が抱えている問題は、ページを更新すると新しいサブスクリプションが作成されることです。ただし、元のサブスクリプションは引き続き同じ情報を公開しています。そのため、ページを更新した後、私は二重に購読しています.
これを処理する最善の方法は何だろうと思っています。