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

taor4pac  于 2023-02-03  发布在  Spring
关注(0)|答案(2)|浏览(123)

我希望创建一个API,客户端可以订阅特定的数据,当数据发生变化时(由于一些外部事件),我希望通知客户端(观察者)新的数据。
我想使用Spring的REST API的,我不知道如何注册和通知观察者虽然。
一些指导和/或良好做法将非常有帮助。
谢谢

pftdvrlh

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

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

plupiseo

plupiseo2#

你可以使用Spring5和WebFlux。它是Iterator和Observer模式的结合。客户端总是会得到一个新的Object,只要服务器上有一个。你可以在Spring文档页面或者New in Spring 5: Functional Web Framework上开始学习更多

相关问题