我有一个要求,需要将插入特定 MongoDB 集合的数据实时显示到用户的仪表板上。请注意数据可能是由该用户或其他用户插入的。仪表板是 Spring MVC Web 应用程序的一部分。 MongoDB 数据层是用 Spring Data 编写的。
我打算使用服务器发送事件的方法将新插入的数据推送到仪表板。我正在寻找一种使用 Spring 监听数据插入的有效方法。我什至愿意采用非 Spring 方法来实现侦听器,该侦听器最终将与我的 Spring SSE 发射器通信。
如果所有保存都通过 spring-data 层,那么您可以使用 Mongo Listener 生命周期事件 docs。
@Component
public class MongoListener extends AbstractMongoEventListener<Account>
{
@Override
public void onAfterSave(AfterSaveEvent<E> event) {
if (LOG.isDebugEnabled()) {
LOG.debug("onAfterSave({}, {})", event.getSource(), event.getDocument());
}
}
}
如果没有,您将必须读取 mongo oplog 并处理或创建一个上限集合并使用可尾游标。
here 是一个使用可尾游标的示例项目。
您可以通过 MongoDB 中的 OpLog 集合 和 Tailable Cursors 来完成此操作。例如,通过 MongoDB 框架(例如 MongoDB Java 驱动程序)使用标志
QUERYOPTION_TAILABLE | QUERYOPTION_AWAITDATA
获取 MongoDB OpLog Collection,并执行以下查询
MongoCursor<> cursor = db.getCollection('oplog.rs').find({ns:"collectionName", op:"i"})
其中
"collectionName"
是您的集合的名称,"i"
是插入操作。从光标接收事件后,您可以将事件发送到共享流中。
不幸的是,我不熟悉 Spring Data 来为此提供示例,但方法应该是相同的。
可以看看这个库:spring-boot-up-data-mongodb。它允许用户在实体类中声明注释驱动的事件。
@Document
public class ThisEntity {
...
@AfterSaveToMongo
public void updateDashboard(SourceAndDocument sad) {
var thisEntity = sad.getSource(ThisEntity.class)
}
}
顺便说一句,我是这个库的作者。