用于 MongoDB 数据插入的 Spring 监听器

问题描述 投票:0回答:3

我有一个要求,需要将插入特定 MongoDB 集合的数据实时显示到用户的仪表板上。请注意数据可能是由该用户或其他用户插入的。仪表板是 Spring MVC Web 应用程序的一部分。 MongoDB 数据层是用 Spring Data 编写的。

我打算使用服务器发送事件的方法将新插入的数据推送到仪表板。我正在寻找一种使用 Spring 监听数据插入的有效方法。我什至愿意采用非 Spring 方法来实现侦听器,该侦听器最终将与我的 Spring SSE 发射器通信。

spring mongodb server-sent-events
3个回答
9
投票

如果所有保存都通过 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 是一个使用可尾游标的示例项目。


1
投票

您可以通过 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 来为此提供示例,但方法应该是相同的。


0
投票

可以看看这个库:spring-boot-up-data-mongodb。它允许用户在实体类中声明注释驱动的事件。

@Document
public class ThisEntity {

  ...

  @AfterSaveToMongo
  public void updateDashboard(SourceAndDocument sad) {
    var thisEntity = sad.getSource(ThisEntity.class)
  }
}

顺便说一句,我是这个库的作者。

© www.soinside.com 2019 - 2024. All rights reserved.