blob: f84d934d14171072e82a73b952937b0f84fefcdb [file] [log] [blame]
<!DOCTYPE html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.61" />
<meta name="theme" content="VuePress Theme Hope" />
<link rel="alternate" hreflang="en-us" href="https://iotdb.apache.org/UserGuide/V0.13.x/Process-Data/Triggers.html"><meta property="og:url" content="https://iotdb.apache.org/zh/UserGuide/V0.13.x/Process-Data/Triggers.html"><meta property="og:site_name" content="IoTDB Website"><meta property="og:description" content="触发器 触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据清洗、数据转发等功能。 触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态装载、卸载触发器,在装载、卸载期间,无需启停服务器。 根据此文档,您将会很快学会触发器的编写与管理。 编写触发器 触发器依赖 触发器的..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="og:locale:alternate" content="en-US"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"","image":[""],"dateModified":null,"author":[]}</script><link rel="icon" href="/favicon.ico"><meta name="Description" content="Apache IoTDB: Time Series Database for IoT"><meta name="Keywords" content="TSDB, time series, time series database, IoTDB, IoT database, IoT data management,时序数据库, 时间序列管理, IoTDB, 物联网数据库, 实时数据库, 物联网数据管理, 物联网数据"><meta name="baidu-site-verification" content="wfKETzB3OT"><meta name="google-site-verification" content="mZWAoRY0yj_HAr-s47zHCGHzx5Ju-RVm5wDbPnwQYFo"><title>IoTDB Website</title><meta name="description" content="触发器 触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据清洗、数据转发等功能。 触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态装载、卸载触发器,在装载、卸载期间,无需启停服务器。 根据此文档,您将会很快学会触发器的编写与管理。 编写触发器 触发器依赖 触发器的...">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-2f652485.css" as="style"><link rel="stylesheet" href="/assets/style-2f652485.css">
<link rel="modulepreload" href="/assets/app-cbe6e1e7.js"><link rel="modulepreload" href="/assets/framework-44b8a372.js"><link rel="modulepreload" href="/assets/Triggers.html-954d06be.js"><link rel="modulepreload" href="/assets/Triggers.html-d78304f0.js">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="skip-link sr-only">跳至主要內容</a><!--]--><!--[--><div class="theme-container has-toc"><!--[--><header class="navbar hide-icon" id="navbar"><div class="navbar-start"><button class="toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><a href="/zh/" class="brand"><img class="logo" src="/logo.png" alt="IoTDB Website"><!----><span class="site-name hide-in-pad">IoTDB Website</span></a><!--[--><!----><!--]--></div><div class="navbar-center"><!--[--><!----><!--]--><!--[--><!----><!--]--></div><div class="navbar-end"><!--[--><!----><!--]--><div id="docsearch-container"></div><nav class="nav-links"><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="文档"><span class="title"><!---->文档</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="/zh/UserGuide/Master/QuickStart/QuickStart.html" class="nav-link" aria-label="latest"><!---->latest<!----></a></li><li class="dropdown-item"><a href="/zh/UserGuide/V1.2.x/QuickStart/QuickStart.html" class="nav-link" aria-label="v1.2.x"><!---->v1.2.x<!----></a></li><li class="dropdown-item"><a href="/zh/UserGuide/V1.1.x/QuickStart/QuickStart.html" class="nav-link" aria-label="v1.1.x"><!---->v1.1.x<!----></a></li><li class="dropdown-item"><a href="/zh/UserGuide/V1.0.x/QuickStart/QuickStart.html" class="nav-link" aria-label="v1.0.x"><!---->v1.0.x<!----></a></li><li class="dropdown-item"><a href="/zh/UserGuide/V0.13.x/QuickStart/QuickStart.html" class="nav-link" aria-label="v0.13.x"><!---->v0.13.x<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=177051872" rel="noopener noreferrer" target="_blank" aria-label="系统设计" class="nav-link"><!---->系统设计<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="nav-item hide-in-mobile"><a href="/zh/Download/" class="nav-link" aria-label="下载"><!---->下载<!----></a></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="社区"><span class="title"><!---->社区</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="/zh/Community/About.html" class="nav-link" aria-label="关于社区"><!---->关于社区<!----></a></li><li class="dropdown-item"><a href="https://cwiki.apache.org/confluence/display/iotdb" rel="noopener noreferrer" target="_blank" aria-label="Wiki" class="nav-link"><!---->Wiki<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="/zh/Community/Community-Project-Committers.html" class="nav-link" aria-label="开发人员"><!---->开发人员<!----></a></li><li class="dropdown-item"><a href="/zh/Community/Community-Powered-By.html" class="nav-link" aria-label="技术支持"><!---->技术支持<!----></a></li><li class="dropdown-item"><a href="/Community/Materials.html" class="nav-link" aria-label="活动与报告"><!---->活动与报告<!----></a></li><li class="dropdown-item"><a href="/zh/Community/Feedback.html" class="nav-link" aria-label="交流与反馈"><!---->交流与反馈<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="开发"><span class="title"><!---->开发</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="/zh/Development/VoteRelease.html" class="nav-link" aria-label="如何投票"><!---->如何投票<!----></a></li><li class="dropdown-item"><a href="/zh/Development/HowToCommit.html" class="nav-link" aria-label="如何提交代码"><!---->如何提交代码<!----></a></li><li class="dropdown-item"><a href="/zh/Development/HowToJoin.html" class="nav-link" aria-label="成为Contributor"><!---->成为Contributor<!----></a></li><li class="dropdown-item"><a href="/zh/Development/Committer.html" class="nav-link" aria-label="成为Committer"><!---->成为Committer<!----></a></li><li class="dropdown-item"><a href="/zh/Development/ContributeGuide.html" class="nav-link" aria-label="项目开发指南"><!---->项目开发指南<!----></a></li><li class="dropdown-item"><a href="/zh/Development/HowtoContributeCode.html" class="nav-link" aria-label="技术贡献指南"><!---->技术贡献指南<!----></a></li><li class="dropdown-item"><a href="/zh/Development/format-changelist.html" class="nav-link" aria-label="TsFile的更改列表"><!---->TsFile的更改列表<!----></a></li><li class="dropdown-item"><a href="/zh/Development/rpc-changelist" class="nav-link" aria-label="RPC变更清单"><!---->RPC变更清单<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="ASF"><span class="title"><!---->ASF</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="https://www.apache.org/" rel="noopener noreferrer" target="_blank" aria-label="基金会" class="nav-link"><!---->基金会<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/licenses/" rel="noopener noreferrer" target="_blank" aria-label="许可证" class="nav-link"><!---->许可证<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/security/" rel="noopener noreferrer" target="_blank" aria-label="安全" class="nav-link"><!---->安全<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/foundation/sponsorship.html" rel="noopener noreferrer" target="_blank" aria-label="赞助" class="nav-link"><!---->赞助<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/foundation/thanks.html" rel="noopener noreferrer" target="_blank" aria-label="致谢" class="nav-link"><!---->致谢<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/events/current-event" rel="noopener noreferrer" target="_blank" aria-label="活动" class="nav-link"><!---->活动<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li></ul></button></div></div></nav><div class="nav-item"><div class="dropdown-wrapper i18n-dropdown"><button class="dropdown-title" type="button" aria-label="选择语言"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon i18n-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="i18n icon" style="width:1rem;height:1rem;vertical-align:middle;"><path d="M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"></path></svg><!--]--><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="/UserGuide/V0.13.x/Process-Data/Triggers.html" class="nav-link" aria-label="English"><!---->English<!----></a></li><li class="dropdown-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html" class="router-link-active router-link-exact-active nav-link active" aria-label="简体中文"><!---->简体中文<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><button id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><div class="nav-item"><a class="repo-link" href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><!--[--><!----><!--]--><button class="toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span class="button-container"><span class="button-top"></span><span class="button-middle"></span><span class="button-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside class="sidebar" id="sidebar"><!--[--><!----><!--]--><ul class="sidebar-links"><li><section class="sidebar-group"><p class="sidebar-heading"><!----><span class="title">IoTDB用户手册 (V0.13.x)</span><!----></p><ul class="sidebar-links"></ul></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">IoTDB简介</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">快速上手</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">数据模式与概念</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">语法约定</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">应用编程接口</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">元数据操作</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">数据写入和删除</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">数据查询</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable active"><!----><span class="title">数据处理</span><span class="arrow down"></span></button><ul class="sidebar-links"><li><!--[--><a href="/zh/UserGuide/V0.13.x/Process-Data/UDF-User-Defined-Function.html" class="nav-link sidebar-link sidebar-page" aria-label="用户定义函数(UDF)"><!---->用户定义函数(UDF)<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/UserGuide/V0.13.x/Process-Data/Select-Into.html" class="nav-link sidebar-link sidebar-page" aria-label="查询写回(SELECT INTO)"><!---->查询写回(SELECT INTO)<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/UserGuide/V0.13.x/Process-Data/Continuous-Query.html" class="nav-link sidebar-link sidebar-page" aria-label="连续查询(CQ)"><!---->连续查询(CQ)<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html" class="router-link-active router-link-exact-active nav-link active sidebar-link sidebar-page active" aria-label="触发器"><!---->触发器<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#触发器" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="触发器"><!---->触发器<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#编写触发器" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="编写触发器"><!---->编写触发器<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#管理触发器" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="管理触发器"><!---->管理触发器<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#实用工具类" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="实用工具类"><!---->实用工具类<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#完整的-maven-示例项目" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="完整的 Maven 示例项目"><!---->完整的 Maven 示例项目<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#重要注意事项-1" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="重要注意事项"><!---->重要注意事项<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li></ul><!--]--></li><li><!--[--><a href="/zh/UserGuide/V0.13.x/Process-Data/Alerting.html" class="nav-link sidebar-link sidebar-page" aria-label="告警机制"><!---->告警机制<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li></ul></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">权限管理</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">运维工具</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">系统集成</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">UDF 资料库</span><span class="arrow end"></span></button><!----></section></li><li><section class="sidebar-group"><button class="sidebar-heading clickable"><!----><span class="title">参考</span><span class="arrow end"></span></button><!----></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main class="page" id="main-content"><!--[--><!----><nav class="breadcrumb disable"></nav><div class="page-title"><h1><!----></h1><div class="page-info"><!----><!----><!----><!----><span class="page-reading-time-info" aria-label="阅读时间"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 19 分钟</span><meta property="timeRequired" content="PT19M"></span><!----><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#触发器" class="router-link-active router-link-exact-active toc-link level2">触发器</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#编写触发器" class="router-link-active router-link-exact-active toc-link level3">编写触发器</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#管理触发器" class="router-link-active router-link-exact-active toc-link level3">管理触发器</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#实用工具类" class="router-link-active router-link-exact-active toc-link level3">实用工具类</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#完整的-maven-示例项目" class="router-link-active router-link-exact-active toc-link level3">完整的 Maven 示例项目</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/UserGuide/V0.13.x/Process-Data/Triggers.html#重要注意事项-1" class="router-link-active router-link-exact-active toc-link level3">重要注意事项</a></li><!----><!--]--></ul><!--]--></ul></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
--><h2 id="触发器" tabindex="-1"><a class="header-anchor" href="#触发器" aria-hidden="true">#</a> 触发器</h2><p>触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据清洗、数据转发等功能。</p><p>触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态装载、卸载触发器,在装载、卸载期间,无需启停服务器。</p><p>根据此文档,您将会很快学会触发器的编写与管理。</p><h3 id="编写触发器" tabindex="-1"><a class="header-anchor" href="#编写触发器" aria-hidden="true">#</a> 编写触发器</h3><h4 id="触发器依赖" tabindex="-1"><a class="header-anchor" href="#触发器依赖" aria-hidden="true">#</a> 触发器依赖</h4><p>触发器的逻辑需要您编写 Java 类进行实现。</p><p>在编写触发器逻辑时,需要使用到下面展示的依赖。如果您使用 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>,则可以直接从 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven 库<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> 中搜索到它们。</p><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>iotdb-server<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">&gt;</span></span>0.13.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>scope</span><span class="token punctuation">&gt;</span></span>provided<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>scope</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>请注意选择和目标服务器版本相同的依赖版本。</p><h4 id="用户编程接口" tabindex="-1"><a class="header-anchor" href="#用户编程接口" aria-hidden="true">#</a> 用户编程接口</h4><p>编写一个触发器需要实现<code>org.apache.iotdb.db.engine.trigger.api.Trigger</code>类。</p><p>该类提供了两类编程接口:<strong>生命周期钩子</strong><strong>数据变动侦听钩子</strong>。该类中所有的接口都不是必须实现的,当您不实现它们时,它们不会对流经的数据操作产生任何响应。您可以根据实际需要,只实现其中若干接口。</p><p>下面是所有可供用户进行实现的接口的说明。</p><h5 id="生命周期钩子" tabindex="-1"><a class="header-anchor" href="#生命周期钩子" aria-hidden="true">#</a> 生命周期钩子</h5><table><thead><tr><th style="text-align:left;">接口定义</th><th>描述</th></tr></thead><tbody><tr><td style="text-align:left;"><code>void onCreate(TriggerAttributes attributes) throws Exception</code></td><td>当您使用<code>CREATE TRIGGER</code>语句注册触发器后,该钩子会被调用一次。在每一个实例的生命周期内,该钩子会且仅仅会被调用一次。该钩子主要有如下作用:1. 帮助用户解析 SQL 语句中的自定义属性(使用<code>TriggerAttributes</code>)。 2. 创建或申请资源,如建立外部链接、打开文件等。</td></tr><tr><td style="text-align:left;"><code>void onDrop() throws Exception</code></td><td>当您使用<code>DROP TRIGGER</code>语句删除触发器后,该钩子会被调用。在每一个实例的生命周期内,该钩子会且仅仅会被调用一次。该钩子的主要作用是进行一些资源释放等的操作。</td></tr><tr><td style="text-align:left;"><code>void onStart() throws Exception</code></td><td>当您使用<code>START TRIGGER</code>语句手动启动(被<code>STOP TRIGGER</code>语句停止的)触发器后,该钩子会被调用。</td></tr><tr><td style="text-align:left;"><code>void onStop() throws Exception</code></td><td>当您使用<code>STOP TRIGGER</code>语句手动停止触发器后,该钩子会被调用。</td></tr></tbody></table><h5 id="数据变动侦听钩子" tabindex="-1"><a class="header-anchor" href="#数据变动侦听钩子" aria-hidden="true">#</a> 数据变动侦听钩子</h5><p>目前触发器仅能侦听数据插入的操作。</p><p>数据变动侦听钩子的调用时机由<code>CREATE TRIGGER</code>语句显式指定,在编程接口层面不作区分。</p><h6 id="单点数据插入侦听钩子" tabindex="-1"><a class="header-anchor" href="#单点数据插入侦听钩子" aria-hidden="true">#</a> 单点数据插入侦听钩子</h6><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">Integer</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Integer</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Long</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Long</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Float</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Float</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Double</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Double</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Boolean</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Boolean</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Binary</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Binary</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>对于注册序列上的每一点数据插入,触发器都会调用<code>fire</code>作为响应,钩子的入参<code>timestamp</code><code>value</code>即是这一次插入数据点的时间和数据值。您可以在<code>fire</code>钩子中编写处理数据的任意逻辑。</p><p>注意,目前钩子的返回值是没有任何意义的。</p><h6 id="批量数据插入侦听钩子" tabindex="-1"><a class="header-anchor" href="#批量数据插入侦听钩子" aria-hidden="true">#</a> 批量数据插入侦听钩子</h6><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token keyword">float</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">float</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token keyword">boolean</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">boolean</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
<span class="token class-name">Binary</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token class-name">Binary</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果您需要在业务场景中使用到 Session API 的<code>insertTablet</code>接口或<code>insertTablets</code>接口,那么您可以通过实现上述数据插入的侦听钩子来降低触发器的调用开销。</p><p>推荐您在实现上述批量数据插入的侦听钩子时, 保证批量数据插入侦听钩子与单点数据插入侦听钩子的行为具有一致性。当您不实现批量数据插入的侦听钩子时,它将遵循下面的默认逻辑。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">default</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> size <span class="token operator">=</span> timestamps<span class="token punctuation">.</span>length<span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> size<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">fire</span><span class="token punctuation">(</span>timestamps<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> values<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> values<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意,目前钩子的返回值是没有任何意义的。</p><h5 id="重要注意事项" tabindex="-1"><a class="header-anchor" href="#重要注意事项" aria-hidden="true">#</a> 重要注意事项</h5><ul><li>每条序列上注册的触发器都是一个完整的触发器类的实例,因此您可以在触发器中维护一些状态数据。</li><li>触发器维护的状态会在系统停止后被清空(除非您在钩子中主动将状态持久化)。换言之,系统启动后触发器的状态将会默认为初始值。</li><li>一个触发器所有钩子的调用都是串行化的。</li></ul><h3 id="管理触发器" tabindex="-1"><a class="header-anchor" href="#管理触发器" aria-hidden="true">#</a> 管理触发器</h3><p>您可以通过 SQL 语句注册、卸载、启动或停止一个触发器实例,您也可以通过 SQL 语句查询到所有已经注册的触发器。</p><h4 id="触发器的状态" tabindex="-1"><a class="header-anchor" href="#触发器的状态" aria-hidden="true">#</a> 触发器的状态</h4><p>触发器有两种运行状态:<code>STARTED</code><code>STOPPED</code>,您需要执行<code>START TRIGGER</code>或者<code>STOP TRIGGER</code>来启动或者停止一个触发器。</p><p>当一个触发器的状态为<code>STOPPED</code>时,它将不会响应被注册序列上的操作(如插入数据点的操作),对外表现就会像是这个序列没有被注册过触发器一样,但是它会保存所有的状态(触发器类变量)信息,同时也会保存所有的注册信息。</p><p>注意,通过<code>CREATE TRIGGER</code>语句注册的触发器默认是<code>STARTED</code>的。</p><h4 id="注册触发器" tabindex="-1"><a class="header-anchor" href="#注册触发器" aria-hidden="true">#</a> 注册触发器</h4><p>触发器只能注册在一个已经存在的时间序列上。任何时间序列只允许注册一个触发器。</p><p>被注册有触发器的序列将会被触发器侦听,当序列上有数据变动时,触发器中对应的钩子将会被调用。</p><p>注册一个触发器可以按如下流程进行:</p><ol><li><p>实现一个完整的 Trigger 类,假定这个类的全类名为<code>org.apache.iotdb.db.engine.trigger.example.AlertListener</code></p></li><li><p>将项目打成 JAR 包,如果您使用 Maven 管理项目,可以参考上述 Maven 项目示例的写法</p></li><li><p>将 JAR 包放置到目录 <code>iotdb-server-0.13.0-SNAPSHOT/ext/trigger</code> (也可以是<code>iotdb-server-0.13.0-SNAPSHOT/ext/trigger</code>的子目录)下。</p><blockquote><p>您可以通过修改配置文件中的<code>trigger_root_dir</code>来指定加载触发器 JAR 包的根路径。</p></blockquote></li><li><p>使用 SQL 语句注册该触发器,假定赋予该触发器的名字为<code>alert-listener-sg1d1s1</code></p></li><li><p>使用<code>CREATE TRIGGER</code>语句注册该触发器</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>alert-listener-sg1d1s1<span class="token punctuation">`</span></span>
<span class="token keyword">AFTER</span> <span class="token keyword">INSERT</span>
<span class="token keyword">ON</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1
<span class="token keyword">AS</span> <span class="token string">&#39;org.apache.iotdb.db.engine.trigger.example.AlertListener&#39;</span>
<span class="token keyword">WITH</span> <span class="token punctuation">(</span>
<span class="token string">&#39;lo&#39;</span> <span class="token operator">=</span> <span class="token string">&#39;0&#39;</span><span class="token punctuation">,</span>
<span class="token string">&#39;hi&#39;</span> <span class="token operator">=</span> <span class="token string">&#39;100.0&#39;</span>
<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li></ol><p>注册触发器的详细 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token operator">&lt;</span><span class="token keyword">TRIGGER</span><span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
<span class="token punctuation">(</span>BEFORE <span class="token operator">|</span> <span class="token keyword">AFTER</span><span class="token punctuation">)</span> <span class="token keyword">INSERT</span>
<span class="token keyword">ON</span> <span class="token operator">&lt;</span><span class="token keyword">FULL</span><span class="token operator">-</span>PATH<span class="token operator">&gt;</span>
<span class="token keyword">AS</span> <span class="token operator">&lt;</span>CLASSNAME<span class="token operator">&gt;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>同时,您还可以通过<code>WITH</code>子句传入任意数量的自定义属性值:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token operator">&lt;</span><span class="token keyword">TRIGGER</span><span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
<span class="token punctuation">(</span>BEFORE <span class="token operator">|</span> <span class="token keyword">AFTER</span><span class="token punctuation">)</span> <span class="token keyword">INSERT</span>
<span class="token keyword">ON</span> <span class="token operator">&lt;</span><span class="token keyword">FULL</span><span class="token operator">-</span>PATH<span class="token operator">&gt;</span>
<span class="token keyword">AS</span> <span class="token operator">&lt;</span>CLASSNAME<span class="token operator">&gt;</span>
<span class="token keyword">WITH</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span><span class="token keyword">KEY</span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">&gt;=</span><span class="token operator">&lt;</span><span class="token keyword">VALUE</span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">&gt;</span><span class="token punctuation">,</span>
<span class="token operator">&lt;</span><span class="token keyword">KEY</span><span class="token operator">-</span><span class="token number">2</span><span class="token operator">&gt;=</span><span class="token operator">&lt;</span><span class="token keyword">VALUE</span><span class="token operator">-</span><span class="token number">2</span><span class="token operator">&gt;</span><span class="token punctuation">,</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>TRIGGER-NAME</code>是用于标定触发器的全局唯一 ID,它是大小写敏感的。</p><p>目前触发器可以侦听序列上的所有的数据插入操作,触发器可以选择在数据插入前(<code>BEFORE INSERT</code>)或者数据插入后(<code>AFTER INSERT</code>)触发钩子调用。</p><p><code>FULL-PATH</code>是触发器侦听的目标序列名称,这个序列必须是一个测点。</p><p><code>CLASSNAME</code>是触发器类的全类名。</p><p>请注意,<code>CLASSNAME</code>以及属性值中的<code>KEY</code><code>VALUE</code>都需要被单引号或者双引号引用起来。</p><h4 id="卸载触发器" tabindex="-1"><a class="header-anchor" href="#卸载触发器" aria-hidden="true">#</a> 卸载触发器</h4><p>触发器会在下面几种情景下被卸载:</p><ol><li>用户执行<code>DELETE TIMESERIES</code>时,序列上注册的触发器会被卸载</li><li>用户执行<code>DELETE STORAGE GROUP</code>时,对应存储组下注册的触发器会全部被卸载</li><li>用户使用<code>DROP TRIGGER</code>语句主动卸载</li></ol><p>卸载触发器的 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token keyword">TRIGGER</span> <span class="token operator">&lt;</span><span class="token keyword">TRIGGER</span><span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>TRIGGER-NAME</code>是用于标定触发器的全局唯一 ID。</p><p>下面是一个<code>DROP TRIGGER</code>语句的例子:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>alert-listener-sg1d1s1<span class="token punctuation">`</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4 id="启动触发器" tabindex="-1"><a class="header-anchor" href="#启动触发器" aria-hidden="true">#</a> 启动触发器</h4><p>该操作是“停止触发器”的逆操作。它将运行状态为<code>STOPPED</code>的触发器的运行状态变更为<code>STARTED</code>,这会使得触发器重新侦听被注册序列上的操作,并对数据变动产生响应。</p><p>启动触发器的 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">START</span> <span class="token keyword">TRIGGER</span> <span class="token operator">&lt;</span><span class="token keyword">TRIGGER</span><span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>TRIGGER-NAME</code>是用于标定触发器的全局唯一 ID。</p><p>下面是一个<code>START TRIGGER</code>语句的例子:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">START</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>alert-listener-sg1d1s1<span class="token punctuation">`</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>注意,通过<code>CREATE TRIGGER</code>语句注册的触发器默认是<code>STARTED</code>的。</p><h4 id="停止触发器" tabindex="-1"><a class="header-anchor" href="#停止触发器" aria-hidden="true">#</a> 停止触发器</h4><p>该操作将触发器的状态由<code>STARTED</code>变为<code>STOPPED</code>。当一个触发器的状态为<code>STOPPED</code>时,它将不会响应被注册序列上的操作(如插入数据点的操作),对外表现就会像是这个序列没有被注册过触发器一样。您可以使用<code>START TRIGGER</code>语句重新启动一个触发器。</p><p>停止触发器的 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code>STOP <span class="token keyword">TRIGGER</span> <span class="token operator">&lt;</span><span class="token keyword">TRIGGER</span><span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>TRIGGER-NAME</code>是用于标定触发器的全局唯一 ID。</p><p>下面是一个<code>STOP TRIGGER</code>语句的例子:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code>STOP <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>alert-listener-sg1d1s1<span class="token punctuation">`</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4 id="查询所有注册的触发器" tabindex="-1"><a class="header-anchor" href="#查询所有注册的触发器" aria-hidden="true">#</a> 查询所有注册的触发器</h4><p>查询触发器的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SHOW</span> TRIGGERS
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>该语句展示已注册触发器的 ID、运行状态、触发时机、被注册的序列、触发器实例的全类名和注册触发器时用到的自定义属性。</p><h4 id="用户权限管理" tabindex="-1"><a class="header-anchor" href="#用户权限管理" aria-hidden="true">#</a> 用户权限管理</h4><p>用户在使用触发器时会涉及到 4 种权限:</p><ul><li><code>CREATE_TRIGGER</code>:具备该权限的用户才被允许注册触发器操作。该权限需要与触发器的路径绑定。</li><li><code>DROP_TRIGGER</code>:具备该权限的用户才被允许卸载触发器操作。该权限需要与触发器的路径绑定。</li><li><code>START_TRIGGER</code>:具备该权限的用户才被允许启动已被停止的触发器。该权限需要与触发器的路径绑定。</li><li><code>STOP_TRIGGER</code>:具备该权限的用户才被允许停止正在运行的触发器。该权限需要与触发器的路径绑定。</li></ul><p>更多用户权限相关的内容,请参考 <a href="/zh/UserGuide/V0.13.x/Administration-Management/Administration.html" class="">权限管理语句</a></p><h3 id="实用工具类" tabindex="-1"><a class="header-anchor" href="#实用工具类" aria-hidden="true">#</a> 实用工具类</h3><p>实用工具类为常见的需求提供了编程范式和执行框架,它能够简化您编写触发器的一部分工作。</p><h4 id="窗口工具类" tabindex="-1"><a class="header-anchor" href="#窗口工具类" aria-hidden="true">#</a> 窗口工具类</h4><p>窗口工具类能够辅助您定义滑动窗口以及窗口上的数据处理逻辑。它能够构造两类滑动窗口:一种滑动窗口是固定窗口内时间长度的(<code>SlidingTimeWindowEvaluationHandler</code>),另一种滑动窗口是固定窗口内数据点数的(<code>SlidingSizeWindowEvaluationHandler</code>)。</p><p>窗口工具类允许您在窗口(<code>Window</code>)上定义侦听钩子(<code>Evaluator</code>)。每当一个新的窗口形成,您定义的侦听钩子就会被调用一次。您可以在这个侦听钩子内定义任何数据处理相关的逻辑。侦听钩子的调用是异步的,因此,在执行钩子内窗口处理逻辑的时候,是不会阻塞当前线程的。</p><p>值得注意的是,不论是<code>SlidingTimeWindowEvaluationHandler</code>还是<code>SlidingSizeWindowEvaluationHandler</code>,他们都<strong>只能够处理时间戳严格单调递增的序列</strong>,传入的不符合要求的数据点会被工具类抛弃。</p><p><code>Window</code><code>Evaluator</code>接口的定义见<code>org.apache.iotdb.db.utils.windowing.api</code>包。</p><h5 id="固定窗口内数据点数的滑动窗口" tabindex="-1"><a class="header-anchor" href="#固定窗口内数据点数的滑动窗口" aria-hidden="true">#</a> 固定窗口内数据点数的滑动窗口</h5><h6 id="窗口构造" tabindex="-1"><a class="header-anchor" href="#窗口构造" aria-hidden="true">#</a> 窗口构造</h6><p>共两种构造方法。</p><p>第一种方法需要您提供窗口接受数据点的类型、窗口大小、滑动步长和一个侦听钩子(<code>Evaluator</code>)。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">TSDataType</span> dataType <span class="token operator">=</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> windowSize <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> slidingStep <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>
<span class="token class-name">SlidingSizeWindowEvaluationHandler</span> handler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowConfiguration</span><span class="token punctuation">(</span>dataType<span class="token punctuation">,</span> windowSize<span class="token punctuation">,</span> slidingStep<span class="token punctuation">)</span><span class="token punctuation">,</span>
window <span class="token operator">-&gt;</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>第二种方法需要您提供窗口接受数据点的类型、窗口大小和一个侦听钩子(<code>Evaluator</code>)。这种构造方法下的窗口滑动步长等于窗口大小。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">TSDataType</span> dataType <span class="token operator">=</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> windowSize <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token class-name">SlidingSizeWindowEvaluationHandler</span> handler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowConfiguration</span><span class="token punctuation">(</span>dataType<span class="token punctuation">,</span> windowSize<span class="token punctuation">)</span><span class="token punctuation">,</span>
window <span class="token operator">-&gt;</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>窗口大小、滑动步长必须为正数。</p><h6 id="数据接收" tabindex="-1"><a class="header-anchor" href="#数据接收" aria-hidden="true">#</a> 数据接收</h6><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token keyword">long</span> timestamp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> value <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
hander<span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意,<code>collect</code>方法接受的第二个参数类型需要与构造时传入的<code>dataType</code>声明一致。</p><p>此外,<code>collect</code>方法只会对时间戳是单调递增的数据点产生响应。如果某一次<code>collect</code>方法采集到的数据点的时间戳小于等于上一次<code>collect</code>方法采集到的数据点时间戳,那么这一次采集的数据点将会被抛弃。</p><p>还需要注意的是,<code>collect</code>方法不是线程安全的。</p><h5 id="固定窗口内时间长度的滑动窗口" tabindex="-1"><a class="header-anchor" href="#固定窗口内时间长度的滑动窗口" aria-hidden="true">#</a> 固定窗口内时间长度的滑动窗口</h5><h6 id="窗口构造-1" tabindex="-1"><a class="header-anchor" href="#窗口构造-1" aria-hidden="true">#</a> 窗口构造</h6><p>共两种构造方法。</p><p>第一种方法需要您提供窗口接受数据点的类型、窗口内时间长度、滑动步长和一个侦听钩子(<code>Evaluator</code>)。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">TSDataType</span> dataType <span class="token operator">=</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> timeInterval <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> slidingStep <span class="token operator">=</span> <span class="token number">500</span><span class="token punctuation">;</span>
<span class="token class-name">SlidingTimeWindowEvaluationHandler</span> handler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowConfiguration</span><span class="token punctuation">(</span>dataType<span class="token punctuation">,</span> timeInterval<span class="token punctuation">,</span> slidingStep<span class="token punctuation">)</span><span class="token punctuation">,</span>
window <span class="token operator">-&gt;</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>第二种方法需要您提供窗口接受数据点的类型、窗口内时间长度和一个侦听钩子(<code>Evaluator</code>)。这种构造方法下的窗口滑动步长等于窗口内时间长度。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">TSDataType</span> dataType <span class="token operator">=</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> timeInterval <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span>
<span class="token class-name">SlidingTimeWindowEvaluationHandler</span> handler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowConfiguration</span><span class="token punctuation">(</span>dataType<span class="token punctuation">,</span> timeInterval<span class="token punctuation">)</span><span class="token punctuation">,</span>
window <span class="token operator">-&gt;</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>窗口内时间长度、滑动步长必须为正数。</p><h6 id="数据接收-1" tabindex="-1"><a class="header-anchor" href="#数据接收-1" aria-hidden="true">#</a> 数据接收</h6><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token keyword">long</span> timestamp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> value <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
hander<span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意,<code>collect</code>方法接受的第二个参数类型需要与构造时传入的<code>dataType</code>声明一致。</p><p>此外,<code>collect</code>方法只会对时间戳是单调递增的数据点产生响应。如果某一次<code>collect</code>方法采集到的数据点的时间戳小于等于上一次<code>collect</code>方法采集到的数据点时间戳,那么这一次采集的数据点将会被抛弃。</p><p>还需要注意的是,<code>collect</code>方法不是线程安全的。</p><h5 id="拒绝策略" tabindex="-1"><a class="header-anchor" href="#拒绝策略" aria-hidden="true">#</a> 拒绝策略</h5><p>窗口计算的任务执行是异步的。</p><p>当异步任务无法被执行线程池及时消费时,会产生任务堆积。在极端情况下,异步任务的堆积会导致系统 OOM。因此,窗口计算线程池允许堆积的任务数量被设定为有限值。</p><p>当堆积的任务数量超出限值时,新提交的任务将无法进入线程池执行,此时,系统会调用您在侦听钩子(<code>Evaluator</code>)中制定的拒绝策略钩子<code>onRejection</code>进行处理。</p><p><code>onRejection</code>的默认行为如下。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">default</span> <span class="token keyword">void</span> <span class="token function">onRejection</span><span class="token punctuation">(</span><span class="token class-name">Window</span> window<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">RejectedExecutionException</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>制定拒绝策略钩子的方式如下。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">SlidingTimeWindowEvaluationHandler</span> handler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowConfiguration</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">Evaluator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">evaluate</span><span class="token punctuation">(</span><span class="token class-name">Window</span> window<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onRejection</span><span class="token punctuation">(</span><span class="token class-name">Window</span> window<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="配置参数" tabindex="-1"><a class="header-anchor" href="#配置参数" aria-hidden="true">#</a> 配置参数</h5><h6 id="concurrent-window-evaluation-thread" tabindex="-1"><a class="header-anchor" href="#concurrent-window-evaluation-thread" aria-hidden="true">#</a> concurrent_window_evaluation_thread</h6><p>窗口计算线程池的默认线程数。默认为 CPU 核数。</p><h6 id="max-pending-window-evaluation-tasks" tabindex="-1"><a class="header-anchor" href="#max-pending-window-evaluation-tasks" aria-hidden="true">#</a> max_pending_window_evaluation_tasks</h6><p>最多允许堆积的窗口计算任务。默认为 64 个。</p><h4 id="sink-工具类" tabindex="-1"><a class="header-anchor" href="#sink-工具类" aria-hidden="true">#</a> Sink 工具类</h4><p>Sink 工具类为触发器提供了连接外部系统的能力。</p><p>它提供了一套编程范式。每一个 Sink 工具都包含一个用于处理数据发送的<code>Handler</code>、一个用于配置<code>Handler</code><code>Configuration</code>,还有一个用于描述发送数据的<code>Event</code></p><h5 id="localiotdbsink" tabindex="-1"><a class="header-anchor" href="#localiotdbsink" aria-hidden="true">#</a> LocalIoTDBSink</h5><p><code>LocalIoTDBSink</code>用于向本地序列写入数据点。</p><p>在写入数据前,不要求时间序列已被创建。</p><p><strong>注意</strong>,在触发器场景中,侦听的时间序列和写入的目标时间序列不要在同一个存储组下。</p><p>使用示例:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">String</span> device <span class="token operator">=</span> <span class="token string">&quot;root.alerting&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> measurements <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token string">&quot;local&quot;</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">TSDataType</span><span class="token punctuation">[</span><span class="token punctuation">]</span> dataTypes <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TSDataType</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token class-name">LocalIoTDBHandler</span> localIoTDBHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LocalIoTDBHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LocalIoTDBConfiguration</span><span class="token punctuation">(</span>device<span class="token punctuation">,</span> measurements<span class="token punctuation">,</span> dataTypes<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// insert 100 data points</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> timestamp <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">double</span> value <span class="token operator">=</span> i<span class="token punctuation">;</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LocalIoTDBEvent</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意,当您需要向某个<code>TEXT</code>类型的序列写入数据时,您需要借助<code>org.apache.iotdb.tsfile.utils.Binary</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token comment">// insert 100 data points</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> timestamp <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> value <span class="token operator">=</span> <span class="token string">&quot;&quot;</span> <span class="token operator">+</span> i<span class="token punctuation">;</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LocalIoTDBEvent</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> <span class="token class-name">Binary</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="mqttsink" tabindex="-1"><a class="header-anchor" href="#mqttsink" aria-hidden="true">#</a> MQTTSink</h5><p>触发器可以使用<code>MQTTSink</code>向其他的 IoTDB 实例发送数据点。</p><p>在发送数据前,不要求时间序列已被创建。</p><p>使用示例:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">final</span> <span class="token class-name">String</span> host <span class="token operator">=</span> <span class="token string">&quot;127.0.0.1&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> port <span class="token operator">=</span> <span class="token number">1883</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> username <span class="token operator">=</span> <span class="token string">&quot;root&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> password <span class="token operator">=</span> <span class="token string">&quot;root&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">PartialPath</span> device <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PartialPath</span><span class="token punctuation">(</span><span class="token string">&quot;root.alerting&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> measurements <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token string">&quot;remote&quot;</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token class-name">MQTTHandler</span> mqttHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MQTTHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mqttHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MQTTConfiguration</span><span class="token punctuation">(</span>host<span class="token punctuation">,</span> port<span class="token punctuation">,</span> username<span class="token punctuation">,</span> password<span class="token punctuation">,</span> device<span class="token punctuation">,</span> measurements<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> topic <span class="token operator">=</span> <span class="token string">&quot;test&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">QoS</span> qos <span class="token operator">=</span> <span class="token class-name">QoS</span><span class="token punctuation">.</span><span class="token constant">EXACTLY_ONCE</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">boolean</span> retain <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token comment">// send 100 data points</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> <span class="token keyword">long</span> timestamp <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token keyword">double</span> value <span class="token operator">=</span> i<span class="token punctuation">;</span>
mqttHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MQTTEvent</span><span class="token punctuation">(</span>topic<span class="token punctuation">,</span> qos<span class="token punctuation">,</span> retain<span class="token punctuation">,</span> timestamp<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="alertmanagersink" tabindex="-1"><a class="header-anchor" href="#alertmanagersink" aria-hidden="true">#</a> AlertManagerSink</h5><p>触发器可以使用<code>AlertManagerSink</code> 向 AlertManager 发送消息。</p><p><code>AlertManagerConfiguration</code> 的构造需传入 AlertManager 的发送告警的 endpoint。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">AlertManagerConfiguration</span><span class="token punctuation">(</span><span class="token class-name">String</span> endpoint<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>AlertManagerEvent</code> 提供三种构造函数:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span><span class="token class-name">String</span> alertname<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span><span class="token class-name">String</span> alertname<span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> extraLabels<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span><span class="token class-name">String</span> alertname<span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> extraLabels<span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> annotations<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其中:</p><ul><li><code>alertname</code> 是必传参数,用于标识一个 <code>alert</code><code>alertname</code> 字段可用于 <code>AlertManager</code> 发送告警时的分组和消重。</li><li><code>extraLabels</code> 可选传,在后台与 <code>alertname</code> 组合成 <code>labels</code> 一起标识一个 <code>alert</code>,可用于 <code>AlertManager</code> 发送告警时的分组和消重。</li><li><code>annotations</code> 可选传,它的 value 值可使用 Go 语言模板风格的<div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>{{.&lt;label_key&gt;}}
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div>它在最终生成消息时会被替换为 <code>labels[&lt;label_key&gt;]</code></li><li><code>labels</code><code>annotations</code> 会被解析成 json 字符串发送给 <code>AlertManager</code></li></ul><div class="language-json line-numbers-mode" data-ext="json"><pre class="language-json"><code><span class="token punctuation">{</span>
<span class="token property">&quot;labels&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">&quot;alertname&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&lt;requiredAlertName&gt;&quot;</span><span class="token punctuation">,</span>
<span class="token property">&quot;&lt;labelname&gt;&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&lt;labelvalue&gt;&quot;</span><span class="token punctuation">,</span>
...
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token property">&quot;annotations&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">&quot;&lt;labelname&gt;&quot;</span><span class="token operator">:</span> <span class="token string">&quot;&lt;labelvalue&gt;&quot;</span><span class="token punctuation">,</span>
...
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>调用 <code>AlertManagerHandler</code><code>onEvent(AlertManagerEvent event)</code> 方法发送一个告警。</p><p><strong>使用示例 1:</strong></p><p>只传 <code>alertname</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">AlertManagerHandler</span> alertManagerHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AlertManagerConfiguration</span><span class="token punctuation">(</span><span class="token string">&quot;http://127.0.0.1:9093/api/v1/alerts&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> alertName <span class="token operator">=</span> <span class="token string">&quot;test0&quot;</span><span class="token punctuation">;</span>
<span class="token class-name">AlertManagerEvent</span> alertManagerEvent <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span>alertName<span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span>alertManagerEvent<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>使用示例 2:</strong></p><p>传入 <code>alertname</code><code>extraLabels</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">AlertManagerHandler</span> alertManagerHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AlertManagerConfiguration</span><span class="token punctuation">(</span><span class="token string">&quot;http://127.0.0.1:9093/api/v1/alerts&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> alertName <span class="token operator">=</span> <span class="token string">&quot;test1&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> extraLabels <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;severity&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;critical&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;series&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;root.ln.wt01.wf01.temperature&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;value&quot;</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span><span class="token number">100.0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">AlertManagerEvent</span> alertManagerEvent <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span>alertName<span class="token punctuation">,</span> extraLabels<span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span>alertManagerEvent<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>使用示例 3:</strong></p><p>传入 <code>alertname</code><code>extraLabels</code><code>annotations</code></p><p>最终 <code>description</code> 字段的值会被解析为 <code>test2: root.ln.wt01.wf01.temperature is 100.0</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">AlertManagerHandler</span> alertManagerHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AlertManagerConfiguration</span><span class="token punctuation">(</span><span class="token string">&quot;http://127.0.0.1:9093/api/v1/alerts&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">String</span> alertName <span class="token operator">=</span> <span class="token string">&quot;test2&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> extraLabels <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;severity&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;critical&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;series&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;root.ln.wt01.wf01.temperature&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
extraLabels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;value&quot;</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span><span class="token number">100.0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">final</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> annotations <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
annotations<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;summary&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;high temperature&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
annotations<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">&quot;description&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;{{.alertname}}: {{.series}} is {{.value}}&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
alertManagerHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span>alertName<span class="token punctuation">,</span> extraLabels<span class="token punctuation">,</span> annotations<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="完整的-maven-示例项目" tabindex="-1"><a class="header-anchor" href="#完整的-maven-示例项目" aria-hidden="true">#</a> 完整的 Maven 示例项目</h3><p>如果您使用 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>,可以参考我们编写的示例项目 <strong>trigger-example</strong></p><p>您可以在 <a href="https://github.com/apache/iotdb/tree/master/example/trigger" target="_blank" rel="noopener noreferrer">这里<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> 找到它。</p><p>它展示了:</p><ul><li>如何使用 Maven 管理您的 trigger 项目</li><li>如何基于触发器的用户编程接口实现数据侦听</li><li>如何使用窗口工具类</li><li>如何使用 Sink 工具类</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">package</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>trigger</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span><span class="token class-name">Trigger</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span><span class="token class-name">TriggerAttributes</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>path<span class="token punctuation">.</span></span><span class="token class-name">PartialPath</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>mqtt<span class="token punctuation">.</span></span><span class="token class-name">MQTTConfiguration</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>mqtt<span class="token punctuation">.</span></span><span class="token class-name">MQTTEvent</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>mqtt<span class="token punctuation">.</span></span><span class="token class-name">MQTTHandler</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>local<span class="token punctuation">.</span></span><span class="token class-name">LocalIoTDBConfiguration</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>local<span class="token punctuation">.</span></span><span class="token class-name">LocalIoTDBEvent</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>local<span class="token punctuation">.</span></span><span class="token class-name">LocalIoTDBHandler</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>utils<span class="token punctuation">.</span>windowing<span class="token punctuation">.</span>configuration<span class="token punctuation">.</span></span><span class="token class-name">SlidingSizeWindowConfiguration</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>utils<span class="token punctuation">.</span>windowing<span class="token punctuation">.</span>handler<span class="token punctuation">.</span></span><span class="token class-name">SlidingSizeWindowEvaluationHandler</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>file<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">TSDataType</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>fusesource<span class="token punctuation">.</span>mqtt<span class="token punctuation">.</span>client<span class="token punctuation">.</span></span><span class="token class-name">QoS</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>slf4j<span class="token punctuation">.</span></span><span class="token class-name">Logger</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>slf4j<span class="token punctuation">.</span></span><span class="token class-name">LoggerFactory</span></span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TriggerExample</span> <span class="token keyword">implements</span> <span class="token class-name">Trigger</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Logger</span> <span class="token constant">LOGGER</span> <span class="token operator">=</span> <span class="token class-name">LoggerFactory</span><span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span><span class="token class-name">TriggerExample</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> <span class="token constant">TARGET_DEVICE</span> <span class="token operator">=</span> <span class="token string">&quot;root.alerting&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">LocalIoTDBHandler</span> localIoTDBHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LocalIoTDBHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">MQTTHandler</span> mqttHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MQTTHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">SlidingSizeWindowEvaluationHandler</span> windowEvaluationHandler<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token class-name">TriggerAttributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">&quot;onCreate(TriggerAttributes attributes)&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">double</span> lo <span class="token operator">=</span> attributes<span class="token punctuation">.</span><span class="token function">getDouble</span><span class="token punctuation">(</span><span class="token string">&quot;lo&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">double</span> hi <span class="token operator">=</span> attributes<span class="token punctuation">.</span><span class="token function">getDouble</span><span class="token punctuation">(</span><span class="token string">&quot;hi&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">openSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
windowEvaluationHandler <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowEvaluationHandler</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">SlidingSizeWindowConfiguration</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
window <span class="token operator">-&gt;</span> <span class="token punctuation">{</span>
<span class="token keyword">double</span> avg <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> window<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
avg <span class="token operator">+=</span> window<span class="token punctuation">.</span><span class="token function">getDouble</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
avg <span class="token operator">/=</span> window<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>avg <span class="token operator">&lt;</span> lo <span class="token operator">||</span> hi <span class="token operator">&lt;</span> avg<span class="token punctuation">)</span> <span class="token punctuation">{</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LocalIoTDBEvent</span><span class="token punctuation">(</span>window<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> avg<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mqttHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">MQTTEvent</span><span class="token punctuation">(</span><span class="token string">&quot;test&quot;</span><span class="token punctuation">,</span> <span class="token class-name">QoS</span><span class="token punctuation">.</span><span class="token constant">EXACTLY_ONCE</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> window<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> avg<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">&quot;onDrop()&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">closeSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onStart</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">&quot;onStart()&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">openSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onStop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">&quot;onStop()&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">closeSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token class-name">Double</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">Double</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
windowEvaluationHandler<span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">[</span><span class="token punctuation">]</span> timestamps<span class="token punctuation">,</span> <span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> timestamps<span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
windowEvaluationHandler<span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span>timestamps<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> values<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> values<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">openSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">LocalIoTDBConfiguration</span><span class="token punctuation">(</span>
<span class="token constant">TARGET_DEVICE</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token string">&quot;local&quot;</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TSDataType</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mqttHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">MQTTConfiguration</span><span class="token punctuation">(</span>
<span class="token string">&quot;127.0.0.1&quot;</span><span class="token punctuation">,</span>
<span class="token number">1883</span><span class="token punctuation">,</span>
<span class="token string">&quot;root&quot;</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">PartialPath</span><span class="token punctuation">(</span><span class="token constant">TARGET_DEVICE</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token string">&quot;remote&quot;</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">closeSinkHandlers</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
localIoTDBHandler<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mqttHandler<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>您可以按照下面的步骤试用这个触发器:</p><ul><li><p><code>iotdb-engine.properties</code>中启用 MQTT 服务</p><div class="language-properties line-numbers-mode" data-ext="properties"><pre class="language-properties"><code><span class="token comment"># whether to enable the mqtt service.</span>
<span class="token key attr-name">enable_mqtt_service</span><span class="token punctuation">=</span><span class="token value attr-value">true</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>启动 IoTDB 服务器</p></li><li><p>通过 cli 创建时间序列</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> TIMESERIES root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1 <span class="token keyword">WITH</span> DATATYPE<span class="token operator">=</span><span class="token keyword">DOUBLE</span><span class="token punctuation">,</span> ENCODING<span class="token operator">=</span>PLAIN<span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li><li><p><strong>trigger-example</strong> 中打包好的 JAR(<code>trigger-example-0.13.0-SNAPSHOT.jar</code>)放置到目录 <code>iotdb-server-0.13.0-SNAPSHOT/ext/trigger</code> (也可以是<code>iotdb-server-0.13.0-SNAPSHOT/ext/trigger</code>的子目录)下</p><blockquote><p>您可以通过修改配置文件中的<code>trigger_root_dir</code>来指定加载触发器 JAR 包的根路径。</p></blockquote></li><li><p>使用 SQL 语句注册该触发器,假定赋予该触发器的名字为<code>window-avg-alerter</code></p></li><li><p>使用<code>CREATE TRIGGER</code>语句注册该触发器</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>window-avg-alerter<span class="token punctuation">`</span></span>
<span class="token keyword">AFTER</span> <span class="token keyword">INSERT</span>
<span class="token keyword">ON</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1
<span class="token keyword">AS</span> <span class="token string">&#39;org.apache.iotdb.trigger.TriggerExample&#39;</span>
<span class="token keyword">WITH</span> <span class="token punctuation">(</span>
<span class="token string">&#39;lo&#39;</span> <span class="token operator">=</span> <span class="token string">&#39;0&#39;</span><span class="token punctuation">,</span>
<span class="token string">&#39;hi&#39;</span> <span class="token operator">=</span> <span class="token string">&#39;10.0&#39;</span>
<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>使用 cli 插入测试数据</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1<span class="token punctuation">(</span><span class="token keyword">timestamp</span><span class="token punctuation">,</span> s1<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>使用 cli 查询数据以验证触发器的行为</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>alerting<span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li><li><p>正常情况下,得到如下结果</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code>IoTDB<span class="token operator">&gt;</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>alerting<span class="token punctuation">;</span>
<span class="token operator">+</span><span class="token comment">-----------------------------+--------------------+-------------------+</span>
<span class="token operator">|</span> <span class="token keyword">Time</span><span class="token operator">|</span>root<span class="token punctuation">.</span>alerting<span class="token punctuation">.</span>remote<span class="token operator">|</span>root<span class="token punctuation">.</span>alerting<span class="token punctuation">.</span><span class="token keyword">local</span><span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment">-----------------------------+--------------------+-------------------+</span>
<span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.006</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">14.0</span><span class="token operator">|</span> <span class="token number">14.0</span><span class="token operator">|</span>
<span class="token operator">+</span><span class="token comment">-----------------------------+--------------------+-------------------+</span>
Total line number <span class="token operator">=</span> <span class="token number">1</span>
It costs <span class="token number">0.006</span>s
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li></ul><p>以上就是基本的使用方法,希望您能喜欢 😄</p><h3 id="重要注意事项-1" tabindex="-1"><a class="header-anchor" href="#重要注意事项-1" aria-hidden="true">#</a> 重要注意事项</h3><ul><li><p>触发器是通过反射技术动态装载的,因此您在装载过程中无需启停服务器。</p></li><li><p>不同的 JAR 包中最好不要有全类名相同但功能实现不一样的类。例如:触发器<code>trigger1</code><code>trigger2</code>分别对应资源<code>trigger1.jar</code><code>trigger2.jar</code>。如果两个 JAR 包里都包含一个<code>org.apache.iotdb.db.engine.trigger.example.AlertListener</code>类,当<code>CREATE TRIGGER</code>使用到这个类时,系统会随机加载其中一个 JAR 包中的类,最终导致触发器执行行为不一致以及其他的问题。</p></li><li><p>拥有同一个全类名的触发器类的版本管理问题。IoTDB 不允许系统中存在拥有同一全类名但是版本(逻辑)不一样的触发器。</p><p>相关问题:IoTDB 预先注册了 10 个<code>org.apache.iotdb.db.engine.trigger.example.AlertListener</code>触发器实例,DBA 更新了<code>org.apache.iotdb.db.engine.trigger.example.AlertListener</code>的实现和对应的 JAR 包,是否可以只卸载其中 5 个,将这 5 个替换为新的实现?</p><p>回答:无法做到。只有将预先注册的 10 个触发器全部卸载,才能装载到新的触发器实例。在原有触发器没有全部被卸载的情况下,新注册的拥有相同全类名的触发器行为只会与现有触发器的行为一致。</p></li></ul></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/apache/iotdb/edit/rel/0.13/docs/zh/UserGuide/Process-Data/Triggers.md" rel="noopener noreferrer" target="_blank" aria-label="发现错误?在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->发现错误?在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><!----><!----></div></footer><nav class="page-nav"><a href="/zh/UserGuide/V0.13.x/Process-Data/Continuous-Query.html" class="nav-link prev" aria-label="连续查询(CQ)"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><!---->连续查询(CQ)</div></a><a href="/zh/UserGuide/V0.13.x/Process-Data/Alerting.html" class="nav-link next" aria-label="告警机制"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">告警机制<!----></div></a></nav><!----><!----><!--]--></main><!--]--><footer style="padding-bottom:2rem;"><span id="doc-version" style="display:none;">rel/0.13</span><p style="text-align:center;color:#909399;font-size:12px;margin:0 30px;">Copyright © 2023 The Apache Software Foundation.<br> Apache and the Apache feather logo are trademarks of The Apache Software Foundation</p><p style="text-align:center;margin-top:10px;color:#909399;font-size:12px;margin:0 30px;"><strong>Have a question?</strong> Connect with us on QQ, WeChat, or Slack. <a href="https://github.com/apache/iotdb/issues/1995">Join the community</a> now.</p><p style="text-align:center;margin-top:10px;color:#909399;font-size:12px;margin:0 30px;"> We use <a href="https://analytics.google.com">Google Analytics</a> to collect anonymous, aggregated usage information. </p></footer></div><!--]--><!--]--><!----><!--]--></div>
<script type="module" src="/assets/app-cbe6e1e7.js" defer></script>
</body>
</html>