Java 使用Spring Boot自动更新监控网站
我有一个Java应用程序,我开始使用SpringBoot,并添加了一个.jsp文件,提供了一个网站来监控应用程序的状态 当应用程序更改其状态时,是否有可能自动更新网站?目前,我必须按F5或使用自动刷新插件。然而,我的印象是,应该有一些技术可以做到这一点,而无需每隔几秒钟重新加载整个网站Java 使用Spring Boot自动更新监控网站,java,spring-boot,Java,Spring Boot,我有一个Java应用程序,我开始使用SpringBoot,并添加了一个.jsp文件,提供了一个网站来监控应用程序的状态 当应用程序更改其状态时,是否有可能自动更新网站?目前,我必须按F5或使用自动刷新插件。然而,我的印象是,应该有一些技术可以做到这一点,而无需每隔几秒钟重新加载整个网站 我甚至不知道用谷歌搜索什么,所以任何提示都会非常有用。从spring boot 1.3开始,有一个新工具spring devtools Chrome、Firefox和Safari都有免费的浏览器扩展。我继续搜索
我甚至不知道用谷歌搜索什么,所以任何提示都会非常有用。从spring boot 1.3开始,有一个新工具spring devtools
Chrome、Firefox和Safari都有免费的浏览器扩展。我继续搜索并找到了解决方案。在HTML5中引入了SSE,它允许将数据从服务器发送回当前查看网站的任何客户端。然后可以使用一些JavaScript相应地更新网站 在Spring Boot中使用SSE非常简单:
@控制器
必须存储发射器的列表
,并向每个发射器发送任何更新的数据。另外,还需要另一个请求映射来允许客户端注册自己
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;
}
@控制器可以通过向所有已知发射器发送数据来请求更新:
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);
我已将一个简单的示例项目上载到。High-kap。这不是真正的java或spring引导特定的。问题是当你说“改变它的状态”时,你会期望什么。也就是说,当你想把一些信息从你的应用程序推送到客户端时,我建议你看看WebSocket。如果你的意思是你想通知你的用户应用程序崩溃了或者什么的,那么我认为这是不可能的。崩溃的应用程序应如何通知用户?为此,您需要实现其他一些功能。更改状态意味着“为同一端点返回不同的内容”。我在寻找一种长轮询的主动变体。当更新仅在几分钟后发生时,实际上不需要每隔x
秒检查更新状态。请改用WebSocket
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);