活动钩子{ #event-hooks }¶
事件钩子{ #webapi_event_hooks }¶
事件钩子 API 允许用户订阅 DHIS2 内部发生的 Web 事件。DHIS2 会尽最大努力向订阅者发送事件,但这并不保证订阅者一定能收到该事件。
目前,发布的事件主要有两种类型:元数据事件(用于元数据对象的创建、更新和删除),以及调度器事件(用于任何类型的内部计划任务(如分析任务)的运行)。
该端点位于 /api/eventHooks,且必须在 dhis.conf 文件中通过键 event_hooks.enabled = on 启用才能正常工作。
事件钩子主要有两个概念:你需要配置源(包括路径以及要应用的字段过滤器)和一个或多个目标(Webhook、JMS 等)。
为了说明其中的一些要点,我们将通过一个简单的 Webhook 进行演示,该 Webhook 用于监听 dataElements 的元数据变更,并且已启用 Webhook 目标。
除了 source 和 target 之外,还有两个属性需要注意:一个是您提供的 name,它用于在查看用户界面时提供视觉提示;另一个是 disabled,其默认值为 false,但可暂时用于禁用某些当前可能不相关的事件钩子。
{
"name": "webhook-api-token",
"disabled": false,
"source": {
"path": "metadata.dataElement",
"fields": "id,code,name"
},
"targets": [
{
"type": "webhook",
"url": "http://localhost:3000/api/gateway",
"auth": {
"type": "api-token",
"token": "EB3F6799-AA5A-47E8-B6B7-97EA54EB3873"
}
}
]
}
来源{ #source }¶
这里我们将重点讨论事件钩子中的 source.path 部分。对于 path 属性,我们支持两种主要路径:
metadata.type.id,您可以根据需要进行任意细化的设置,例如,使用 metadata 可以监听所有元数据,而使用 metadata.organisationUnit 则仅能监听组织单位的操作。
调度器事件也是如此,其路径为 scheduler.type.id,例如 scheduler.ANALYTICS_TABLE。
此外还支持字段过滤,默认过滤条件为 id,displayName,但您可以自由选择任何所需的字段进行过滤。为了保持系统轻量,不建议请求过大的数据包(因为根据您的路径不同,可能会发生许多事件)
目标{ #target }¶
在准备好 source(包括路径和过滤器)后,您现在必须设置一个或多个目标。所有目标都需要指定 type 属性,而具体的数据负载会根据该属性而有所不同。
控制台{ #console }¶
console 目标是我们拥有的最简单的目标,它没有参数,唯一的作用就是将事件打印到系统日志中(在测试时可能会很有用)
{
"type": "console"
}
Webhook{ #webhook }¶
webhook 目标会向您的目标 url 发送一个出站 HTTP 请求。该请求可选地包含身份验证(同时支持 api-token 和 http-basic),这些功能开箱即用。但如果您有自定义需求,也可以添加任何所需的请求头。 有效载荷将以 application/json 格式发送,其内容取决于您在源中设置的字段过滤器。
{
"type": "webhook",
"url": "http://localhost:3000/api/gateway",
"headers": {},
"auth": {
"type": "api-token",
"token": "EB3F6799-AA5A-47E8-B6B7-97EA54EB3873"
}
}
{
"type": "webhook",
"url": "http://localhost:3000/api/gateway",
"auth": {
"type": "http-basic",
"username": "admin",
"password": "admin"
}
}
Apache Artemis JMS{ #apache-artemis-jms }¶
jms 目标允许您向 Apache Artemis 实例发送 JMS 消息(支持 JMS ⅔)。该目标非常适合对这些事件进行异步处理,并确保服务器在处理过程中不会被阻塞。如果您更倾向于使用 queue,可以将 useQueue 设置为 true。
{
"type": "jms",
"brokerUrl": "tcp://localhost:61616",
"useQueue": false,
"username": "guest",
"password": "guest"
}
Apache Kafka{ #apache-kafka }¶
与 jms 目标类似,使用 kafka 目标可将这些事件发送到 Apache Kafka 实例中。目前尚不支持身份验证。
{
"type": "kafka",
"topic": "dhis2.hooks"
}