Commit a7d71ea6 authored by areej.mohammad's avatar areej.mohammad

commit

parent 380fe34a
......@@ -11,9 +11,7 @@
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="autohealer" target="17" />
<module name="flaky.worker" target="1.8" />
<module name="transientworker" target="17" />
</bytecodeTargetLevel>
</component>
</project>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: ch.qos.logback:logback-classic:1.2.10">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: ch.qos.logback:logback-core:1.2.10">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: commons-io:commons-io:2.11.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.11.0/commons-io-2.11.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-buffer:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.94.Final/netty-buffer-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.94.Final/netty-buffer-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.94.Final/netty-buffer-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-codec:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.94.Final/netty-codec-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.94.Final/netty-codec-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.94.Final/netty-codec-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-common:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.94.Final/netty-common-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.94.Final/netty-common-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.94.Final/netty-common-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-handler:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.94.Final/netty-handler-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.94.Final/netty-handler-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.94.Final/netty-handler-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-resolver:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.94.Final/netty-resolver-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.94.Final/netty-resolver-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.94.Final/netty-resolver-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:linux-aarch_64:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-aarch_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:linux-x86_64:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-linux-x86_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:osx-aarch_64:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-aarch_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:osx-x86_64:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-osx-x86_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-boringssl-static:windows-x86_64:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-windows-x86_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-boringssl-static/2.0.61.Final/netty-tcnative-boringssl-static-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-tcnative-classes:2.0.61.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-classes/2.0.61.Final/netty-tcnative-classes-2.0.61.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-classes/2.0.61.Final/netty-tcnative-classes-2.0.61.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-tcnative-classes/2.0.61.Final/netty-tcnative-classes-2.0.61.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-transport:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.94.Final/netty-transport-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.94.Final/netty-transport-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.94.Final/netty-transport-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-transport-classes-epoll:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.94.Final/netty-transport-classes-epoll-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.94.Final/netty-transport-classes-epoll-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.94.Final/netty-transport-classes-epoll-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.94.Final/netty-transport-native-epoll-4.1.94.Final-linux-x86_64.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.94.Final/netty-transport-native-epoll-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.94.Final/netty-transport-native-epoll-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: io.netty:netty-transport-native-unix-common:4.1.94.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.94.Final/netty-transport-native-unix-common-4.1.94.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.94.Final/netty-transport-native-unix-common-4.1.94.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.94.Final/netty-transport-native-unix-common-4.1.94.Final-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: org.apache.yetus:audience-annotations:0.12.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/yetus/audience-annotations/0.12.0/audience-annotations-0.12.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/yetus/audience-annotations/0.12.0/audience-annotations-0.12.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/yetus/audience-annotations/0.12.0/audience-annotations-0.12.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: org.apache.zookeeper:zookeeper:3.9.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper/3.9.1/zookeeper-3.9.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper/3.9.1/zookeeper-3.9.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper/3.9.1/zookeeper-3.9.1-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: org.apache.zookeeper:zookeeper-jute:3.9.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper-jute/3.9.1/zookeeper-jute-3.9.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper-jute/3.9.1/zookeeper-jute-3.9.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/zookeeper/zookeeper-jute/3.9.1/zookeeper-jute-3.9.1-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Maven: org.slf4j:slf4j-api:1.7.30">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/autohealer/autohealer.iml" filepath="$PROJECT_DIR$/autohealer/autohealer.iml" />
<module fileurl="file://$PROJECT_DIR$/transientworker/transientworker.iml" filepath="$PROJECT_DIR$/transientworker/transientworker.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_17">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper-jute:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.yetus:audience-annotations:0.12.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-classes-epoll:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-classes:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:linux-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:linux-aarch_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:osx-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:osx-aarch_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:windows-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.10" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.10" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
</component>
</module>
\ No newline at end of file
[2025-12-22 00:38:49] Autohealer started. Monitoring cluster for 2 workers.
[2025-12-22 00:38:49] Healing required: 0/2 workers active.
[2025-12-22 00:38:49] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000376)
[2025-12-22 00:38:49] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000377)
[2025-12-22 00:39:58] Autohealer started. Monitoring cluster for 4 workers.
[2025-12-22 00:39:58] Healing required: 0/4 workers active.
[2025-12-22 00:39:58] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000378)
[2025-12-22 00:39:58] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000379)
[2025-12-22 00:39:58] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000380)
[2025-12-22 00:39:58] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000381)
[2025-12-22 00:40:15] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:15] Healing required: 1/4 workers active.
[2025-12-22 00:40:15] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000382)
[2025-12-22 00:40:15] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000383)
[2025-12-22 00:40:15] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000384)
[2025-12-22 00:40:15] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:20] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:20] Healing required: 3/4 workers active.
[2025-12-22 00:40:20] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000385)
[2025-12-22 00:40:24] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:24] Healing required: 0/4 workers active.
[2025-12-22 00:40:24] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000386)
[2025-12-22 00:40:25] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000387)
[2025-12-22 00:40:25] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000388)
[2025-12-22 00:40:25] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000389)
[2025-12-22 00:40:27] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:30] Healing required: 1/4 workers active.
[2025-12-22 00:40:30] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000390)
[2025-12-22 00:40:30] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000391)
[2025-12-22 00:40:30] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000392)
[2025-12-22 00:40:30] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:31] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:31] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:32] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:34] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:38] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:38] Healing required: 2/4 workers active.
[2025-12-22 00:40:38] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000393)
[2025-12-22 00:40:38] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000394)
[2025-12-22 00:40:38] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:38] Healing required: 1/4 workers active.
[2025-12-22 00:40:38] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000395)
[2025-12-22 00:40:40] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000396)
[2025-12-22 00:40:40] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000397)
[2025-12-22 00:40:43] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:43] Healing required: 0/4 workers active.
[2025-12-22 00:40:45] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000398)
[2025-12-22 00:40:46] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000399)
[2025-12-22 00:40:46] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000400)
[2025-12-22 00:40:46] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000401)
[2025-12-22 00:40:46] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:54] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:54] Healing required: 0/4 workers active.
[2025-12-22 00:40:54] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000402)
[2025-12-22 00:40:54] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000403)
[2025-12-22 00:40:54] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000404)
[2025-12-22 00:40:54] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000405)
[2025-12-22 00:40:54] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:40:59] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:00] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:00] Healing required: 2/4 workers active.
[2025-12-22 00:41:00] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000406)
[2025-12-22 00:41:00] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000407)
[2025-12-22 00:41:01] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:02] Healing required: 3/4 workers active.
[2025-12-22 00:41:02] Scheduled new worker on node: node_192.168.56.1 (Task ID: task_0000000408)
[2025-12-22 00:41:02] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:02] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:03] Change detected in cluster (Nodes or Workers changed).
[2025-12-22 00:41:04] Change detected in cluster (Nodes or Workers changed).
......@@ -23,6 +23,31 @@
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<archive>
<manifest>
<mainClass>Application</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
......@@ -31,6 +56,12 @@
<artifactId>zookeeper</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -23,11 +23,18 @@
*/
import org.apache.zookeeper.KeeperException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
Logger.getLogger("org.apache.zookeeper").setLevel(Level.OFF);
System.setProperty("zookeeper.admin.enableServer", "false");
System.out.println("Logs are hidden! Successfully connected to Zookeeper.");
if (args.length != 2) {
System.out.println("Expecting parameters <number of workers> <path to worker jar file>");
System.exit(1);
......@@ -37,7 +44,7 @@ public class Application {
String pathToWorkerProgram = args[1];
Autohealer autohealer = new Autohealer(numberOfWorkers, pathToWorkerProgram);
autohealer.connectToZookeeper();
autohealer.startWatchingWorkers();
autohealer.startWatching();
autohealer.run();
autohealer.close();
}
......
/*
* MIT License
*
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import org.apache.zookeeper.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
public class Autohealer implements Watcher {
private static final String ZOOKEEPER_ADDRESS = "172.29.3.101:2181";
private static final String ZOOKEEPER_ADDRESS = "192.168.144.134:2181";
private static final int SESSION_TIMEOUT = 3000;
// Parent Znode where each worker stores an ephemeral child to indicate it is alive
private static final String AUTOHEALER_ZNODES_PATH = "/workers";
// Path to the worker jar
private final String pathToProgram;
// مسارات Zookeeper
private static final String WORKERS_PATH = "/workers";
private static final String NODES_PATH = "/nodes";
private static final String LOG_FILE = "cluster_events.log";
// The number of worker instances we need to maintain at all times
private final int numberOfWorkers;
private ZooKeeper zooKeeper;
private int nodeIndex = 0; // (Round Robin)
public Autohealer(int numberOfWorkers, String pathToProgram) {
this.numberOfWorkers = numberOfWorkers;
this.pathToProgram = pathToProgram;
}
public void startWatchingWorkers() throws KeeperException, InterruptedException {
if (zooKeeper.exists(AUTOHEALER_ZNODES_PATH, false) == null) {
zooKeeper.create(AUTOHEALER_ZNODES_PATH, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
launchWorkersIfNecessary();
}
public void connectToZookeeper() throws IOException {
this.zooKeeper = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, this);
}
public void run() throws InterruptedException {
synchronized (zooKeeper) {
zooKeeper.wait();
}
public void startWatching() throws KeeperException, InterruptedException {
ensurePathExists(WORKERS_PATH);
ensurePathExists(NODES_PATH);
logEvent("Autohealer started. Monitoring cluster for " + numberOfWorkers + " workers.");
checkHealthAndRebalance();
}
public void close() throws InterruptedException {
zooKeeper.close();
private void ensurePathExists(String path) throws KeeperException, InterruptedException {
if (zooKeeper.exists(path, false) == null) {
zooKeeper.create(path, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
@Override
......@@ -74,33 +48,91 @@ public class Autohealer implements Watcher {
case None:
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("Successfully connected to Zookeeper");
} else {
synchronized (zooKeeper) {
System.out.println("Disconnected from Zookeeper event");
zooKeeper.notifyAll();
}
}
break;
/**
* Add states code here to respond to the relevant events
*/
case NodeChildrenChanged:
// اكتشاف تغيير في العمال أو العقد الفيزيائية
logEvent("Change detected in cluster (Nodes or Workers changed).");
checkHealthAndRebalance();
break;
}
}
private void launchWorkersIfNecessary() {
/**
* Implement this method to watch and launch new workers if necessary
*/
private void checkHealthAndRebalance() {
try {
List<String> currentWorkers = zooKeeper.getChildren(WORKERS_PATH, this);
List<String> availableNodes = zooKeeper.getChildren(NODES_PATH, this);
int currentCount = currentWorkers.size();
int nodesCount = availableNodes.size();
System.out.println("Status: Workers = " + currentCount + ", Nodes = " + nodesCount);
if (currentCount < numberOfWorkers) {
if (nodesCount == 0) {
logEvent("CRITICAL: All physical nodes are down! Cannot heal cluster.");
return;
}
logEvent("Healing required: " + currentCount + "/" + numberOfWorkers + " workers active.");
int workersToLaunch = numberOfWorkers - currentCount;
distributeWorkers(workersToLaunch, availableNodes);
}
} catch (KeeperException | InterruptedException e) {
logEvent("Error during health check: " + e.getMessage());
e.printStackTrace();
}
}
/**
* Helper method to start a single worker
* @throws IOException
*/
private void startNewWorker() throws IOException {
File file = new File(pathToProgram);
String command = "java -jar " + file.getName();
System.out.println(String.format("Launching worker instance : %s ", command));
Runtime.getRuntime().exec(command, null, file.getParentFile());
private void distributeWorkers(int count, List<String> nodes) throws KeeperException, InterruptedException {
Collections.sort(nodes);
for (int i = 0; i < count; i++) {
String targetNode = nodes.get(nodeIndex % nodes.size());
nodeIndex++;
sendLaunchCommand(targetNode);
}
}
private void sendLaunchCommand(String nodeName) throws KeeperException, InterruptedException {
String taskPath = NODES_PATH + "/" + nodeName + "/tasks";
ensurePathExists(taskPath);
String taskNode = zooKeeper.create(taskPath + "/task_",
new byte[]{},
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
logEvent("Scheduled new worker on node: " + nodeName + " (Task ID: " + taskNode.substring(taskNode.lastIndexOf("/") + 1) + ")");
}
private void logEvent(String message) {
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String logMessage = "[" + timestamp + "] " + message;
System.out.println(logMessage);
try (FileWriter fw = new FileWriter(LOG_FILE, true);
PrintWriter out = new PrintWriter(fw)) {
out.println(logMessage);
} catch (IOException e) {
System.err.println("Could not write to log file: " + e.getMessage());
}
}
public void run() throws InterruptedException {
synchronized (zooKeeper) {
while (zooKeeper.getState().isAlive()) {
zooKeeper.wait(5000);
}
}
}
public void close() throws InterruptedException {
zooKeeper.close();
}
}
}
\ No newline at end of file
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %-5p %m%n
# ????? ????? ZooKeeper ?????????
log4j.logger.org.apache.zookeeper=ERROR
\ No newline at end of file
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %-5p %m%n
# ????? ????? ZooKeeper ?????????
log4j.logger.org.apache.zookeeper=ERROR
\ No newline at end of file
artifactId=autohealer
groupId=org.example
version=1.0-SNAPSHOT
C:\Users\J.N\IdeaProjects\auto-healer-zookeper\autohealer\src\main\java\Autohealer.java
C:\Users\J.N\IdeaProjects\auto-healer-zookeper\autohealer\src\main\java\Application.java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>transientworker</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer>
<mainClass>Application</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
......@@ -23,6 +23,27 @@
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>Application</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
......
import org.apache.zookeeper.*;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.List;
public class NodeAgent implements Watcher {
private static final String ZOOKEEPER_ADDRESS = "192.168.144.134:2181";
private static final int SESSION_TIMEOUT = 3000;
private static final String NODES_ROOT = "/nodes";
private static final String WORKER_JAR_PATH = "C:\\Users\\J.N\\IdeaProjects\\auto-healer-zookeper\\transientworker\\target\\transientworker-1.0-SNAPSHOT.jar";
private ZooKeeper zooKeeper;
private String myTasksPath;
public void connectToZookeeper() throws IOException {
this.zooKeeper = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, this);
}
public void registerNodeAndWatchTasks() throws KeeperException, InterruptedException, IOException {
ensurePath(NODES_ROOT, CreateMode.PERSISTENT);
String ipAddress = InetAddress.getLocalHost().getHostAddress();
String nodePath = NODES_ROOT + "/node_" + ipAddress;
ensurePath(nodePath, CreateMode.PERSISTENT);
String activePath = nodePath + "/active";
if (zooKeeper.exists(activePath, false) == null) {
zooKeeper.create(activePath, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
this.myTasksPath = nodePath + "/tasks";
ensurePath(myTasksPath, CreateMode.PERSISTENT);
System.out.println("Node Registered: " + nodePath + ". Watching tasks at: " + myTasksPath);
watchMyTasks();
}
private void ensurePath(String path, CreateMode mode) throws KeeperException, InterruptedException {
if (zooKeeper.exists(path, false) == null) {
zooKeeper.create(path, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, mode);
}
}
private void watchMyTasks() throws KeeperException, InterruptedException {
List<String> tasks = zooKeeper.getChildren(myTasksPath, this);
System.out.println("Current tasks count: " + tasks.size());
}
@Override
public void process(WatchedEvent event) {
if (event.getType() == Event.EventType.NodeChildrenChanged && event.getPath().equals(myTasksPath)) {
handleNewTask();
} else if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("Connected to Zookeeper");
}
}
private void handleNewTask() {
try {
startLocalWorker();
watchMyTasks(); // إعادة المراقبة
} catch (Exception e) { e.printStackTrace(); }
}
private void startLocalWorker() throws IOException {
File jarFile = new File(WORKER_JAR_PATH);
ProcessBuilder pb = new ProcessBuilder("java", "-jar", jarFile.getAbsolutePath());
pb.inheritIO();
pb.directory(jarFile.getParentFile());
System.out.println("New worker launched locally!");
pb.start();
}
public static void main(String[] args) throws Exception {
NodeAgent agent = new NodeAgent();
agent.connectToZookeeper();
agent.registerNodeAndWatchTasks();
synchronized (agent.zooKeeper) { agent.zooKeeper.wait(); }
}
}
\ No newline at end of file
......@@ -32,7 +32,7 @@ import java.util.Random;
import java.util.concurrent.locks.LockSupport;
public class Worker {
private static final String ZOOKEEPER_ADDRESS = "172.29.3.101:2181";
private static final String ZOOKEEPER_ADDRESS = "192.168.144.134:2181";
private static final int SESSION_TIMEOUT = 3000;
// Parent Znode where each worker stores an ephemeral child to indicate it is alive
......
artifactId=transientworker
groupId=org.example
version=1.0-SNAPSHOT
C:\Users\J.N\IdeaProjects\auto-healer-zookeper\transientworker\src\main\java\Application.java
C:\Users\J.N\IdeaProjects\auto-healer-zookeper\transientworker\src\main\java\NodeAgent.java
C:\Users\J.N\IdeaProjects\auto-healer-zookeper\transientworker\src\main\java\Worker.java
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_17">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper-jute:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.yetus:audience-annotations:0.12.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-classes-epoll:4.1.94.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-classes:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:linux-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:linux-aarch_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:osx-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:osx-aarch_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-tcnative-boringssl-static:windows-x86_64:2.0.61.Final" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.10" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.10" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
</component>
</module>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment