首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用spring data couchbase获取用于文档创建/删除的couchbase db事件

如何使用spring data couchbase获取用于文档创建/删除的couchbase db事件
EN

Stack Overflow用户
提问于 2020-08-29 01:05:05
回答 1查看 114关注 0票数 0

我使用spring boot 2.1.3.RELEASE,并使用spring-boot-starter-data-couchbase连接到couchbase数据库。

我正在寻找的是,当在couchbase存储桶中创建/删除/更新文档时,我希望获得这些事件。我查了一下ApplicationListener>

这是我的CouchbaseListener

代码语言:javascript
运行
复制
    @Component
public class CouchbaseEventListener<E> implements ApplicationListener<CouchbaseMappingEvent<?>> {

    private static final Logger logger = LoggerFactory.getLogger(CouchbaseEventListener.class.getName());

    private final Class<?> domainClass;


    private static final String UNKNOWN = "unknown";

    String getKeyValue(CouchbaseDocument doc, String keyName, String def) {
        return doc.containsKey(keyName) ? (String)doc.get(keyName) : def;
    }
    String getKeyValue(CouchbaseDocument doc, String keyName) {
        return getKeyValue(doc, keyName, UNKNOWN);
    }


    public CouchbaseEventListener () {
        Class<?> typeArgument = GenericTypeResolver.resolveTypeArgument(getClass(), AbstractCouchbaseEventListener.class);
        domainClass = typeArgument == null ? Object.class : typeArgument;
    }

    @SuppressWarnings("rawtypes")
    public void onApplicationEvent(CouchbaseMappingEvent<?> event) {

        E source = (E) event.getSource();
        // Check for matching domain type and invoke callbacks
        if (source != null && !domainClass.isAssignableFrom(source.getClass())) {
            return;
        }

        if (event instanceof BeforeDeleteEvent) {
            logger.info("================= BeforeDeleteEvent() {}, {}", event.getSource(), event.getDocument());
            onBeforeDelete(event.getSource(), event.getDocument());
            return;
        }
        else if (event instanceof AfterDeleteEvent) {
            onAfterDelete(event.getSource(), event.getDocument());
            return;
        }

        if (event instanceof BeforeConvertEvent) {
            onBeforeConvert(source);
        }
        else if (event instanceof BeforeSaveEvent) {
            logger.info("================= BeforeSaveEvent() {}, {}", event.getSource(), event.getDocument());
            onBeforeSave(source, event.getDocument());
        }
        else if (event instanceof AfterSaveEvent) {
            onAfterSave(source, event.getDocument());
        }
    }


    public void onBeforeConvert(E source) {
      // Something goes here
    }

    public void onBeforeSave(E source, CouchbaseDocument doc) {
    }

    public void onAfterSave(E source, CouchbaseDocument doc) {
        if (doc!=null) {
            String id = (String)doc.getId();
            String wellId = getKeyValue(doc, "wellId", "(null)");
            String data = getFullEventDataString(source, doc, id);
            if (data != null) {
                logger.info("Hello Here := onAfterSave() . {}", data);
            }
        }
    }

    public void onAfterDelete(Object source, CouchbaseDocument doc) {
      // something goes here
 
    }

    public void onBeforeDelete(Object source, CouchbaseDocument doc) {
    }

    @Autowired
    private ApplicationContext appContext;

   
    }

但是这不起作用,当在couchbase中创建/更新/删除文档时,这个类永远不会被调用。有没有我错过的一些配置。

EN

Stack Overflow用户

发布于 2020-08-31 18:26:02

如果您有多个应用程序实例在运行,此方法可能会导致竞争情况。理想情况下,您应该使用CURL和Eventing:

https://blog.couchbase.com/using-curl-eventing-service-update/

关于你的问题,你有没有试过听AfterDeleteEvent,AfterSaveEvent,BeforeConvertEvent,BeforeDeleteEvent,BeforeSaveEvent?

https://docs.spring.io/spring-data/couchbase/docs/current/api/org/springframework/data/couchbase/core/mapping/event/CouchbaseMappingEvent.html

如果这些都不起作用,我建议你在https://jira.spring.io/projects/DATACOUCH/issues/上开一张罚单,询问一个适当的例子。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63638153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档