Parcourir la source

增加自定义r2dbc配置

zhou-hao il y a 3 ans
Parent
commit
a029da90e4

+ 40 - 0
jetlinks-components/configure-component/pom.xml

@@ -0,0 +1,40 @@
+<?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/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jetlinks-community</artifactId>
+        <groupId>org.jetlinks.community</groupId>
+        <version>1.11.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>configure-component</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-r2dbc</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>io.r2dbc</groupId>
+            <artifactId>r2dbc-pool</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 64 - 0
jetlinks-components/configure-component/src/main/java/org/jetlinks/community/configure/r2dbc/R2dbcPoolConfiguration.java

@@ -0,0 +1,64 @@
+package org.jetlinks.community.configure.r2dbc;
+
+import io.r2dbc.pool.ConnectionPool;
+import io.r2dbc.pool.ConnectionPoolConfiguration;
+import io.r2dbc.spi.ConnectionFactory;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.r2dbc.*;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.context.properties.PropertyMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.util.StringUtils;
+
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(ConnectionPool.class)
+@ConditionalOnMissingBean(ConnectionFactory.class)
+@EnableConfigurationProperties({
+    R2dbcPoolProperties.class,
+    R2dbcProperties.class
+})
+@AutoConfigureBefore(R2dbcAutoConfiguration.class)
+public class R2dbcPoolConfiguration {
+
+    @Bean(destroyMethod = "dispose")
+    @Primary
+    ConnectionPool connectionFactory(R2dbcProperties properties,
+                                     R2dbcPoolProperties poolProperties,
+                                     ResourceLoader resourceLoader,
+                                     ObjectProvider<ConnectionFactoryOptionsBuilderCustomizer> customizers) {
+        ConnectionFactory connectionFactory = ConnectionFactoryBuilder
+            .of(properties, () -> EmbeddedDatabaseConnection.get(resourceLoader.getClassLoader()))
+            .configure((options) -> {
+                for (ConnectionFactoryOptionsBuilderCustomizer optionsCustomizer : customizers) {
+                    optionsCustomizer.customize(options);
+                }
+            })
+            .build();
+        R2dbcProperties.Pool pool = properties.getPool();
+
+        ConnectionPoolConfiguration.Builder builder = ConnectionPoolConfiguration.builder(connectionFactory);
+        PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
+        map.from(pool.getMaxIdleTime()).to(builder::maxIdleTime);
+        map.from(poolProperties.getMaxLifeTime()).to(builder::maxLifeTime);
+        map.from(poolProperties.getMaxAcquireTime()).to(builder::maxAcquireTime);
+        map.from(poolProperties.getMaxCreateConnectionTime()).to(builder::maxCreateConnectionTime);
+        map.from(pool.getInitialSize()).to(builder::initialSize);
+        map.from(pool.getMaxSize()).to(builder::maxSize);
+        map.from(pool.getValidationQuery()).whenHasText().to(builder::validationQuery);
+        map.from(poolProperties.getValidationDepth()).to(builder::validationDepth);
+        map.from(poolProperties.getAcquireRetry()).to(builder::acquireRetry);
+
+        if (StringUtils.hasText(pool.getValidationQuery())) {
+            builder.validationQuery(pool.getValidationQuery());
+        }
+
+        return new ConnectionPool(builder.build());
+    }
+
+}

+ 43 - 0
jetlinks-components/configure-component/src/main/java/org/jetlinks/community/configure/r2dbc/R2dbcPoolProperties.java

@@ -0,0 +1,43 @@
+package org.jetlinks.community.configure.r2dbc;
+
+import io.r2dbc.spi.ValidationDepth;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.time.Duration;
+
+@Getter
+@Setter
+@ConfigurationProperties(prefix = "spring.r2dbc.pool")
+public class R2dbcPoolProperties {
+
+    /**
+     * Maximum lifetime of a connection in the pool. By default, connections have an
+     * infinite lifetime.
+     */
+    private Duration maxLifeTime = Duration.ofMinutes(10);
+
+    /**
+     * Maximum time to acquire a connection from the pool. By default, wait
+     * indefinitely.
+     */
+    private Duration maxAcquireTime;
+
+    private int acquireRetry = 3;
+    /**
+     * Maximum time to wait to create a new connection. By default, wait indefinitely.
+     */
+    private Duration maxCreateConnectionTime;
+
+    /**
+     * Validation query.
+     */
+    private String validationQuery;
+
+    /**
+     * Validation depth.
+     */
+    private ValidationDepth validationDepth = ValidationDepth.LOCAL;
+
+}

+ 2 - 0
jetlinks-components/configure-component/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.jetlinks.community.configure.r2dbc.R2dbcPoolConfiguration

+ 1 - 0
jetlinks-components/pom.xml

@@ -22,6 +22,7 @@
         <module>notify-component</module>
         <module>logging-component</module>
         <module>rule-engine-component</module>
+        <module>configure-component</module>
     </modules>
 
     <artifactId>jetlinks-components</artifactId>

+ 5 - 0
jetlinks-standalone/pom.xml

@@ -246,6 +246,11 @@
             <version>2.0.8</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.jetlinks.community</groupId>
+            <artifactId>configure-component</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
 

+ 5 - 10
jetlinks-standalone/src/main/resources/application.yml

@@ -31,6 +31,8 @@ spring:
     pool:
       max-size: 32
       max-idle-time: 2m # 值不能大于mysql server的wait_timeout配置
+      max-life-time: 10m
+      acquire-retry: 3
   reactor:
     debug-agent:
       enabled: false
@@ -38,10 +40,10 @@ spring:
     elasticsearch:
       client:
         reactive:
-          endpoints: ${elasticsearch.client.host}:${elasticsearch.client.port}
+          endpoints: localhost:9200
           max-in-memory-size: 100MB
-          socket-timeout: ${elasticsearch.client.socket-timeout}
-          connection-timeout: ${elasticsearch.client.socket-timeout}
+          socket-timeout: 5000
+          connection-timeout: 8000
 easyorm:
   default-schema: public # 数据库默认的schema
   dialect: postgres #数据库方言
@@ -51,13 +53,6 @@ elasticsearch:
     data-path: ./data/elasticsearch
     port: 9200
     host: 0.0.0.0
-  client:
-    host: localhost
-    port: 9200
-    max-conn-total: 128
-    connect-timeout: 5000
-    socket-timeout: 5000
-    connection-request-timeout: 8000
   index:
     default-strategy: time-by-month #默认es的索引按月进行分表, direct则为直接操作索引.
     settings: