我已经创建了一个包含注释为@ServiceProvider的ExtensionFactory子类的项目,该子类返回一个LifecycleAdapter子类,该子类在其start()方法中注册事务事件侦听器,如这个例子所示。守则如下:
@ServiceProvider
public class EventListenerExtensionFactory extends ExtensionFactory<EventListenerExtensionFactory.Dependencies> {
private final List<TransactionEventListener<?>> listeners;
public EventListenerExtensionFactory() {
this(List.of(new MyListener()));
}
public EventListenerExtensionFactory(List<TransactionEventListener<?>> listeners) {
super(ExtensionType.DATABASE, "EVENT_LISTENER_EXT_FACTORY");
this.listeners = listeners;
}
@Override
public Lifecycle newInstance(ExtensionContext context, Dependencies dependencies) {
return new EventListenerLifecycleAdapter(dependencies, listeners);
}
@RequiredArgsConstructor
private static class EventListenerLifecycleAdapter extends LifecycleAdapter {
private final Dependencies dependencies;
private final List<TransactionEventListener<?>> listeners;
@Override
public void start() {
DatabaseManagementService managementService = dependencies.databaseManagementService();
listeners.forEach(listener -> managementService.registerTransactionEventListener(
DEFAULT_DATABASE_NAME, listener));
dependencies.log()
.getUserLog(EventListenerExtensionFactory.class)
.info("Registering transaction event listener for database " + DEFAULT_DATABASE_NAME);
}
}
interface Dependencies {
DatabaseManagementService databaseManagementService();
LogService log();
}
}它在集成测试中运行良好:
public AbstractDatabaseTest(TransactionEventListener<?>... listeners) {
URI uri = Neo4jBuilders.newInProcessBuilder()
.withExtensionFactories(List.of(new EventListenerExtensionFactory(List.of(listeners))))
.withDisabledServer()
.build()
.boltURI();
driver = GraphDatabase.driver(uri);
session = driver.session();
}然后在桌面数据库的插件目录中复制jar文件:
$ cp build/libs/<myproject>.jar /mnt/c/Users/albert.gevorgyan/.Neo4jDesktop/relate-data/dbmss/dbms-7fe3cbdb-11b2-4ca2-81eb-474edbbb3dda/plugins/我重新启动了数据库,甚至重新启动了整个桌面Neo4j程序,但它似乎没有标识插件或初始化工厂:在开始事件之后,在neo4j.log中找不到日志消息,而应该被侦听器捕获的事务事件被忽略。有趣的是,我在同一个jar文件中定义的自定义函数实际上有效--我可以在浏览器中调用它。因此,扩展工厂中肯定缺少一些东西,因为它没有被实例化。
在桌面安装中部署ExtensionFactory是可能的吗?如果有,我做错了什么?
发布于 2022-01-14 14:47:57
在我向META/services添加了提供程序配置文件之后,它就可以工作了,正如https://www.baeldung.com/java-spi中所解释的那样。然后Neo4j找到了它。
https://stackoverflow.com/questions/70698187
复制相似问题