在 XWiki 的子维基中注册基于 java 的监听器
Register java based listeners in subwiki's for XWiki
我们正在为各种客户开发一个包含各种类似子维基的维基农场。我真正面临的挑战是,我希望为每个子维基注册不同的(java 基础)听众。此类侦听器的一个示例是侦听保存事件以更改 Wikipage 的标题。为此,我使用存储在 objects 中的模型数据,每个子维基可能不同。为了防止每次触发事件时都必须重新加载这些模型,我希望模型加载一次并 re-use 它。但是,我在过去几天进行了搜索,以找到在 per-wiki 基础上定义/注册等侦听器组件的方法,但我找不到我要找的东西。
有人可以通过(例如)指导我举个例子来帮助我理解如何以这种方式构建这些监听器吗?
非常感谢任何帮助:-)
根据您的需要,您可能至少有 2 个主要解决方案:
- 使用在整个服务器场上安装的单个侦听器(或者
使用 Extension Manager 或仅通过
将 jar 转储到 "lib" 文件夹中)并保留模型的缓存,
使用当前的 wikiID 作为键。这样,当拦截一个
事件,你的监听器会得到当前的 wiki ID(或者来自
上下文或受影响文档的参考)并将其用于
查找内存模型,因此不再需要初始化
每个事件的模型。缓存可以是简单的任何东西
映射到更可配置和可扩展的解决方案,例如使用
XWiki 的缓存模块。
- 使用Wiki组件管理器,实际注册N个实例
您的听众,每个 wiki 一个。为此,您可以:
- Deploy and use the Extension Manager UI to install 您的组件在每个单独的 wiki 上(小心,不是整个农场!)。你
可以通过使您的组件成为
UI/flavor 你在子wiki上安装,这样它就会
当您安装 UI 时自动安装在子维基上
那个子维基。这样,您组件的代码应该只关心
当前的 wiki(它安装在上面)并且只关心
缓存当前wiki的模型。
- 或者,一种编程方法将意味着遍历每个现有的 wiki,并为每个将上下文 wiki 设置为
当前迭代 wiki,动态获取 "wiki"
ComponentManager(在 "Component Module" 的文档中查找 "Namespaced Component Manager"),创建一个新的侦听器实例并
将其注册到该 wiki 组件管理器。此代码将 运行
一次,当 XWiki 实例启动时。然而,你会
必须使这些组件实例保持同步,并且无论何时
新的 wiki 被创建,你必须注册一个新的监听器
也是它的例子。没有声明性的方式 ATM 会
简化这个过程。
我真的不推荐方法 2.2,因为即使可行,它也不必要地复杂。
方法 2.1 编写起来最简单,但需要做一些部署工作(即您的工件需要在配置的 maven 仓库或 XWiki 存储库中可用(也可以查找 "XWiki Repository Application" ) 以便 Extension Manager 可以安装它)。
方法 1 易于实施和部署,因此如果适合您的用例,我推荐它。
编辑:如评论中所述,当前不支持选项 2。有关详细信息,请参阅 XCOMMONS-213。
我们正在为各种客户开发一个包含各种类似子维基的维基农场。我真正面临的挑战是,我希望为每个子维基注册不同的(java 基础)听众。此类侦听器的一个示例是侦听保存事件以更改 Wikipage 的标题。为此,我使用存储在 objects 中的模型数据,每个子维基可能不同。为了防止每次触发事件时都必须重新加载这些模型,我希望模型加载一次并 re-use 它。但是,我在过去几天进行了搜索,以找到在 per-wiki 基础上定义/注册等侦听器组件的方法,但我找不到我要找的东西。
有人可以通过(例如)指导我举个例子来帮助我理解如何以这种方式构建这些监听器吗?
非常感谢任何帮助:-)
根据您的需要,您可能至少有 2 个主要解决方案:
- 使用在整个服务器场上安装的单个侦听器(或者 使用 Extension Manager 或仅通过 将 jar 转储到 "lib" 文件夹中)并保留模型的缓存, 使用当前的 wikiID 作为键。这样,当拦截一个 事件,你的监听器会得到当前的 wiki ID(或者来自 上下文或受影响文档的参考)并将其用于 查找内存模型,因此不再需要初始化 每个事件的模型。缓存可以是简单的任何东西 映射到更可配置和可扩展的解决方案,例如使用 XWiki 的缓存模块。
- 使用Wiki组件管理器,实际注册N个实例
您的听众,每个 wiki 一个。为此,您可以:
- Deploy and use the Extension Manager UI to install 您的组件在每个单独的 wiki 上(小心,不是整个农场!)。你 可以通过使您的组件成为 UI/flavor 你在子wiki上安装,这样它就会 当您安装 UI 时自动安装在子维基上 那个子维基。这样,您组件的代码应该只关心 当前的 wiki(它安装在上面)并且只关心 缓存当前wiki的模型。
- 或者,一种编程方法将意味着遍历每个现有的 wiki,并为每个将上下文 wiki 设置为 当前迭代 wiki,动态获取 "wiki" ComponentManager(在 "Component Module" 的文档中查找 "Namespaced Component Manager"),创建一个新的侦听器实例并 将其注册到该 wiki 组件管理器。此代码将 运行 一次,当 XWiki 实例启动时。然而,你会 必须使这些组件实例保持同步,并且无论何时 新的 wiki 被创建,你必须注册一个新的监听器 也是它的例子。没有声明性的方式 ATM 会 简化这个过程。
我真的不推荐方法 2.2,因为即使可行,它也不必要地复杂。
方法 2.1 编写起来最简单,但需要做一些部署工作(即您的工件需要在配置的 maven 仓库或 XWiki 存储库中可用(也可以查找 "XWiki Repository Application" ) 以便 Extension Manager 可以安装它)。
方法 1 易于实施和部署,因此如果适合您的用例,我推荐它。
编辑:如评论中所述,当前不支持选项 2。有关详细信息,请参阅 XCOMMONS-213。