如何实现REST API的观察者模式?

时间:2018-04-13 09:12:03

标签: spring rest api observer-pattern

我正在寻找创建客户订阅某些数据的REST API。当数据发生变化时(由于某些外部事件),我想通过新数据通知客户端(观察者)。

我想将Spring用于REST API,我不知道如何注册并通知观察者。

一些指导和/或良好做法会非常有帮助。

谢谢

2 个答案:

答案 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) {
            }
        }
    }
}

在我的例子中,为简单起见,客户端和服务器是相同的应用程序,但它们可能不同。