Dans mon fichier yaml de printemps:
spring: application: name: myApp elasticsearch: jest: uris: ["http://myelasticserver:9200"] multi-threaded: true read-timeout: 10000 management: health: elasticsearch: indices: ["one","two"] response-timeout: 1000 enabled: true
Le fait est que le client Jest peut être injecté et utilisé sans aucun problème. Mais d'une manière ou d'une autre, la vérification de l'état échoue toujours avec cette erreur:
La vérification de l'état d'Elasticsearch a échoué java.net.ConnectException: Connexion refusée
Il semble que l'URL " http: // myelasticserver: 9200 " n'ait pas été utilisée, et la vérification de l'état utilise à la place localhost: 9200.
Quelqu'un sait-il ce que j'ai fait de mal?
Merci.
3 Réponses :
J'ai eu le même problème et j'ai compris quel était le problème. Pour la vérification de l'état de santé, java spring boot utilise RestClient où j'utilisais HighLevelRestClient pour l'indexation / la recherche / la suppression d'ES. requête mais la vérification de l'état nécessite RestClient. Donc, la solution est de remplacer le bean RestClient par vos paramètres d'env. Ajoutez ce qui suit à votre fichier de configuration (remplacez les valeurs d'environnement par les vôtres):
@Bean(destroyMethod = "close") public RestClient restClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials( environment.getProperty("elasticsearch.username"), environment.getProperty("elasticsearch.password"))); List<HttpHost> hosts = new ArrayList<>(); hosts.add(new HttpHost( environment.getProperty("elasticsearch.hosts.host.name", String.class), environment.getProperty("elasticsearch.hosts.host.port", Integer.class), "http")); LOGGER.info("Elasticsearch connection establishing..." + hosts.toArray().toString()); return RestClient.builder(Iterables.toArray(hosts, HttpHost.class)) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); }
Permettez-moi de voir (plz poster) votre configuration si cela ne fonctionne pas. Bonne chance!
Références
Le problème est en effet, comme mst l'a mentionné, que l'actionneur utilise le RestClient
. Si vous avez configuré le RestHighLevelClient
, la configuration n'est pas appliquée au RestClient
.
Si vous avez déjà le RestHighLevelClient
disponible, vous pouvez rendre facilement disponible un RestClient
configuré comme suit:
@Bean(destroyMethod = "close") public RestClient restClient() { return restHighLevelClient().getLowLevelClient(); }
Spring Boot elasticsearch a besoin de savoir à quel port (et hôte) se connecter pour la vérification de l'état. Ajoutez:
spring: elasticsearch: rest: uris: "myelasticserver:9200" data: elasticsearch: cluster-nodes: "myelasticserver:9300" cluster-name: "my-cluster-name"
Ceci est en plus de la configuration que vous avez déjà. Ceci est séparé car beaucoup de gens, comme moi, utilisent le port (non-http) 9300 d'elasticsearch pour les recherches réelles au lieu de votre partie de la configuration. Je n'ai pas non plus management.health.elasticsearch. Ma configuration totale pour elasticsearch est:
spring: elasticsearch: rest: uris: "myelasticserver:9200" #username: "" #password: ""