【发布时间】:2019-06-16 14:51:07
【问题描述】:
之前我在 Meteor 和 MongoDB 工作过。当我在处理它时,我注意到如果 Mongo DB 发生任何变化,Meteor 服务器会重新加载数据。
我们可以在 Java 的 Spring Boot 中做这些事情吗?我检查了实时重新加载工具和插件。这些插件和工具在代码更改时重新加载或重新启动服务器,而不是在更改 DB 时。
【问题讨论】:
标签: java mysql spring mongodb meteor
之前我在 Meteor 和 MongoDB 工作过。当我在处理它时,我注意到如果 Mongo DB 发生任何变化,Meteor 服务器会重新加载数据。
我们可以在 Java 的 Spring Boot 中做这些事情吗?我检查了实时重新加载工具和插件。这些插件和工具在代码更改时重新加载或重新启动服务器,而不是在更改 DB 时。
【问题讨论】:
标签: java mysql spring mongodb meteor
我假设您在谈论 MongoDB 更改流。
是的,你可以注册一个监听器:
祈使式风格
可以使用在 MessageListenerContainer 中注册的 MessageListener 来使用更改流事件。容器负责在单独的线程中运行任务,将事件推送到 MessageListener。
@Configuration
class Config {
@Bean
MessageListenerContainer messageListenerContainer(MongoTemplate template) {
return new DefaultMessageListenerContainer(template);
}
}
一旦 MessageListenerContainer 就位,就可以注册 MessageListeners。
MessageListener<ChangeStreamDocument<Document>, Person> messageListener = (message) -> {
System.out.println("Hello " + message.getBody().getFirstname());
};
ChangeStreamRequest<Person> request = ChangeStreamRequest.builder()
.collection("person")
.filter(newAggregation(match(where("operationType").is("insert"))))
.publishTo(messageListener)
.build();
Subscription subscription = messageListenerContainer.register(request, Person.class);
// ...
反应式风格
更改流事件通过连接到更改流的 Flux 直接使用。
Flux changeStream = reactiveTemplate
.changeStream(newAggregation(match(where("operationType").is("insert"))),
Person.class, ChangeStreamOptions.empty(), "person");
changeStream.doOnNext(event -> System.out.println("Hello " + event.getBody().getFirstname()))
.subscribe();
阅读更多相关信息: https://github.com/spring-projects/spring-data-examples/tree/master/mongodb/change-streams
【讨论】:
messageListenerContainer.start(); After register();