我希望创建一个API,客户端可以订阅特定的数据,当数据发生变化时(由于一些外部事件),我希望通知客户端(观察者)新的数据。我想使用Spring的REST API的,我不知道如何注册和通知观察者虽然。一些指导和/或良好做法将非常有帮助。谢谢
pftdvrlh1#
在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) { } } } }
可以像这样测试,注册2个回调,URL http://127.0.0.1:8080/callback/app1被编码,因此它可以是一个参数。
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
在我的例子中,为了简单起见,客户机和服务器是相同的应用程序,但它们也可以不同。
plupiseo2#
你可以使用Spring5和WebFlux。它是Iterator和Observer模式的结合。客户端总是会得到一个新的Object,只要服务器上有一个。你可以在Spring文档页面或者New in Spring 5: Functional Web Framework上开始学习更多
2条答案
按热度按时间pftdvrlh1#
在spring Boot 中,你可以注册回调url,一个示例控制器是:
可以像这样测试,注册2个回调,URL http://127.0.0.1:8080/callback/app1被编码,因此它可以是一个参数。
在我的例子中,为了简单起见,客户机和服务器是相同的应用程序,但它们也可以不同。
plupiseo2#
你可以使用Spring5和WebFlux。它是Iterator和Observer模式的结合。客户端总是会得到一个新的Object,只要服务器上有一个。你可以在Spring文档页面或者New in Spring 5: Functional Web Framework上开始学习更多