|
26 | 26 | import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient; |
27 | 27 | import co.elastic.clients.json.jackson.JacksonJsonpMapper; |
28 | 28 | import co.elastic.clients.transport.rest_client.RestClientTransport; |
| 29 | +import com.fasterxml.jackson.databind.ObjectMapper; |
| 30 | +import com.fasterxml.jackson.databind.json.JsonMapper; |
| 31 | +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
| 32 | +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; |
| 33 | +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; |
| 34 | +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; |
29 | 35 | import org.apache.http.Header; |
30 | 36 | import org.apache.http.HttpHost; |
31 | 37 | import org.apache.http.auth.AuthScope; |
|
40 | 46 | import javax.net.ssl.SSLContext; |
41 | 47 |
|
42 | 48 | import java.io.Serializable; |
| 49 | +import java.time.LocalDate; |
| 50 | +import java.time.LocalDateTime; |
| 51 | +import java.time.LocalTime; |
| 52 | +import java.time.format.DateTimeFormatter; |
43 | 53 | import java.util.List; |
44 | 54 |
|
45 | 55 | import static org.apache.flink.util.Preconditions.checkState; |
46 | 56 |
|
47 | 57 | /** A factory that creates valid ElasticsearchClient instances. */ |
48 | 58 | public class NetworkConfig implements Serializable { |
49 | 59 | private final List<HttpHost> hosts; |
50 | | - |
51 | 60 | private final List<Header> headers; |
52 | | - |
53 | 61 | private final String username; |
54 | | - |
55 | 62 | private final String password; |
56 | | - |
| 63 | + @Nullable private final String connectionPathPrefix; |
| 64 | + @Nullable Integer connectionRequestTimeout; |
| 65 | + @Nullable Integer connectionTimeout; |
| 66 | + @Nullable Integer socketTimeout; |
57 | 67 | @Nullable private final SerializableSupplier<SSLContext> sslContextSupplier; |
58 | | - |
59 | 68 | @Nullable private final SerializableSupplier<HostnameVerifier> sslHostnameVerifier; |
| 69 | + private static final DateTimeFormatter DATE_TIME_FORMATTER = |
| 70 | + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| 71 | + private static final DateTimeFormatter DATE_FORMATTER = |
| 72 | + DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| 73 | + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); |
60 | 74 |
|
61 | 75 | public NetworkConfig( |
62 | 76 | List<HttpHost> hosts, |
63 | 77 | String username, |
64 | 78 | String password, |
65 | 79 | List<Header> headers, |
66 | | - SerializableSupplier<SSLContext> sslContextSupplier, |
67 | | - SerializableSupplier<HostnameVerifier> sslHostnameVerifier) { |
| 80 | + @Nullable String connectionPathPrefix, |
| 81 | + @Nullable Integer connectionRequestTimeout, |
| 82 | + @Nullable Integer connectionTimeout, |
| 83 | + @Nullable Integer socketTimeout, |
| 84 | + @Nullable SerializableSupplier<SSLContext> sslContextSupplier, |
| 85 | + @Nullable SerializableSupplier<HostnameVerifier> sslHostnameVerifier) { |
68 | 86 | checkState(!hosts.isEmpty(), "Hosts must not be empty"); |
69 | 87 | this.hosts = hosts; |
70 | 88 | this.username = username; |
71 | 89 | this.password = password; |
72 | 90 | this.headers = headers; |
| 91 | + this.connectionRequestTimeout = connectionRequestTimeout; |
| 92 | + this.connectionTimeout = connectionTimeout; |
| 93 | + this.socketTimeout = socketTimeout; |
| 94 | + this.connectionPathPrefix = connectionPathPrefix; |
73 | 95 | this.sslContextSupplier = sslContextSupplier; |
74 | 96 | this.sslHostnameVerifier = sslHostnameVerifier; |
75 | 97 | } |
76 | 98 |
|
77 | 99 | public ElasticsearchAsyncClient createEsClient() { |
| 100 | + // the JavaTimeModule is added to provide support for java 8 Time classes. |
| 101 | + JavaTimeModule javaTimeModule = new JavaTimeModule(); |
| 102 | + javaTimeModule.addSerializer( |
| 103 | + LocalDateTime.class, new LocalDateTimeSerializer(DATE_TIME_FORMATTER)); |
| 104 | + javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DATE_FORMATTER)); |
| 105 | + javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(TIME_FORMATTER)); |
| 106 | + ObjectMapper mapper = JsonMapper.builder().addModule(javaTimeModule).build(); |
78 | 107 | return new ElasticsearchAsyncClient( |
79 | | - new RestClientTransport(this.getRestClient(), new JacksonJsonpMapper())); |
| 108 | + new RestClientTransport(this.getRestClient(), new JacksonJsonpMapper(mapper))); |
80 | 109 | } |
81 | 110 |
|
82 | 111 | private RestClient getRestClient() { |
@@ -105,6 +134,29 @@ private RestClient getRestClient() { |
105 | 134 | restClientBuilder.setDefaultHeaders(headers.toArray(new Header[0])); |
106 | 135 | } |
107 | 136 |
|
| 137 | + if (connectionPathPrefix != null) { |
| 138 | + restClientBuilder.setPathPrefix(connectionPathPrefix); |
| 139 | + } |
| 140 | + |
| 141 | + if (connectionRequestTimeout != null |
| 142 | + || connectionTimeout != null |
| 143 | + || socketTimeout != null) { |
| 144 | + restClientBuilder.setRequestConfigCallback( |
| 145 | + requestConfigBuilder -> { |
| 146 | + if (connectionRequestTimeout != null) { |
| 147 | + requestConfigBuilder.setConnectionRequestTimeout( |
| 148 | + connectionRequestTimeout); |
| 149 | + } |
| 150 | + if (connectionTimeout != null) { |
| 151 | + requestConfigBuilder.setConnectTimeout(connectionTimeout); |
| 152 | + } |
| 153 | + if (socketTimeout != null) { |
| 154 | + requestConfigBuilder.setSocketTimeout(socketTimeout); |
| 155 | + } |
| 156 | + return requestConfigBuilder; |
| 157 | + }); |
| 158 | + } |
| 159 | + |
108 | 160 | return restClientBuilder.build(); |
109 | 161 | } |
110 | 162 |
|
|
0 commit comments