Skip to content

Commit

Permalink
merging dev, recreating elasticsearch client in case it gets stuck
Browse files Browse the repository at this point in the history
  • Loading branch information
fmendezh committed Sep 12, 2024
1 parent 5487dfa commit 5086f81
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 94 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<groupId>org.gbif.literature</groupId>
<artifactId>literature-ws</artifactId>
<version>1.26-SNAPSHOT</version>
<version>1.27-SNAPSHOT</version>
<name>GBIF Literature WS</name>

<scm>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,62 +18,16 @@
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

@Component
@ConfigurationProperties(prefix = "elasticsearch")
@Data
public class EsClientConfigProperties {

private Set<String> hosts;
private String index;
private int connectionTimeOut;
private int socketTimeOut;
private int connectionRequestTimeOut;
private int maxResultWindow;

public Set<String> getHosts() {
return hosts;
}

public void setHosts(Set<String> hosts) {
this.hosts = hosts;
}

public String getIndex() {
return index;
}

public void setIndex(String index) {
this.index = index;
}

public int getConnectionTimeOut() {
return connectionTimeOut;
}

public void setConnectionTimeOut(int connectionTimeOut) {
this.connectionTimeOut = connectionTimeOut;
}

public int getSocketTimeOut() {
return socketTimeOut;
}

public void setSocketTimeOut(int socketTimeOut) {
this.socketTimeOut = socketTimeOut;
}

public int getConnectionRequestTimeOut() {
return connectionRequestTimeOut;
}

public void setConnectionRequestTimeOut(int connectionRequestTimeOut) {
this.connectionRequestTimeOut = connectionRequestTimeOut;
}

public int getMaxResultWindow() {
return maxResultWindow;
}

public void setMaxResultWindow(int maxResultWindow) {
this.maxResultWindow = maxResultWindow;
}
}
25 changes: 24 additions & 1 deletion src/main/java/org/gbif/literature/config/EsConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,37 @@
import org.elasticsearch.client.NodeSelector;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import lombok.extern.slf4j.Slf4j;

@Configuration
@Slf4j
public class EsConfig {

@Bean
@Autowired
private ApplicationContext applicationContext;

/**
* Re-creates the instance of the RestHighLevelClient.
*/
public RestHighLevelClient reCreateRestHighLevelClient() {
RestHighLevelClient restHighLevelClient = applicationContext.getBean("restHighLevelClient", RestHighLevelClient.class);
if (!restHighLevelClient.getLowLevelClient().isRunning()) {
log.warn("Recreating Elasticsearch RestHighLevelClient");
DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) applicationContext.getAutowireCapableBeanFactory();
registry.destroySingleton("restHighLevelClient");
registry.registerSingleton("restHighLevelClient", restHighLevelClient(applicationContext.getBean(EsClientConfigProperties.class)));
}
return restHighLevelClient;
}

