Spring 如何实现RESTAPI的观察者模式&x27;s
我希望创建一个RESTAPI,客户机可以订阅某些数据。当数据发生变化时(由于某些外部事件),我想用新数据通知客户机(观察者) 我想将Spring用于RESTAPI,但我不知道如何注册和通知观察者 一些指导和/或良好实践将非常有用Spring 如何实现RESTAPI的观察者模式&x27;s,spring,rest,api,observer-pattern,Spring,Rest,Api,Observer Pattern,我希望创建一个RESTAPI,客户机可以订阅某些数据。当数据发生变化时(由于某些外部事件),我想用新数据通知客户机(观察者) 我想将Spring用于RESTAPI,但我不知道如何注册和通知观察者 一些指导和/或良好实践将非常有用 谢谢您可以将Spring 5与WebFlux一起使用。它是迭代器和观察者模式的组合。每当服务器上有新对象时,客户机总是获取新对象。您可以从Spring文档页面或例如。 我不太愿意给出我的答案,因为另一个更好,但因为我已经完成了一些代码 在spring boot中,您可以
谢谢您可以将Spring 5与WebFlux一起使用。它是迭代器和观察者模式的组合。每当服务器上有新对象时,客户机总是获取新对象。您可以从Spring文档页面或例如。
我不太愿意给出我的答案,因为另一个更好,但因为我已经完成了一些代码 在spring boot中,您可以注册回调URL,例如控制器:
@RestController
public class Controller {
private List<Listener> listeners = new ArrayList<>();
@RequestMapping(value = "/register/{name}", method = RequestMethod.POST)
public ResponseEntity<Void> register(@PathVariable("name") String name, @RequestParam("callbackurl") String callBackUrl) throws Exception {
System.out.println("register, name=" + name + ", callBackUrl=" + callBackUrl);
Listener listener = new Listener(name, URLDecoder.decode(callBackUrl, "UTF-8"));
listeners.add(listener);
System.out.println(listener);
return new ResponseEntity<>(HttpStatus.OK);
}
@RequestMapping(value = "/callback/*", method = RequestMethod.POST)
public ResponseEntity callBack(@RequestBody String message) {
System.out.println("call back with message=" + message);
return new ResponseEntity(HttpStatus.OK);
}
@Scheduled(fixedRate = 10000)
public void notifyListeners() {
System.out.println("notifying listeners");
for (Listener listener : listeners) {
System.out.println("listener " + listener);
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(listener.getCallBackUrl());
try {
httpPost.setEntity(new StringEntity("hello listener " + listener));
CloseableHttpResponse response = client.execute(httpPost);
client.close();
} catch (Exception e) {
}
}
}
}
在我的例子中,为了简单起见,客户机和服务器是相同的应用程序,但它们可能不同
curl -X POST http://127.0.0.1:8080/register/listener1?callbackurl=http%3A%2F%2F127.0.0.1%3A8080%2Fcallback%2Fapp1
curl -X POST http://127.0.0.1:8080/register/listener1?callbackurl=http%3A%2F%2F127.0.0.1%3A8080%2Fcallback%2Fapp2