我使用spring boot 2.1.3.RELEASE,并使用spring-boot-starter-data-couchbase连接到couchbase数据库。
我正在寻找的是,当在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.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中创建/更新/删除文档时,这个类永远不会被调用。有没有我错过的一些配置。
发布于 2020-08-31 18:26:02
如果您有多个应用程序实例在运行,此方法可能会导致竞争情况。理想情况下,您应该使用CURL和Eventing:
https://blog.couchbase.com/using-curl-eventing-service-update/
关于你的问题,你有没有试过听AfterDeleteEvent,AfterSaveEvent,BeforeConvertEvent,BeforeDeleteEvent,BeforeSaveEvent?
如果这些都不起作用,我建议你在https://jira.spring.io/projects/DATACOUCH/issues/上开一张罚单,询问一个适当的例子。
https://stackoverflow.com/questions/63638153
复制相似问题