@Bean("restHighLevelClient")
@Primary
public RestHighLevelClient restHighLevelClient(EsClientConfigProperties esProperties) {
return provideEsClient(esProperties);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/gbif/literature/config/WebMvcConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,5 @@ public HttpFirewall allowUrlEncodedPercentHttpFirewall() {
public ObjectMapper registryObjectMapper() {
return JacksonJsonObjectMapperProvider.getObjectMapper();
}

}
58 changes: 29 additions & 29 deletions src/main/java/org/gbif/literature/resource/LiteratureResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -245,11 +245,11 @@ public LiteratureResource(LiteratureSearchService searchService) {
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "websites",
description = "Website of publication" + REPEATED,
array = @ArraySchema(schema = @Schema(implementation = String.class)),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
name = "websites",
description = "Website of publication" + REPEATED,
array = @ArraySchema(schema = @Schema(implementation = String.class)),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "year",
description =
Expand All @@ -268,33 +268,33 @@ public LiteratureResource(LiteratureSearchService searchService) {
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "added",
description =
"Date or date range when the publication was added. Format is ISO 8601, e.g., '2024-07-14' or '2024-07-14,2024-08-14'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
name = "added",
description =
"Date or date range when the publication was added. Format is ISO 8601, e.g., '2024-07-14' or '2024-07-14,2024-08-14'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "published",
description =
"Date or date range when the publication was published. Format is ISO 8601, e.g., '2024-02-22' or '2024-02-22,2024-03-22'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
name = "published",
description =
"Date or date range when the publication was published. Format is ISO 8601, e.g., '2024-02-22' or '2024-02-22,2024-03-22'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "discovered",
description =
"Date or date range when the publication was discovered. Format is ISO 8601, e.g., '2024-02-26' or '2024-02-26,2024-03-26'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
name = "discovered",
description =
"Date or date range when the publication was discovered. Format is ISO 8601, e.g., '2024-02-26' or '2024-02-26,2024-03-26'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE),
@Parameter(
name = "modified",
description =
"Date or date range when the publication was discovered. Format is ISO 8601, e.g., '2024-07-26' or '2024-07-26,2024-10-26'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE)
name = "modified",
description =
"Date or date range when the publication was discovered. Format is ISO 8601, e.g., '2024-07-26' or '2024-07-26,2024-10-26'.",
schema = @Schema(implementation = Date.class),
in = ParameterIn.QUERY,
explode = Explode.TRUE)
})
@CommonParameters.QParameter
@interface CommonSearchParameters {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.gbif.api.model.literature.search.LiteratureSearchRequest;
import org.gbif.api.model.literature.search.LiteratureSearchResult;
import org.gbif.literature.config.EsClientConfigProperties;
import org.gbif.literature.config.EsConfig;

import java.io.IOException;
import java.util.Optional;
Expand All @@ -35,22 +36,33 @@ public class LiteratureSearchServiceEs implements LiteratureSearchService {
@Value("${literature.bufferLimitBytesExport}")
private int bufferLimitBytesExport;

private final RestHighLevelClient restHighLevelClient;
private RestHighLevelClient restHighLevelClient;
private final LiteratureEsResponseParser esResponseParser;
private final EsSearchRequestBuilder<LiteratureSearchParameter> esSearchRequestBuilder;
private final String index;
private final int maxResultWindow;

private final EsConfig esConfig;

public LiteratureSearchServiceEs(
EsClientConfigProperties esClientConfigProperties,
RestHighLevelClient restHighLevelClient,
LiteratureEsResponseParser esResponseParser,
EsSearchRequestBuilder<LiteratureSearchParameter> esSearchRequestBuilder) {
EsSearchRequestBuilder<LiteratureSearchParameter> esSearchRequestBuilder,
EsConfig esConfig) {
this.index = esClientConfigProperties.getIndex();
this.maxResultWindow = esClientConfigProperties.getMaxResultWindow();
this.restHighLevelClient = restHighLevelClient;
this.esResponseParser = esResponseParser;
this.esSearchRequestBuilder = esSearchRequestBuilder;
this.esConfig = esConfig;
}

public RestHighLevelClient restHighLevelClient() {
if(!restHighLevelClient.getLowLevelClient().isRunning()) {
restHighLevelClient = esConfig.reCreateRestHighLevelClient();
}
return restHighLevelClient;
}

@Override
Expand All @@ -74,8 +86,7 @@ private SearchResponse<LiteratureSearchResult, LiteratureSearchParameter> search
SearchRequest searchRequest =
esSearchRequestBuilder.buildSearchRequest(literatureSearchRequest, true, index);
SearchResponse<LiteratureSearchResult, LiteratureSearchParameter> response =
esResponseParser.buildSearchResponse(
restHighLevelClient.search(searchRequest, requestOptions), literatureSearchRequest);
esResponseParser.buildSearchResponse(restHighLevelClient().search(searchRequest, requestOptions), literatureSearchRequest);

if (offsetExceeded) {
response.setOffset(offset);
Expand All @@ -91,8 +102,7 @@ private SearchResponse<LiteratureSearchResult, LiteratureSearchParameter> search
public Optional<LiteratureSearchResult> get(Object identifier) {
SearchRequest getByIdRequest = esSearchRequestBuilder.buildGetRequest(identifier, index);
try {
return esResponseParser.buildGetResponse(
restHighLevelClient.search(getByIdRequest, RequestOptions.DEFAULT));
return esResponseParser.buildGetResponse(restHighLevelClient().search(getByIdRequest, RequestOptions.DEFAULT));
} catch (IOException e) {
throw new RuntimeException(e);
}
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/org/gbif/literature/LiteratureApplicationTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,35 @@
*/
package org.gbif.literature;

import org.gbif.ws.server.filter.AppIdentityFilter;
import org.gbif.ws.server.filter.HttpServletRequestWrapperFilter;
import org.gbif.ws.server.filter.IdentityFilter;
import org.gbif.ws.server.filter.RequestHeaderParamUpdateFilter;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;

@SpringBootTest
class LiteratureApplicationTests {
@MockBean
UserDetailsService userDetailsService;
@MockBean
PasswordEncoder passwordEncoder;

@MockBean
IdentityFilter identityFilter;

@MockBean
AppIdentityFilter appIdentityFilter;

@MockBean
HttpServletRequestWrapperFilter httpServletRequestWrapperFilter;

@MockBean
RequestHeaderParamUpdateFilter requestHeaderParamUpdateFilter;

@Test
void contextLoads() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,15 @@ public class LiteratureDocumentationTests {
@Test
public void searchParametersDocumented() {

Set<LiteratureSearchParameter> handledParams =
new HashSet<>(
Arrays.asList(
LiteratureSearchParameter.DOI,
LiteratureSearchParameter.ADDED,
LiteratureSearchParameter.PUBLISHED,
LiteratureSearchParameter.DISCOVERED,
LiteratureSearchParameter.MODIFIED));
Set<LiteratureSearchParameter> handledParams = new HashSet<>(
Arrays.asList(
LiteratureSearchParameter.DOI,
LiteratureSearchParameter.ADDED,
LiteratureSearchParameter.PUBLISHED,
LiteratureSearchParameter.DISCOVERED,
LiteratureSearchParameter.MODIFIED
)
);

Set<String> documentedParameters =
Arrays.stream(
Expand Down

0 comments on commit 5086f81

Please sign in to comment.