【Playframework2.5】Server-Sent Eventsを使用して、イベント駆動な画面同期を行いたい
Webシステムにおいて、同じ画面を複数ユーザーが表示・操作している状態で画面を同期化したいと考えています。
○期待している動作
ユーザが画面を操作>AjaxでDBを更新>更新内容を、同じ画面を開いている別ユーザの画面にも反映
○現状
play.libs.EventSourceのリファレンスに乗っているサンプルコードを実装し、一定時間ごとにサーバからクライアントへデータを送信できることを確認しました。
・javascript
$(function() {
/**************************************************************************
*
* 同期処理用SSE
*
**************************************************************************/
var eventSource = new EventSource("/xxx/sse/test");
eventSource.onmessage = function (event) {
alert(event.data);
};
});
・サーバ側
public Result testSSE() {
Source<String, ?> tickSource = Source.tick(Duration.Zero(), Duration.create(10000, TimeUnit.MILLISECONDS), "TICK");
Source<EventSource.Event, ?> eventSource = tickSource.map((tick) -> EventSource.Event.event(df.format(ZonedDateTime.now())));
return ok().chunked(eventSource.via(EventSource.flow())).as(Http.MimeTypes.EVENT_STREAM);
}
○疑問
このサンプルを参考に、「一定時間ごと」ではなく「DB更新処理が完了する毎」にフラグを変更したいのですが、方法がわからずに頓挫している状態です。
ご存知の方がいらっしゃいましたらご協力をお願いします・・・。
○仮説
AkkaStreamで時間ごとに繰り返してるようなのでその処理を削り、DB保存処理の完了後にeventSourceを作成してやればいくのでは?と考えました。
しかし結果として、DB保存処理を走らせていないにも関わらず、3秒程度の間隔でクライアント側にメッセージが表示されました。
Source.singleの意味合いを勘違いしていると思うのですが、現状はここで行き詰っています。
・javascript
$(function() {
/**************************************************************************
*
* 同期処理用SSE
*
**************************************************************************/
var eventSource = new EventSource("/xxx/sse/test2");
eventSource.onmessage = function (event) {
alert(event.data);
};
});
・サーバ側
public Source<EventSource.Event, ?> eventSource = Source.single(EventSource.Event.event("test Datas"));
public Result saveDB() {
...
eventSource = Source.single(EventSource.Event.event("test Datas"));
}
public Result testSSE2() {
return ok().chunked(eventSource.via(EventSource.flow())).as(Http.MimeTypes.EVENT_STREAM);
}