使用Spring Boot自动更新监控网站

时间:2016-01-26 19:38:09

标签: java spring-boot

我有一个Java应用程序,我开始使用Spring Boot,我添加了一个.jsp文件,提供一个网站来监控应用程序的状态。

当应用程序更改其状态时,是否有可能自动更新网站?目前,我必须按F5或使用自动刷新插件。但是,我的印象是应该有技术允许这种情况,而不是每隔几秒就重新加载一个完整的网站。

我甚至不知道谷歌的用途,所以任何提示都会非常有用。

2 个答案:

答案 0 :(得分:1)

我继续搜索并找到了解决方案。在HTML5中引入了Server-sent Events(SSE),它允许将数据从服务器发送回当前正在查看该网站的任何客户端。然后可以使用一些JavaScript来相应地更新网站。

在Spring Boot中使用SSE非常简单:

@Controller必须存储SseEmitter列表,并将更新的数据发送到每个发射器。另外还需要另一个请求映射,以允许客户端自行注册。

private final List<SseEmitter> sseEmitter = new LinkedList<>();

@RequestMapping (path = "/register", method = RequestMethod.GET)
public SseEmitter register() throws IOException {
    log.info("Registering a stream.");

    SseEmitter emitter = new SseEmitter();

    synchronized (sseEmitter) {
        sseEmitter.add(emitter);
    }
    emitter.onCompletion(() -> sseEmitter.remove(emitter));

    return emitter;
}

.jsp文件需要一些JavaScript来注册自己。该页面加载时应该执行该功能。

var connect = function () {
    var source = new EventSource('/register');
    // Reconnect if the connection fails
    source.addEventListener('error', function (e) {
        console.log('Disconnected.');
        if (e.readyState == EventSource.CLOSED) {
            connected = false;
            connect();
        }
    }, false);
};

@Controller可以通过向所有已知发射器发送数据来请求更新:

synchronized (sseEmitter) {
    sseEmitter.forEach((SseEmitter emitter) -> {
        try {
            emitter.send(state, MediaType.APPLICATION_JSON);
        } catch (IOException e) {
            emitter.complete();
            sseEmitter.remove(emitter);
        }
    });
}

最后,网站接受该消息并处理它。以下内容也将添加到connect()函数:

source.addEventListener('message', function (e) {
    var state = JSON.parse(e.data);
    console.log("New state: " + state.text);
    var element = document.getElementById("state");
    element.innerHTML = state.text;
}, false);

我已将一个简单的示例项目上传到GitHub

答案 1 :(得分:0)

从春季启动1.3开始,有一个新工具 spring-devtools

https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3

http://livereload.com可从Chrome,Firefox和Safari免费使用的浏览器扩展程序。

相关问题