我正在寻找创建客户订阅某些数据的REST API。当数据发生变化时(由于某些外部事件),我想通过新数据通知客户端(观察者)。
我想将Spring用于REST API,我不知道如何注册并通知观察者。
一些指导和/或良好做法会非常有帮助。
谢谢
答案 0 :(得分:2)
您可以将Spring 5与WebFlux一起使用。它是迭代器和观察者模式的组合。只要服务器上有一个Objekt,客户端总会得到一个新的Objekt。您可以在Spring页面上或在例如Spring页面上开始学习更多内容。 New in Spring 5: Functional Web Framework
答案 1 :(得分:1)
我毫不犹豫地提出我的答案,因为另一个更好,但是因为我已经完成了一些代码。
在春季启动时,您可以注册回拨网址,示例控制器是:
tf vc history <path> /recursive /version:W~T
可以像这样进行测试,注册2个回叫,URL http://127.0.0.1:8080/callback/app1被编码,因此它可以是一个参数。
@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) {
}
}
}
}
在我的例子中,为简单起见,客户端和服务器是相同的应用程序,但它们可能不同。