问题描述
我正在使用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://jira.spring.io/projects/DATACOUCH/issues/上打开一张票以寻求适当的例子。