首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Neo4jDesktop安装中部署事务事件侦听器

在Neo4jDesktop安装中部署事务事件侦听器
EN

Stack Overflow用户
提问于 2022-01-13 14:22:23
回答 1查看 51关注 0票数 0

我已经创建了一个包含注释为@ServiceProvider的ExtensionFactory子类的项目,该子类返回一个LifecycleAdapter子类,该子类在其start()方法中注册事务事件侦听器,如这个例子所示。守则如下:

代码语言:javascript
复制
@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();
    }
}

它在集成测试中运行良好:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
$ 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是可能的吗?如果有,我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-01-14 14:47:57

在我向META/services添加了提供程序配置文件之后,它就可以工作了,正如https://www.baeldung.com/java-spi中所解释的那样。然后Neo4j找到了它。

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

https://stackoverflow.com/questions/70698187

复制
相关文章

相似问题

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