在subwiki中注册基于java的侦听器';XWiki的s

在subwiki中注册基于java的侦听器';XWiki的s,java,components,listener,xwiki,Java,Components,Listener,Xwiki,我们正在开发一个wiki服务器场,其中包含用于各种客户端的各种类似子wiki。我真正面临的挑战是,我希望为每个子Wiki注册不同的(基于java的)侦听器。此类侦听器的一个示例是侦听save事件以更改Wikipage的titel。为此,我使用存储在对象中的模型数据,每个子Wiki的对象可能不同。为了避免每次触发事件时都必须重新加载这些模型,我希望该模型加载一次并重新使用。然而,我已经搜索了过去几天的,以找到在每个wiki的基础上定义/注册等侦听器组件的方法,但我找不到我要找的内容 有人能帮我理解

我们正在开发一个wiki服务器场,其中包含用于各种客户端的各种类似子wiki。我真正面临的挑战是,我希望为每个子Wiki注册不同的(基于java的)侦听器。此类侦听器的一个示例是侦听save事件以更改Wikipage的titel。为此,我使用存储在对象中的模型数据,每个子Wiki的对象可能不同。为了避免每次触发事件时都必须重新加载这些模型,我希望该模型加载一次并重新使用。然而,我已经搜索了过去几天的,以找到在每个wiki的基础上定义/注册等侦听器组件的方法,但我找不到我要找的内容

有人能帮我理解如何以这种方式构建这些侦听器吗(例如)请将我引向一个示例


非常感谢您的帮助:-)

根据您的需要,您可能至少有两种主要解决方案:

  • 使用安装在整个服务器场上的单个侦听器(或 使用扩展管理器或仅通过 将jar转储到“lib”文件夹中),并保留模型的缓存, 使用当前wikiID作为密钥。这样,当拦截 事件中,您的侦听器将获取当前wiki ID(从 上下文或受影响文档的引用)并使用它 查找内存中的模型,因此不再需要初始化 每个事件的模型。缓存可以是从简单的 映射到更可配置和可扩展的解决方案,例如使用 XWiki的缓存模块
  • 使用Wiki组件管理器并实际注册N个实例 每个wiki对应一个侦听器。为此,您可以:
  • 每个wiki上的组件(小心,不要在整个服务器场上!)。你 可以通过使组件成为 在子Wiki上安装的UI/flavor,以便 在安装的UI时自动安装在子Wiki上 那个子维基。这样,组件的代码应该只关心 当前wiki(安装在其上),并且只关心 缓存当前wiki的模型
  • 或者,编程方法意味着迭代每个现有wiki,并为每个wiki将上下文wiki设置为 当前迭代的wiki,动态获取“wiki” ComponentManager(在“组件模块”的文档中查找“命名空间组件管理器”),创建侦听器的新实例,并 将其注册到wiki组件管理器。此代码将运行 一次,当XWiki实例启动时。不过,你会的 必须使这些组件实例保持同步,并且 如果创建了新的wiki,则必须注册一个新的侦听器 例如它。没有一种声明性的方式可以 简化这个过程
  • 我并不真的推荐方法2.2,因为即使可能,它也不必要地复杂

    方法2.1是最简单的编写方法,但需要进行一些部署工作(即,您的人工制品需要在配置的maven repo或XWiki存储库中可用(也可以查找“XWiki存储库应用程序”),以便扩展管理器可以安装它)

    方法1易于实现和部署,所以如果这适合您的用例,我推荐它


    编辑:如注释中所述,当前不支持选项2。有关更多详细信息,请参阅。

    加载模型数据是否效率低下?通常,XWiki中的hibernate缓存应该提供合理的性能。(我不知道是否登记到SuiWiki的侦听器是可能的,我猜它不起作用,因此试图解决问题…如果性能是一个问题,你可以使用一个地图WikMAME->数据并在那里存储你的数据。)如果我们不能在SubWiki基础上注册侦听器,那就是我们所考虑的。谢谢你的建议。在1之后,我们转到了2.1,因为我们喜欢靠近XWiki系统(我们有自己的回购协议)。但是,当我在第二个子wiki上安装侦听器时(在第一个子wiki上安装之后),我会收到已在同一ID下安装的消息(在本例中为SaveListener)。这让我考虑使用选项2.2。但我不确定这是否明智之举,因为它看起来确实相当复杂。因此,根据你的评估,我想2.1是最好的选择。但是:我不知道如何以只在subwiki上注册的方式安装侦听器。你是对的,2.1当前不受支持。它已经存在一个问题。请参考,作为一个组件,您的侦听器基本上是在wiki级别注册的,但作为一个侦听器,它是在根级别注册的,
    ObservationManager
    存在,因此会污染根级别的侦听器。您可以尝试解决方法(使用不同的/生成的侦听器名称),但我不确定这是否值得。我目前为每个子Wiki注册了不同的侦听器,并使用基于子Wiki的名称。这意味着在X subwiki所在的服务器场中,将有X个侦听器响应保存(在我的例子中)。通过检查子维基,我可以过滤调用。在我看来,文档实际上只保存了一次(基于版本历史记录)。现在,这对我们来说是可行的:运行4个侦听器需要相同的毫秒,我们不希望有1000个subwiki在运行。我必须看看什么是可行的,特别是因为我有一个具有相同要求的删除侦听器。很高兴听到你找到了一个可接受的解决方案。你会考虑这个问题吗?如果是,请相应地标记。谢谢