From d2f1c123dccaa744a107f825218d7b5471db5edb Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Fri, 16 Jan 2026 11:17:18 +0800
Subject: [PATCH 01/18] draft
Signed-off-by: Weihao Li <18110526956@163.com>
---
distribution/src/assembly/all.xml | 1 +
distribution/src/assembly/datanode.xml | 1 +
example/mqtt-customize/pom.xml | 2 +-
...tter => org.apache.iotdb.PayloadFormatter} | 0
example/pom.xml | 2 +-
external-service-impl/mqtt/pom.xml | 115 ++++++++++++++++++
.../iotdb}/mqtt/BrokerAuthenticator.java | 2 +-
.../iotdb}/mqtt/JSONPayloadFormatter.java | 2 +-
.../iotdb}/mqtt/LinePayloadFormatter.java | 2 +-
.../apache/iotdb}/mqtt/MPPPublishHandler.java | 2 +-
.../org/apache/iotdb/mqtt}/MQTTService.java | 28 +----
.../java/org/apache/iotdb}/mqtt/Message.java | 2 +-
.../iotdb}/mqtt/PayloadFormatManager.java | 2 +-
.../apache/iotdb}/mqtt/PayloadFormatter.java | 2 +-
.../org/apache/iotdb}/mqtt/TableMessage.java | 2 +-
.../org/apache/iotdb}/mqtt/TreeMessage.java | 2 +-
.../org.apache.iotdb.mqtt.PayloadFormatter | 4 +-
.../iotdb}/mqtt/BrokerAuthenticatorTest.java | 18 +--
.../iotdb}/mqtt/JSONPayloadFormatterTest.java | 3 +-
.../iotdb}/mqtt/LinePayloadFormatterTest.java | 3 +-
.../iotdb}/mqtt/PayloadFormatManagerTest.java | 8 +-
external-service-impl/pom.xml | 56 +++++++++
iotdb-core/datanode/pom.xml | 4 -
.../org/apache/iotdb/db/service/DataNode.java | 16 ++-
.../BuiltinExternalServices.java | 8 +-
.../ExternalServiceManagementService.java | 54 ++++++--
.../iotdb/commons/service/ServiceType.java | 1 -
pom.xml | 1 +
28 files changed, 253 insertions(+), 90 deletions(-)
rename example/mqtt-customize/src/main/resources/META-INF/services/{org.apache.iotdb.db.protocol.mqtt.PayloadFormatter => org.apache.iotdb.PayloadFormatter} (100%)
create mode 100644 external-service-impl/mqtt/pom.xml
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/BrokerAuthenticator.java (97%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/JSONPayloadFormatter.java (99%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/LinePayloadFormatter.java (99%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/MPPPublishHandler.java (99%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service => external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt}/MQTTService.java (84%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/Message.java (96%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/PayloadFormatManager.java (99%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/PayloadFormatter.java (97%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/TableMessage.java (98%)
rename {iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/main/java/org/apache/iotdb}/mqtt/TreeMessage.java (97%)
rename iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter => external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter (87%)
rename {iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/test/java/org/apache/iotdb}/mqtt/BrokerAuthenticatorTest.java (77%)
rename {iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/test/java/org/apache/iotdb}/mqtt/JSONPayloadFormatterTest.java (99%)
rename {iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/test/java/org/apache/iotdb}/mqtt/LinePayloadFormatterTest.java (98%)
rename {iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol => external-service-impl/mqtt/src/test/java/org/apache/iotdb}/mqtt/PayloadFormatManagerTest.java (84%)
create mode 100644 external-service-impl/pom.xml
diff --git a/distribution/src/assembly/all.xml b/distribution/src/assembly/all.xml
index b77f71a32dcd9..e28fc04a9ee8e 100644
--- a/distribution/src/assembly/all.xml
+++ b/distribution/src/assembly/all.xml
@@ -32,6 +32,7 @@
*:iotdb-server:zip:*
*:iotdb-cli:zip:*
*:iotdb-confignode:zip:*
+ *:external-service-impl:zip:*
${file.separator}
${artifact.artifactId}.${artifact.extension}
diff --git a/distribution/src/assembly/datanode.xml b/distribution/src/assembly/datanode.xml
index 016059a903a4f..5393568e4cf43 100644
--- a/distribution/src/assembly/datanode.xml
+++ b/distribution/src/assembly/datanode.xml
@@ -31,6 +31,7 @@
*:iotdb-server:zip:*
*:iotdb-cli:zip:*
+ *:external-service-impl
${file.separator}
${artifact.artifactId}.${artifact.extension}
diff --git a/example/mqtt-customize/pom.xml b/example/mqtt-customize/pom.xml
index 2624571f4e87d..c685748026401 100644
--- a/example/mqtt-customize/pom.xml
+++ b/example/mqtt-customize/pom.xml
@@ -32,7 +32,7 @@
org.apache.iotdb
- iotdb-server
+ iotdb-mqtt
${project.version}
diff --git a/example/mqtt-customize/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter b/example/mqtt-customize/src/main/resources/META-INF/services/org.apache.iotdb.PayloadFormatter
similarity index 100%
rename from example/mqtt-customize/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter
rename to example/mqtt-customize/src/main/resources/META-INF/services/org.apache.iotdb.PayloadFormatter
diff --git a/example/pom.xml b/example/pom.xml
index 9af648e0d262a..5b6bac69a0e56 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -32,7 +32,7 @@
jdbc
mqtt
- mqtt-customize
+
pipe-count-point-processor
pipe-opc-ua-sink
rest-java-example
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
new file mode 100644
index 0000000000000..3e08d1e7ff0d9
--- /dev/null
+++ b/external-service-impl/mqtt/pom.xml
@@ -0,0 +1,115 @@
+
+
+
+ 4.0.0
+
+ org.apache.iotdb
+ external-service-impl
+ 2.0.7-SNAPSHOT
+
+ mqtt
+
+ 11
+ 11
+ UTF-8
+
+
+
+ com.github.moquette-io.moquette
+ moquette-broker
+
+
+ com.google.code.gson
+ gson
+
+
+ io.netty
+ netty-buffer
+
+
+ org.apache.iotdb
+ iotdb-thrift-commons
+ 2.0.7-SNAPSHOT
+
+
+ org.apache.tsfile
+ tsfile
+ ${tsfile.version}
+
+
+ com.google.guava
+ guava
+
+
+ org.apache.iotdb
+ iotdb-thrift
+ 2.0.7-SNAPSHOT
+
+
+ org.apache.iotdb
+ node-commons
+ 2.0.7-SNAPSHOT
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.apache.iotdb
+ service-rpc
+ 2.0.7-SNAPSHOT
+
+
+ io.netty
+ netty-codec-mqtt
+
+
+
+
+ get-jar-with-dependencies
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+
+
+ single
+
+
+ package
+
+
+
+
+
+
+
+
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticator.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/BrokerAuthenticator.java
similarity index 97%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticator.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/BrokerAuthenticator.java
index a05c8264b8225..14647a8582f04 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticator.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/BrokerAuthenticator.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.rpc.TSStatusCode;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatter.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/JSONPayloadFormatter.java
similarity index 99%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatter.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/JSONPayloadFormatter.java
index cc857b7295cf1..7a348c850b42d 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatter.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/JSONPayloadFormatter.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatter.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/LinePayloadFormatter.java
similarity index 99%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatter.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/LinePayloadFormatter.java
index 8b596ee2c89ce..f80c3eb0b5e4f 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatter.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/LinePayloadFormatter.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import io.netty.buffer.ByteBuf;
import org.apache.tsfile.enums.TSDataType;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
similarity index 99%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
index a0c0e1a709bbd..37182505c5867 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.conf.IoTDBConstant.ClientVersion;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/MQTTService.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MQTTService.java
similarity index 84%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/MQTTService.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MQTTService.java
index c6cc3fa47ee10..3b2be5ac3f4f1 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/MQTTService.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MQTTService.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.iotdb.db.service;
-import org.apache.iotdb.commons.service.IService;
-import org.apache.iotdb.commons.service.ServiceType;
+package org.apache.iotdb.mqtt;
+
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.protocol.mqtt.BrokerAuthenticator;
-import org.apache.iotdb.db.protocol.mqtt.MPPPublishHandler;
+import org.apache.iotdb.externalservice.api.IExternalService;
import io.moquette.BrokerConstants;
import io.moquette.broker.Server;
@@ -40,12 +38,10 @@
import java.util.Properties;
/** The IoTDB MQTT Service. */
-public class MQTTService implements IService {
+public class MQTTService implements IExternalService {
private static final Logger LOG = LoggerFactory.getLogger(MQTTService.class);
private final Server server = new Server();
- private MQTTService() {}
-
@Override
public void start() {
startup();
@@ -106,20 +102,4 @@ private IConfig createBrokerConfig(IoTDBConfig iotDBConfig) {
public void shutdown() {
server.stopServer();
}
-
- @Override
- public ServiceType getID() {
- return ServiceType.MQTT_SERVICE;
- }
-
- public static MQTTService getInstance() {
- return MQTTServiceHolder.INSTANCE;
- }
-
- private static class MQTTServiceHolder {
-
- private static final MQTTService INSTANCE = new MQTTService();
-
- private MQTTServiceHolder() {}
- }
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/Message.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/Message.java
similarity index 96%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/Message.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/Message.java
index ba31d86976035..9a4311754533f 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/Message.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/Message.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
/** Generic parsing of messages */
public class Message {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManager.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatManager.java
similarity index 99%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManager.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatManager.java
index c0b48539cd744..7bb051a852692 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManager.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatManager.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import org.apache.iotdb.commons.file.SystemFileFactory;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatter.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatter.java
similarity index 97%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatter.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatter.java
index c86648ac16136..672c512d54a21 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatter.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/PayloadFormatter.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import io.netty.buffer.ByteBuf;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TableMessage.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TableMessage.java
similarity index 98%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TableMessage.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TableMessage.java
index b8aec19da5873..5c8fcc5d708d6 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TableMessage.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TableMessage.java
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import org.apache.tsfile.enums.TSDataType;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TreeMessage.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TreeMessage.java
similarity index 97%
rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TreeMessage.java
rename to external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TreeMessage.java
index 9416ea3c83805..07ff8ed0b3d84 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/TreeMessage.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/TreeMessage.java
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+package org.apache.iotdb.mqtt;
import org.apache.tsfile.enums.TSDataType;
diff --git a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter b/external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter
similarity index 87%
rename from iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter
rename to external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter
index 488d6d02d5039..f42aa83ff8678 100644
--- a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.protocol.mqtt.PayloadFormatter
+++ b/external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter
@@ -17,5 +17,5 @@
# under the License.
#
-org.apache.iotdb.db.protocol.mqtt.JSONPayloadFormatter
-org.apache.iotdb.db.protocol.mqtt.LinePayloadFormatter
+org.apache.iotdb.mqtt.JSONPayloadFormatter
+org.apache.iotdb.mqtt.LinePayloadFormatter
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticatorTest.java b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/BrokerAuthenticatorTest.java
similarity index 77%
rename from iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticatorTest.java
rename to external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/BrokerAuthenticatorTest.java
index 1f66b517e9196..6884a644fedc0 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/BrokerAuthenticatorTest.java
+++ b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/BrokerAuthenticatorTest.java
@@ -15,29 +15,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
-import org.apache.iotdb.db.exception.StorageEngineException;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
+package org.apache.iotdb.mqtt;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Test;
-import java.io.IOException;
-
public class BrokerAuthenticatorTest {
- @Before
- public void before() {
- EnvironmentUtils.envSetUp();
- }
-
- @After
- public void after() throws IOException, StorageEngineException {
- EnvironmentUtils.cleanEnv();
- }
-
@Test
public void checkValid() {
// In the previous implementation, the datanode will init a root file,
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatterTest.java b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/JSONPayloadFormatterTest.java
similarity index 99%
rename from iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatterTest.java
rename to external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/JSONPayloadFormatterTest.java
index deecf607d8162..eab4b42243d1e 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/JSONPayloadFormatterTest.java
+++ b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/JSONPayloadFormatterTest.java
@@ -15,7 +15,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+
+package org.apache.iotdb.mqtt;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatterTest.java b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/LinePayloadFormatterTest.java
similarity index 98%
rename from iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatterTest.java
rename to external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/LinePayloadFormatterTest.java
index 7bf9bce0702d3..16ed807c9ae69 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/LinePayloadFormatterTest.java
+++ b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/LinePayloadFormatterTest.java
@@ -15,7 +15,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
+
+package org.apache.iotdb.mqtt;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManagerTest.java b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/PayloadFormatManagerTest.java
similarity index 84%
rename from iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManagerTest.java
rename to external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/PayloadFormatManagerTest.java
index 096f5d0d90d2e..afbe88cf047a2 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/protocol/mqtt/PayloadFormatManagerTest.java
+++ b/external-service-impl/mqtt/src/test/java/org/apache/iotdb/mqtt/PayloadFormatManagerTest.java
@@ -15,20 +15,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.iotdb.db.protocol.mqtt;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
+package org.apache.iotdb.mqtt;
-import org.junit.After;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
public class PayloadFormatManagerTest {
- @After
- public void tearDown() throws Exception {
- EnvironmentUtils.cleanAllDir();
- }
@Test(expected = IllegalArgumentException.class)
public void getPayloadFormat() {
diff --git a/external-service-impl/pom.xml b/external-service-impl/pom.xml
new file mode 100644
index 0000000000000..2eeaec2c0141d
--- /dev/null
+++ b/external-service-impl/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ 4.0.0
+
+ org.apache.iotdb
+ iotdb-parent
+ 2.0.7-SNAPSHOT
+
+ external-service-impl
+ pom
+
+ mqtt
+
+
+ 11
+ 11
+ UTF-8
+
+
+
+ org.apache.iotdb
+ external-service-api
+ 2.0.7-SNAPSHOT
+
+
+ org.apache.iotdb
+ iotdb-server
+ 2.0.7-SNAPSHOT
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index 72c4acba58615..af2c714b0eaea 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -267,10 +267,6 @@
org.glassfish.jersey.containers
jersey-container-servlet-core
-
- com.github.moquette-io.moquette
- moquette-broker
-
com.google.code.gson
gson
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
index 27a5ce3b7b795..d0eef468d4f94 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -1190,14 +1190,14 @@ private void getTriggerInformationList(List allTriggerInformation) {
private void prepareExternalServiceResources() throws StartupException {
long startTime = System.currentTimeMillis();
- if (resourcesInformationHolder.getExternalServiceEntryList() == null
- || resourcesInformationHolder.getExternalServiceEntryList().isEmpty()) {
- return;
- }
try {
- ExternalServiceManagementService.getInstance()
- .restoreUserDefinedServices(resourcesInformationHolder.getExternalServiceEntryList());
+ if (resourcesInformationHolder.getExternalServiceEntryList() != null
+ && !resourcesInformationHolder.getExternalServiceEntryList().isEmpty()) {
+ ExternalServiceManagementService.getInstance()
+ .restoreUserDefinedServices(resourcesInformationHolder.getExternalServiceEntryList());
+ }
+
ExternalServiceManagementService.getInstance().restoreRunningServiceInstance();
} catch (Exception e) {
throw new StartupException(e);
@@ -1290,6 +1290,7 @@ public void deleteDataNodeSystemProperties() {
public void stop() {
stopTriggerRelatedServices();
registerManager.deregisterAll();
+ ExternalServiceManagementService.getInstance().stopRunningServices();
JMXService.deregisterMBean(mbeanName);
MetricService.getInstance().stop();
if (schemaRegionConsensusStarted) {
@@ -1310,9 +1311,6 @@ public void stop() {
}
private void initProtocols() throws StartupException {
- if (config.isEnableMQTTService()) {
- registerManager.register(MQTTService.getInstance());
- }
if (IoTDBRestServiceDescriptor.getInstance().getConfig().isEnableRestService()) {
registerManager.register(RestService.getInstance());
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
index 7bed3ffe4711d..dfe90cb3ca1b5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
@@ -22,14 +22,10 @@
import java.util.function.Supplier;
public enum BuiltinExternalServices {
- MQTT(
- "MQTT",
- "org.apache.iotdb.externalservice.Mqtt",
- // IoTDBDescriptor.getInstance().getConfig()::isEnableMQTTService
- () -> false),
+ MQTT("MQTT", "org.apache.iotdb.mqtt.MQTTService", () -> true),
REST(
"REST",
- "org.apache.iotdb.externalservice.Rest",
+ "org.apache.iotdb.mqtt.RestService",
// IoTDBRestServiceDescriptor.getInstance().getConfig()::isEnableRestService
() -> false);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
index 71f0df341a687..234d81d82c0e2 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
@@ -25,6 +25,7 @@
import org.apache.iotdb.commons.client.exception.ClientManagerException;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
import org.apache.iotdb.commons.externalservice.ServiceInfo;
+import org.apache.iotdb.commons.file.SystemFileFactory;
import org.apache.iotdb.confignode.rpc.thrift.TCreateExternalServiceReq;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.protocol.client.ConfigNodeClient;
@@ -65,10 +66,25 @@ public class ExternalServiceManagementService {
private static final Logger LOGGER =
LoggerFactory.getLogger(ExternalServiceManagementService.class);
+ public static final String INSTANCE_NULL_ERROR_MSG =
+ "External Service instance is null when state is RUNNING!";
+
private ExternalServiceManagementService(String libRoot) {
this.serviceInfos = new HashMap<>();
restoreBuiltInServices();
this.libRoot = libRoot;
+ makDir(libRoot);
+ }
+
+ private static void makDir(String dir) {
+ try {
+ SystemFileFactory.INSTANCE.makeDirIfNecessary(dir);
+ } catch (IOException e) {
+ LOGGER.error("Failed to make external service dir", e);
+ throw new ExternalServiceManagementException(
+ new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+ .setMessage(e.getMessage()));
+ }
}
public Iterator showService(int dataNodeId)
@@ -170,7 +186,8 @@ public void startService(String serviceName) throws ClientManagerException, TExc
private IExternalService createExternalServiceInstance(String serviceName, String className) {
// close ClassLoader automatically to release the file handle
- try (ExternalServiceClassLoader classLoader = new ExternalServiceClassLoader(libRoot); ) {
+ try {
+ ExternalServiceClassLoader classLoader = new ExternalServiceClassLoader(libRoot);
return (IExternalService)
Class.forName(className, true, classLoader).getDeclaredConstructor().newInstance();
} catch (IOException
@@ -235,7 +252,7 @@ public void stopService(String serviceName) throws ClientManagerException, TExce
private void stopService(ServiceInfo serviceInfo) {
checkState(
serviceInfo.getServiceInstance() != null,
- "External Service instance is null when state is RUNNING!",
+ INSTANCE_NULL_ERROR_MSG,
serviceInfo.getServiceName());
serviceInfo.getServiceInstance().stop();
}
@@ -311,11 +328,34 @@ public void restoreRunningServiceInstance() {
serviceInfo -> {
// start services with RUNNING state
if (serviceInfo.getState() == RUNNING) {
- IExternalService serviceInstance =
- createExternalServiceInstance(
- serviceInfo.getServiceName(), serviceInfo.getClassName());
- serviceInfo.setServiceInstance(serviceInstance);
- serviceInstance.start();
+
+ try {
+ IExternalService serviceInstance =
+ createExternalServiceInstance(
+ serviceInfo.getServiceName(), serviceInfo.getClassName());
+ serviceInfo.setServiceInstance(serviceInstance);
+ } finally {
+ // set STOPPED to avoid the case: service is RUNNING, but its instance is null
+ if (serviceInfo.getServiceInstance() == null) {
+ serviceInfo.setState(STOPPED);
+ }
+ }
+
+ serviceInfo.getServiceInstance().start();
+ }
+ });
+ }
+
+ public void stopRunningServices() {
+ serviceInfos
+ .values()
+ .forEach(
+ serviceInfo -> {
+ // start services with RUNNING state
+ if (serviceInfo.getState() == RUNNING) {
+ IExternalService serviceInstance = serviceInfo.getServiceInstance();
+ checkState(serviceInstance != null, INSTANCE_NULL_ERROR_MSG);
+ serviceInstance.stop();
}
});
}
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/ServiceType.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/ServiceType.java
index 7267c79a66551..55fad14e5a10f 100644
--- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/ServiceType.java
+++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/ServiceType.java
@@ -25,7 +25,6 @@ public enum ServiceType {
METRIC_SERVICE("Metrics ServerService", "MetricService"),
RPC_SERVICE("RPC ServerService", "RPCService"),
INFLUX_SERVICE("InfluxDB Protocol Service", "InfluxDB Protocol"),
- MQTT_SERVICE("MQTTService", "MqttService"),
AIR_GAP_SERVICE("AirGapService", "AirGapService"),
MONITOR_SERVICE("Monitor ServerService", "Monitor"),
STAT_MONITOR_SERVICE("Statistics ServerService", "StatMonitorService"),
diff --git a/pom.xml b/pom.xml
index d6261e70af189..4a80bacb18890 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
distribution
example
library-udf
+ external-service-impl
From 5a883106e8195b944c5b462142b905d9d6bd652e Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 15:46:05 +0800
Subject: [PATCH 02/18] draft
Signed-off-by: Weihao Li <18110526956@163.com>
---
distribution/pom.xml | 7 ++
distribution/src/assembly/datanode.xml | 1 -
.../src/assembly/external-service-impl.xml | 60 +++++++++
example/mqtt-customize/pom.xml | 3 +-
.../CustomizedJsonPayloadFormatter.java | 6 +-
example/pom.xml | 2 +-
external-service-impl/mqtt/pom.xml | 117 +++++++++---------
.../src/assembly/external-service-impl.xml | 33 +++++
.../org.apache.iotdb.mqtt.PayloadFormatter | 0
external-service-impl/pom.xml | 7 +-
iotdb-core/datanode/pom.xml | 8 --
11 files changed, 167 insertions(+), 77 deletions(-)
create mode 100644 distribution/src/assembly/external-service-impl.xml
create mode 100644 external-service-impl/mqtt/src/assembly/external-service-impl.xml
rename external-service-impl/mqtt/src/main/resources/{META-INF.services => META-INF/services}/org.apache.iotdb.mqtt.PayloadFormatter (100%)
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 38c4602d1135b..8b13a815a5ad4 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -53,6 +53,11 @@
library-udf
2.0.7-SNAPSHOT
+
+ org.apache.iotdb
+ mqtt
+ 2.0.7-SNAPSHOT
+
@@ -74,6 +79,7 @@
src/assembly/confignode.xml
src/assembly/cli.xml
src/assembly/library-udf.xml
+ src/assembly/external-service-impl.xml
apache-iotdb-${project.version}
@@ -107,6 +113,7 @@
apache-iotdb-${project.version}-cli-bin.zip
apache-iotdb-${project.version}-confignode-bin.zip
apache-iotdb-${project.version}-library-udf-bin.zip
+ apache-iotdb-${project.version}-external-service-impl-bin.zip
diff --git a/distribution/src/assembly/datanode.xml b/distribution/src/assembly/datanode.xml
index 5393568e4cf43..016059a903a4f 100644
--- a/distribution/src/assembly/datanode.xml
+++ b/distribution/src/assembly/datanode.xml
@@ -31,7 +31,6 @@
*:iotdb-server:zip:*
*:iotdb-cli:zip:*
- *:external-service-impl
${file.separator}
${artifact.artifactId}.${artifact.extension}
diff --git a/distribution/src/assembly/external-service-impl.xml b/distribution/src/assembly/external-service-impl.xml
new file mode 100644
index 0000000000000..b5a46fbb7cc93
--- /dev/null
+++ b/distribution/src/assembly/external-service-impl.xml
@@ -0,0 +1,60 @@
+
+
+
+ external-service-impl-bin
+
+ dir
+ zip
+
+ apache-iotdb-${project.version}-external-service-impl-bin
+
+
+
+ org.apache.iotdb:mqtt
+
+
+ ${artifact.artifactId}.${artifact.extension}
+ false
+ true
+ true
+ runtime
+
+
+
+
+ ${project.basedir}/../licenses
+ licenses
+
+
+
+
+ ${project.basedir}/../LICENSE-binary
+ licenses
+ LICENSE
+
+
+ ${project.basedir}/../NOTICE-binary
+ licenses
+ NOTICE
+
+
+
diff --git a/example/mqtt-customize/pom.xml b/example/mqtt-customize/pom.xml
index c685748026401..5af64dd9fc565 100644
--- a/example/mqtt-customize/pom.xml
+++ b/example/mqtt-customize/pom.xml
@@ -29,10 +29,9 @@
customize-mqtt-example
IoTDB: Example: Customized MQTT
-
org.apache.iotdb
- iotdb-mqtt
+ mqtt
${project.version}
diff --git a/example/mqtt-customize/src/main/java/org/apache/iotdb/mqtt/server/CustomizedJsonPayloadFormatter.java b/example/mqtt-customize/src/main/java/org/apache/iotdb/mqtt/server/CustomizedJsonPayloadFormatter.java
index 8c3a962173985..b16c4928a0b7a 100644
--- a/example/mqtt-customize/src/main/java/org/apache/iotdb/mqtt/server/CustomizedJsonPayloadFormatter.java
+++ b/example/mqtt-customize/src/main/java/org/apache/iotdb/mqtt/server/CustomizedJsonPayloadFormatter.java
@@ -19,9 +19,9 @@
package org.apache.iotdb.mqtt.server;
-import org.apache.iotdb.db.protocol.mqtt.Message;
-import org.apache.iotdb.db.protocol.mqtt.PayloadFormatter;
-import org.apache.iotdb.db.protocol.mqtt.TreeMessage;
+import org.apache.iotdb.mqtt.Message;
+import org.apache.iotdb.mqtt.PayloadFormatter;
+import org.apache.iotdb.mqtt.TreeMessage;
import io.netty.buffer.ByteBuf;
import org.apache.tsfile.external.commons.lang3.NotImplementedException;
diff --git a/example/pom.xml b/example/pom.xml
index 5b6bac69a0e56..9af648e0d262a 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -32,7 +32,7 @@
jdbc
mqtt
-
+ mqtt-customize
pipe-count-point-processor
pipe-opc-ua-sink
rest-java-example
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 3e08d1e7ff0d9..510e7cf8bbf4f 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -27,6 +27,7 @@
2.0.7-SNAPSHOT
mqtt
+ IoTDB: External-Service-Impl: MQTT
11
11
@@ -36,37 +37,46 @@
com.github.moquette-io.moquette
moquette-broker
-
-
- com.google.code.gson
- gson
-
-
- io.netty
- netty-buffer
-
-
- org.apache.iotdb
- iotdb-thrift-commons
- 2.0.7-SNAPSHOT
-
-
- org.apache.tsfile
- tsfile
- ${tsfile.version}
-
-
- com.google.guava
- guava
-
-
- org.apache.iotdb
- iotdb-thrift
- 2.0.7-SNAPSHOT
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ io.netty
+ netty-common
+
+
+ io.netty
+ netty-transport
+
+
+ io.netty
+ netty-resolver
+
+
+ io.netty
+ netty-handler
+
+
+ io.netty
+ netty-transport-native-unix-common
+
+
+ io.netty
+ netty-codec
+
+
+ io.netty
+ netty-codec-http
+
+
org.apache.iotdb
- node-commons
+ iotdb-server
+ provided
2.0.7-SNAPSHOT
@@ -83,33 +93,26 @@
netty-codec-mqtt
-
-
- get-jar-with-dependencies
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- jar-with-dependencies
-
-
-
-
- make-assembly
-
-
- single
-
-
- package
-
-
-
-
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
diff --git a/external-service-impl/mqtt/src/assembly/external-service-impl.xml b/external-service-impl/mqtt/src/assembly/external-service-impl.xml
new file mode 100644
index 0000000000000..735e6ed0d7f10
--- /dev/null
+++ b/external-service-impl/mqtt/src/assembly/external-service-impl.xml
@@ -0,0 +1,33 @@
+
+
+
+ jar-with-dependencies
+
+ jar
+
+ false
+
+
+ lib
+
+
+
diff --git a/external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter b/external-service-impl/mqtt/src/main/resources/META-INF/services/org.apache.iotdb.mqtt.PayloadFormatter
similarity index 100%
rename from external-service-impl/mqtt/src/main/resources/META-INF.services/org.apache.iotdb.mqtt.PayloadFormatter
rename to external-service-impl/mqtt/src/main/resources/META-INF/services/org.apache.iotdb.mqtt.PayloadFormatter
diff --git a/external-service-impl/pom.xml b/external-service-impl/pom.xml
index 2eeaec2c0141d..b2191a28d0d96 100644
--- a/external-service-impl/pom.xml
+++ b/external-service-impl/pom.xml
@@ -27,6 +27,7 @@
2.0.7-SNAPSHOT
external-service-impl
+ IoTDB: External-Service-Impl
pom
mqtt
@@ -40,11 +41,7 @@
org.apache.iotdb
external-service-api
- 2.0.7-SNAPSHOT
-
-
- org.apache.iotdb
- iotdb-server
+ provided
2.0.7-SNAPSHOT
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index af2c714b0eaea..b55fd8e5c6827 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -212,10 +212,6 @@
org.eclipse.jetty
jetty-http
-
- io.netty
- netty-codec-mqtt
-
org.apache.commons
commons-pool2
@@ -271,10 +267,6 @@
com.google.code.gson
gson
-
- io.netty
- netty-buffer
-
org.eclipse.jetty
jetty-servlet
From 9175879393119ca79c33a6bda263fb79dbb0533d Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 17:38:06 +0800
Subject: [PATCH 03/18] add file put
Signed-off-by: Weihao Li <18110526956@163.com>
---
distribution/pom.xml | 5 ---
distribution/src/assembly/all.xml | 5 ++-
distribution/src/assembly/datanode.xml | 4 +++
.../src/assembly/external-service-impl.xml | 17 +++-------
external-service-impl/mqtt/pom.xml | 11 +++++--
.../src/assembly/external-service-impl.xml | 33 -------------------
6 files changed, 21 insertions(+), 54 deletions(-)
delete mode 100644 external-service-impl/mqtt/src/assembly/external-service-impl.xml
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 8b13a815a5ad4..9d458cf8a071b 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -53,11 +53,6 @@
library-udf
2.0.7-SNAPSHOT
-
- org.apache.iotdb
- mqtt
- 2.0.7-SNAPSHOT
-
diff --git a/distribution/src/assembly/all.xml b/distribution/src/assembly/all.xml
index e28fc04a9ee8e..255912d75e611 100644
--- a/distribution/src/assembly/all.xml
+++ b/distribution/src/assembly/all.xml
@@ -32,7 +32,6 @@
*:iotdb-server:zip:*
*:iotdb-cli:zip:*
*:iotdb-confignode:zip:*
- *:external-service-impl:zip:*
${file.separator}
${artifact.artifactId}.${artifact.extension}
@@ -93,6 +92,10 @@
conf
0755
+
+ ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ lib
+
common-files.xml
diff --git a/distribution/src/assembly/datanode.xml b/distribution/src/assembly/datanode.xml
index 016059a903a4f..cbc2cd9617b8c 100644
--- a/distribution/src/assembly/datanode.xml
+++ b/distribution/src/assembly/datanode.xml
@@ -72,6 +72,10 @@
**/*ainode.*
0755
+
+ ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ lib
+
diff --git a/distribution/src/assembly/external-service-impl.xml b/distribution/src/assembly/external-service-impl.xml
index b5a46fbb7cc93..273efe6eddfb5 100644
--- a/distribution/src/assembly/external-service-impl.xml
+++ b/distribution/src/assembly/external-service-impl.xml
@@ -26,19 +26,6 @@
zip
apache-iotdb-${project.version}-external-service-impl-bin
-
-
-
- org.apache.iotdb:mqtt
-
-
- ${artifact.artifactId}.${artifact.extension}
- false
- true
- true
- runtime
-
-
${project.basedir}/../licenses
@@ -56,5 +43,9 @@
licenses
NOTICE
+
+ ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ /
+
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 510e7cf8bbf4f..f62f7e475c256 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -96,20 +96,27 @@
- org.apache.maven.plugins
maven-assembly-plugin
+ ${maven.assembly.version}
jar-with-dependencies
+
+
+ true
+
+
make-assembly
- package
+
single
+
+ package
diff --git a/external-service-impl/mqtt/src/assembly/external-service-impl.xml b/external-service-impl/mqtt/src/assembly/external-service-impl.xml
deleted file mode 100644
index 735e6ed0d7f10..0000000000000
--- a/external-service-impl/mqtt/src/assembly/external-service-impl.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- jar-with-dependencies
-
- jar
-
- false
-
-
- lib
-
-
-
From a52aa8494273f7df82ef8571cf2f25973428417d Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 18:09:09 +0800
Subject: [PATCH 04/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
distribution/src/assembly/datanode.xml | 10 ++++++----
external-service-impl/mqtt/pom.xml | 4 ++++
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/distribution/src/assembly/datanode.xml b/distribution/src/assembly/datanode.xml
index cbc2cd9617b8c..8994667fb873a 100644
--- a/distribution/src/assembly/datanode.xml
+++ b/distribution/src/assembly/datanode.xml
@@ -72,12 +72,14 @@
**/*ainode.*
0755
-
- ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
- lib
-
+
+
+ ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ lib
+
+
common-files.xml
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index f62f7e475c256..994c6917ad242 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -43,6 +43,10 @@
org.slf4j
slf4j-api
+
+ io.netty
+ netty-buffer
+
io.netty
netty-common
From 6f82027f6dfe909d98cba385cdd5f9a53d314596 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 19:20:18 +0800
Subject: [PATCH 05/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
example/mqtt-customize/pom.xml | 5 +++++
external-service-impl/mqtt/pom.xml | 13 -------------
integration-test/src/assembly/mpp-share.xml | 6 ++++++
3 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/example/mqtt-customize/pom.xml b/example/mqtt-customize/pom.xml
index 5af64dd9fc565..6d0ba2d0953d5 100644
--- a/example/mqtt-customize/pom.xml
+++ b/example/mqtt-customize/pom.xml
@@ -34,5 +34,10 @@
mqtt
${project.version}
+
+ org.apache.iotdb
+ iotdb-server
+ ${project.version}
+
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 994c6917ad242..043f1dc1c7130 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -83,19 +83,6 @@
provided
2.0.7-SNAPSHOT
-
- org.slf4j
- slf4j-api
-
-
- org.apache.iotdb
- service-rpc
- 2.0.7-SNAPSHOT
-
-
- io.netty
- netty-codec-mqtt
-
diff --git a/integration-test/src/assembly/mpp-share.xml b/integration-test/src/assembly/mpp-share.xml
index 01fce3555def2..ebe153e71be6f 100644
--- a/integration-test/src/assembly/mpp-share.xml
+++ b/integration-test/src/assembly/mpp-share.xml
@@ -30,4 +30,10 @@
lib
+
+
+ ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ lib
+
+
From d9bd1ea62b055a63119e435ce8899a8d44fd051c Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 20:21:19 +0800
Subject: [PATCH 06/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
external-service-impl/mqtt/pom.xml | 5 -----
integration-test/pom.xml | 5 +++++
iotdb-core/datanode/pom.xml | 4 ++++
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 043f1dc1c7130..1acd9101e2716 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -93,11 +93,6 @@
jar-with-dependencies
-
-
- true
-
-
diff --git a/integration-test/pom.xml b/integration-test/pom.xml
index f566c8e5995b7..203ce2e11dbf9 100644
--- a/integration-test/pom.xml
+++ b/integration-test/pom.xml
@@ -227,6 +227,11 @@
httpcore
test
+
+ org.apache.iotdb
+ external-service-api
+ 2.0.7-SNAPSHOT
+
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index b55fd8e5c6827..56cf00595f613 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -267,6 +267,10 @@
com.google.code.gson
gson
+
+ io.netty
+ netty-buffer
+
org.eclipse.jetty
jetty-servlet
From c3216dc9ff76095df4dcd634bf43a7c04c9dfa3e Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 20:23:14 +0800
Subject: [PATCH 07/18] modify CI profile to location error
Signed-off-by: Weihao Li <18110526956@163.com>
---
.github/workflows/cluster-it-1c1d.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/cluster-it-1c1d.yml b/.github/workflows/cluster-it-1c1d.yml
index a2989a8e81c92..2425c38790737 100644
--- a/.github/workflows/cluster-it-1c1d.yml
+++ b/.github/workflows/cluster-it-1c1d.yml
@@ -80,6 +80,7 @@ jobs:
-DintegrationTest.forkCount=2 \
-pl integration-test \
-am
+ -X
- name: Upload Artifact
if: failure()
uses: actions/upload-artifact@v4
From e1b2a5144dc420b91fdd6451e0fb08a1f36d0337 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 20:42:41 +0800
Subject: [PATCH 08/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
iotdb-core/datanode/pom.xml | 4 ----
.../db/service/externalservice/BuiltinExternalServices.java | 5 +++--
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index 56cf00595f613..b55fd8e5c6827 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -267,10 +267,6 @@
com.google.code.gson
gson
-
- io.netty
- netty-buffer
-
org.eclipse.jetty
jetty-servlet
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
index dfe90cb3ca1b5..76940755e4a19 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.db.service.externalservice;
+import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
+
import java.util.function.Supplier;
public enum BuiltinExternalServices {
@@ -26,8 +28,7 @@ public enum BuiltinExternalServices {
REST(
"REST",
"org.apache.iotdb.mqtt.RestService",
- // IoTDBRestServiceDescriptor.getInstance().getConfig()::isEnableRestService
- () -> false);
+ IoTDBRestServiceDescriptor.getInstance().getConfig()::isEnableRestService);
private final String serviceName;
private final String className;
From 2c6a20701214d726f439ec92be934364e661f18f Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 21:04:09 +0800
Subject: [PATCH 09/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
.github/workflows/cluster-it-1c1d.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/cluster-it-1c1d.yml b/.github/workflows/cluster-it-1c1d.yml
index 2425c38790737..42feb2f77a40e 100644
--- a/.github/workflows/cluster-it-1c1d.yml
+++ b/.github/workflows/cluster-it-1c1d.yml
@@ -79,7 +79,7 @@ jobs:
-DskipUTs \
-DintegrationTest.forkCount=2 \
-pl integration-test \
- -am
+ -am \
-X
- name: Upload Artifact
if: failure()
From 98ce9a6d34016848114e1800a6a5985fcb394e09 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 21:14:53 +0800
Subject: [PATCH 10/18] fix some
Signed-off-by: Weihao Li <18110526956@163.com>
---
.github/workflows/cluster-it-1c3d.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/cluster-it-1c3d.yml b/.github/workflows/cluster-it-1c3d.yml
index bb359626520d2..f36b5079275c1 100644
--- a/.github/workflows/cluster-it-1c3d.yml
+++ b/.github/workflows/cluster-it-1c3d.yml
@@ -59,6 +59,7 @@ jobs:
-DskipUTs \
-DintegrationTest.forkCount=6 -DConfigNodeMaxHeapSize=1024 -DDataNodeMaxHeapSize=1024 \
-pl integration-test \
+ -e \
-am -PClusterIT
- name: Upload Artifact
if: failure()
From db24596058ca8c724adee03bb2a08e302bace1be Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 21:37:15 +0800
Subject: [PATCH 11/18] change path
Signed-off-by: Weihao Li <18110526956@163.com>
---
integration-test/src/assembly/mpp-share.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/integration-test/src/assembly/mpp-share.xml b/integration-test/src/assembly/mpp-share.xml
index ebe153e71be6f..599b238187871 100644
--- a/integration-test/src/assembly/mpp-share.xml
+++ b/integration-test/src/assembly/mpp-share.xml
@@ -32,7 +32,7 @@
- ${maven.multiModuleProjectDirectory}/external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ ../external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
lib
From 162b47e3134bb90ccb3afed219e4de08fdcd9c88 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Mon, 19 Jan 2026 21:52:16 +0800
Subject: [PATCH 12/18] change path
Signed-off-by: Weihao Li <18110526956@163.com>
---
integration-test/src/assembly/mpp-share.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/integration-test/src/assembly/mpp-share.xml b/integration-test/src/assembly/mpp-share.xml
index 599b238187871..96ac13e64d179 100644
--- a/integration-test/src/assembly/mpp-share.xml
+++ b/integration-test/src/assembly/mpp-share.xml
@@ -32,7 +32,7 @@
- ../external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
+ ${project.basedir}/../external-service-impl/mqtt/target/mqtt-${project.version}-jar-with-dependencies.jar
lib
From ab25b3ec52cedab62ebfd1e275a361eaeef53547 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 11:10:35 +0800
Subject: [PATCH 13/18] fix
Signed-off-by: Weihao Li <18110526956@163.com>
---
.github/workflows/cluster-it-1c1d.yml | 3 +--
.github/workflows/cluster-it-1c3d.yml | 1 -
external-service-impl/mqtt/pom.xml | 4 ++--
external-service-impl/pom.xml | 4 ++--
integration-test/pom.xml | 7 +++++++
.../externalservice/BuiltinExternalServices.java | 12 ++++++++----
.../ExternalServiceManagementService.java | 4 ++--
7 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/cluster-it-1c1d.yml b/.github/workflows/cluster-it-1c1d.yml
index 42feb2f77a40e..a2989a8e81c92 100644
--- a/.github/workflows/cluster-it-1c1d.yml
+++ b/.github/workflows/cluster-it-1c1d.yml
@@ -79,8 +79,7 @@ jobs:
-DskipUTs \
-DintegrationTest.forkCount=2 \
-pl integration-test \
- -am \
- -X
+ -am
- name: Upload Artifact
if: failure()
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/cluster-it-1c3d.yml b/.github/workflows/cluster-it-1c3d.yml
index f36b5079275c1..bb359626520d2 100644
--- a/.github/workflows/cluster-it-1c3d.yml
+++ b/.github/workflows/cluster-it-1c3d.yml
@@ -59,7 +59,6 @@ jobs:
-DskipUTs \
-DintegrationTest.forkCount=6 -DConfigNodeMaxHeapSize=1024 -DDataNodeMaxHeapSize=1024 \
-pl integration-test \
- -e \
-am -PClusterIT
- name: Upload Artifact
if: failure()
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 1acd9101e2716..ed9c5cb1ba7e2 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -29,8 +29,8 @@
mqtt
IoTDB: External-Service-Impl: MQTT
- 11
- 11
+ 8
+ 8
UTF-8
diff --git a/external-service-impl/pom.xml b/external-service-impl/pom.xml
index b2191a28d0d96..986522e6275d2 100644
--- a/external-service-impl/pom.xml
+++ b/external-service-impl/pom.xml
@@ -33,8 +33,8 @@
mqtt
- 11
- 11
+ 8
+ 8
UTF-8
diff --git a/integration-test/pom.xml b/integration-test/pom.xml
index 203ce2e11dbf9..c82a63c3f3b15 100644
--- a/integration-test/pom.xml
+++ b/integration-test/pom.xml
@@ -232,6 +232,13 @@
external-service-api
2.0.7-SNAPSHOT
+
+ org.apache.iotdb
+ mqtt
+ 2.0.7-SNAPSHOT
+
+ provided
+
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
index 76940755e4a19..4dee890e65fd8 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/BuiltinExternalServices.java
@@ -19,16 +19,20 @@
package org.apache.iotdb.db.service.externalservice;
-import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
import java.util.function.Supplier;
public enum BuiltinExternalServices {
- MQTT("MQTT", "org.apache.iotdb.mqtt.MQTTService", () -> true),
+ MQTT(
+ "MQTT",
+ "org.apache.iotdb.mqtt.MQTTService",
+ IoTDBDescriptor.getInstance().getConfig()::isEnableMQTTService),
REST(
"REST",
- "org.apache.iotdb.mqtt.RestService",
- IoTDBRestServiceDescriptor.getInstance().getConfig()::isEnableRestService);
+ "org.apache.iotdb.rest.RestService",
+ // IoTDBRestServiceDescriptor.getInstance().getConfig()::isEnableRestService
+ () -> false);
private final String serviceName;
private final String className;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
index 234d81d82c0e2..c7cb3497b4c9f 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
@@ -73,10 +73,10 @@ private ExternalServiceManagementService(String libRoot) {
this.serviceInfos = new HashMap<>();
restoreBuiltInServices();
this.libRoot = libRoot;
- makDir(libRoot);
+ makeDir(libRoot);
}
- private static void makDir(String dir) {
+ private static void makeDir(String dir) {
try {
SystemFileFactory.INSTANCE.makeDirIfNecessary(dir);
} catch (IOException e) {
From cefeba4d3ba345f69cceda4db6e96ba9673bbac6 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 11:31:31 +0800
Subject: [PATCH 14/18] add transmitted dependencies declaration
Signed-off-by: Weihao Li <18110526956@163.com>
---
external-service-impl/mqtt/pom.xml | 54 ++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index ed9c5cb1ba7e2..bc3de95ff1f92 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -77,12 +77,66 @@
+
+ io.netty
+ netty-codec-mqtt
+
org.apache.iotdb
iotdb-server
provided
2.0.7-SNAPSHOT
+
+ com.google.code.gson
+ gson
+ provided
+
+
+ io.netty
+ netty-buffer
+ provided
+
+
+ org.apache.iotdb
+ iotdb-thrift-commons
+ 2.0.7-SNAPSHOT
+ provided
+
+
+ org.apache.tsfile
+ tsfile
+ ${tsfile.version}
+ provided
+
+
+ com.google.guava
+ guava
+ provided
+
+
+ org.apache.iotdb
+ iotdb-thrift
+ 2.0.7-SNAPSHOT
+ provided
+
+
+ org.apache.iotdb
+ node-commons
+ 2.0.7-SNAPSHOT
+ provided
+
+
+ org.slf4j
+ slf4j-api
+ provided
+
+
+ org.apache.iotdb
+ service-rpc
+ 2.0.7-SNAPSHOT
+ provided
+
From 37e5c202f5e4f7a7e409c0725edee9120a80705d Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 12:28:47 +0800
Subject: [PATCH 15/18] fix copilot
Signed-off-by: Weihao Li <18110526956@163.com>
---
external-service-impl/mqtt/pom.xml | 6 ++++++
.../externalservice/ExternalServiceManagementService.java | 6 ++++--
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index bc3de95ff1f92..54024c6cd486e 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -109,6 +109,12 @@
${tsfile.version}
provided
+
+ org.apache.tsfile
+ common
+ ${tsfile.version}
+ provided
+
com.google.guava
guava
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
index c7cb3497b4c9f..40859f3c7a39c 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
@@ -187,6 +187,8 @@ public void startService(String serviceName) throws ClientManagerException, TExc
private IExternalService createExternalServiceInstance(String serviceName, String className) {
// close ClassLoader automatically to release the file handle
try {
+ // Remind: this classLoader should be closed when service is dropped after user-defined
+ // service supported
ExternalServiceClassLoader classLoader = new ExternalServiceClassLoader(libRoot);
return (IExternalService)
Class.forName(className, true, classLoader).getDeclaredConstructor().newInstance();
@@ -333,15 +335,15 @@ public void restoreRunningServiceInstance() {
IExternalService serviceInstance =
createExternalServiceInstance(
serviceInfo.getServiceName(), serviceInfo.getClassName());
+ checkState(serviceInstance != null, INSTANCE_NULL_ERROR_MSG);
serviceInfo.setServiceInstance(serviceInstance);
+ serviceInstance.start();
} finally {
// set STOPPED to avoid the case: service is RUNNING, but its instance is null
if (serviceInfo.getServiceInstance() == null) {
serviceInfo.setState(STOPPED);
}
}
-
- serviceInfo.getServiceInstance().start();
}
});
}
From 04904b16b3ca5a7739fc80f13bac0f3aeb032580 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 12:35:19 +0800
Subject: [PATCH 16/18] add dependency for Distribution
Signed-off-by: Weihao Li <18110526956@163.com>
---
distribution/pom.xml | 6 ++++++
.../externalservice/ExternalServiceManagementService.java | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 9d458cf8a071b..025a67b379d66 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -53,6 +53,12 @@
library-udf
2.0.7-SNAPSHOT
+
+ org.apache.iotdb
+ mqtt
+ 2.0.7-SNAPSHOT
+ provided
+
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
index 40859f3c7a39c..54cc576c048de 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/externalservice/ExternalServiceManagementService.java
@@ -353,7 +353,7 @@ public void stopRunningServices() {
.values()
.forEach(
serviceInfo -> {
- // start services with RUNNING state
+ // stop services with RUNNING state
if (serviceInfo.getState() == RUNNING) {
IExternalService serviceInstance = serviceInfo.getServiceInstance();
checkState(serviceInstance != null, INSTANCE_NULL_ERROR_MSG);
From daaa07aab64196281282c312afc1cd4958da2c97 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 14:15:24 +0800
Subject: [PATCH 17/18] ignore common
Signed-off-by: Weihao Li <18110526956@163.com>
---
external-service-impl/mqtt/pom.xml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 54024c6cd486e..0d8913a805cab 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -166,6 +166,15 @@
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ org.apache.tsfile:common
+
+
+
From 13bad13961c58813408be7b24a58e1ee691c8368 Mon Sep 17 00:00:00 2001
From: Weihao Li <18110526956@163.com>
Date: Tue, 20 Jan 2026 17:16:53 +0800
Subject: [PATCH 18/18] undeclare netty-codec-mqtt to reduce jar size(1.6MB)
Signed-off-by: Weihao Li <18110526956@163.com>
---
external-service-impl/mqtt/pom.xml | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/external-service-impl/mqtt/pom.xml b/external-service-impl/mqtt/pom.xml
index 0d8913a805cab..5ec51069b212e 100644
--- a/external-service-impl/mqtt/pom.xml
+++ b/external-service-impl/mqtt/pom.xml
@@ -77,10 +77,6 @@
-
- io.netty
- netty-codec-mqtt
-
org.apache.iotdb
iotdb-server
@@ -171,6 +167,7 @@
maven-dependency-plugin
+ io.netty:netty-codec-mqtt
org.apache.tsfile:common