Spring 如何实现RESTAPI的观察者模式&x27;s

Spring 如何实现RESTAPI的观察者模式&x27;s,spring,rest,api,observer-pattern,Spring,Rest,Api,Observer Pattern,我希望创建一个RESTAPI,客户机可以订阅某些数据。当数据发生变化时(由于某些外部事件),我想用新数据通知客户机(观察者) 我想将Spring用于RESTAPI,但我不知道如何注册和通知观察者 一些指导和/或良好实践将非常有用 谢谢您可以将Spring 5与WebFlux一起使用。它是迭代器和观察者模式的组合。每当服务器上有新对象时,客户机总是获取新对象。您可以从Spring文档页面或例如。 我不太愿意给出我的答案,因为另一个更好,但因为我已经完成了一些代码 在spring boot中,您可以

我希望创建一个RESTAPI,客户机可以订阅某些数据。当数据发生变化时(由于某些外部事件),我想用新数据通知客户机(观察者)

我想将Spring用于RESTAPI,但我不知道如何注册和通知观察者

一些指导和/或良好实践将非常有用


谢谢

您可以将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