如何使用Spring Data Couchbase获取Couchbase数据库事件以进行文档创建/删除

问题描述

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

我要寻找的是在我的Spring Boot挂接到的Couchbase存储桶中创建/删除/更新文档时,我想获取这些事件。我已经查找了ApplicationListener >

这是我的CouchbaseListener

    @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.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;

   
    }

但是这不起作用,在沙发床中创建/更新/删除文档时,永远不会调用此类。我错过了一些配置吗?

解决方法

如果您有多个正在运行的应用程序实例,则此方法可能会导致竞速情况。理想情况下,您应该使用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/上打开一张票以寻求适当的例子。