diff --git a/pom.xml b/pom.xml
index 51951d8..7df06b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -240,6 +240,12 @@
2.5
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix
+ 1.1.5.RELEASE
+
+
diff --git a/src/main/java/eu/dnetlib/repo/manager/config/Config.java b/src/main/java/eu/dnetlib/repo/manager/config/Config.java
index b5af39a..039f704 100644
--- a/src/main/java/eu/dnetlib/repo/manager/config/Config.java
+++ b/src/main/java/eu/dnetlib/repo/manager/config/Config.java
@@ -2,20 +2,22 @@ package eu.dnetlib.repo.manager.config;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.context.annotation.*;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
-import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
+import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
@Configuration
@EnableRedisHttpSession
+@EnableAspectJAutoProxy
+@EnableCircuitBreaker
@PropertySource(value = {"classpath:application.properties"} )
@ComponentScan(basePackages = "eu.dnetlib.repo.manager.*")
public class Config {
@@ -61,4 +63,13 @@ public class Config {
return serializer;
}
+ @Bean
+ public RestTemplate restTemplate() {
+ RestTemplate restTemplate = new RestTemplate();
+ restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.set("Content-Type", "application/json");
+ return restTemplate;
+ }
+
}
diff --git a/src/main/java/eu/dnetlib/repo/manager/config/SwaggerConfig.java b/src/main/java/eu/dnetlib/repo/manager/config/SwaggerConfig.java
index 581368e..f868a28 100644
--- a/src/main/java/eu/dnetlib/repo/manager/config/SwaggerConfig.java
+++ b/src/main/java/eu/dnetlib/repo/manager/config/SwaggerConfig.java
@@ -5,6 +5,8 @@ import eu.dnetlib.repo.manager.service.MonitorService;
import eu.dnetlib.repo.manager.service.PiWikService;
import eu.dnetlib.repo.manager.service.RepositoryService;
import eu.dnetlib.repo.manager.service.ValidatorService;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -27,6 +29,7 @@ import java.util.ArrayList;
@Configuration
@EnableSwagger2
@EnableWebMvc
+@EnableCircuitBreaker
@ComponentScan(basePackageClasses = {
RepositoryController.class,
MonitorController.class,
diff --git a/src/main/java/eu/dnetlib/repo/manager/controllers/StatsController.java b/src/main/java/eu/dnetlib/repo/manager/controllers/StatsController.java
index 58fab46..576331a 100644
--- a/src/main/java/eu/dnetlib/repo/manager/controllers/StatsController.java
+++ b/src/main/java/eu/dnetlib/repo/manager/controllers/StatsController.java
@@ -23,7 +23,7 @@ public class StatsController {
@RequestMapping(value = "/getStatistics" , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
- public Map getStatistics() throws JSONException {
+ public Map getStatistics() throws JSONException {
return statsService.getStatistics();
}
}
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java
index f87f6e2..3bea73d 100644
--- a/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java
+++ b/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java
@@ -42,7 +42,8 @@ public class BrokerServiceImpl implements BrokerService {
private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
.getLogger(BrokerServiceImpl.class);
- private RestTemplate restTemplate = null;
+ @Autowired
+ RestTemplate restTemplate ;
private HttpHeaders httpHeaders;
@@ -54,9 +55,6 @@ public class BrokerServiceImpl implements BrokerService {
@PostConstruct
private void initDnetTopicsMap() {
- restTemplate = new RestTemplate();
- restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
-
httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", "application/json");
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java
index 8b2b62f..b441047 100644
--- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java
+++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java
@@ -46,7 +46,8 @@ public class RepositoryServiceImpl implements RepositoryService {
@Value("${api.baseAddress}")
private String baseAddress;
- private RestTemplate restTemplate = null;
+ @Autowired
+ RestTemplate restTemplate;
private HttpHeaders httpHeaders;
@@ -116,11 +117,6 @@ public class RepositoryServiceImpl implements RepositoryService {
LOGGER.debug("Initialization method of repository api!");
LOGGER.debug("Updated version!");
- restTemplate = new RestTemplate();
- restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
-
- httpHeaders = new HttpHeaders();
- httpHeaders.set("Content-Type", "application/json;charset=UTF-8");
for (String vocName : vocabularyNames) {
vocabularyMap.put(vocName, vocabularyLoader.getVocabulary(vocName, Locale.ENGLISH, Locale.ROOT));
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/StatsService.java b/src/main/java/eu/dnetlib/repo/manager/service/StatsService.java
index a0ed25e..3a2da65 100644
--- a/src/main/java/eu/dnetlib/repo/manager/service/StatsService.java
+++ b/src/main/java/eu/dnetlib/repo/manager/service/StatsService.java
@@ -1,5 +1,6 @@
package eu.dnetlib.repo.manager.service;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import eu.dnetlib.repo.manager.exception.EndPointException;
import org.json.JSONException;
@@ -8,5 +9,5 @@ import java.util.Map;
public interface StatsService {
- Map getStatistics() throws JSONException, EndPointException;
+ Map getStatistics() ;
}
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/StatsServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/StatsServiceImpl.java
index caef091..845ed10 100644
--- a/src/main/java/eu/dnetlib/repo/manager/service/StatsServiceImpl.java
+++ b/src/main/java/eu/dnetlib/repo/manager/service/StatsServiceImpl.java
@@ -1,162 +1,50 @@
package eu.dnetlib.repo.manager.service;
-import eu.dnetlib.repo.manager.controllers.RestTemplateResponseErrorHandler;
-import eu.dnetlib.repo.manager.exception.EndPointException;
-import org.apache.log4j.Logger;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
+import eu.dnetlib.repo.manager.service.customHystrixCommands.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
-import org.springframework.web.util.UriComponents;
-import org.springframework.web.util.UriComponentsBuilder;
-import javax.annotation.PostConstruct;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
@Service("statsService")
public class StatsServiceImpl implements StatsService {
- private RestTemplate restTemplate = null;
-
- private HttpHeaders httpHeaders;
-
- private static final Logger LOGGER = Logger.getLogger(RepositoryServiceImpl.class);
+ @Autowired
+ RestTemplate restTemplate;
@Value("${search.api.baseAddress}")
private String baseAddress;
-
@Value("${search.api.usagestats}")
private String usagestatsBaseAddress;
-
@Value("${search.api.usageEvents}")
private String usagestatsEvents;
- @Autowired
- RestTemplateResponseErrorHandler restTemplateResponseErrorHandler;
-
- @PostConstruct
- private void init() {
- LOGGER.debug("Initialization method of statistics api!");
- restTemplate = new RestTemplate();
- restTemplate.setErrorHandler(restTemplateResponseErrorHandler);
- restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
- httpHeaders = new HttpHeaders();
- httpHeaders.set("Content-Type", "application/json");
- }
-
-
@Override
- public Map getStatistics() throws JSONException {
+ public Map getStatistics() {
- String aggregators = getTotalByType("datasource",baseAddress+"/resources",
- "?query= " +
- " oaftype exact datasource and " +
- " ( datasourcetypename exact Institutional Repository Aggregator " +
- " or datasourcetypename exact Publication Repository Aggregator )");
+ UsageStatsTotalHystrixCommand usageStatsTotalHystrixCommand = new UsageStatsTotalHystrixCommand(usagestatsEvents,restTemplate);
+ DataRepositoriesHystrixCommand dataRepositoriesHystrixCommand = new DataRepositoriesHystrixCommand(baseAddress,restTemplate);
+ AggregatorsHystrixCommand aggregatorsHystrixCommand = new AggregatorsHystrixCommand(baseAddress,restTemplate);
+ LiteratureHystrixCommand literatureHystrixCommand = new LiteratureHystrixCommand(baseAddress,restTemplate);
+ JournalHystrixCommand journalHystrixCommand = new JournalHystrixCommand(baseAddress,restTemplate);
+ PublicationHystrixCommand publicationHystrixCommand = new PublicationHystrixCommand(baseAddress,restTemplate);
+ DatasetsHystrixCommand datasetsHystrixCommand = new DatasetsHystrixCommand(baseAddress,restTemplate);
+ SoftwareHystrixCommand softwareHystrixCommand = new SoftwareHystrixCommand(baseAddress,restTemplate);
+ LastYearUsageStatsHystrixCommand lastYearUsageStatsHystrixCommand = new LastYearUsageStatsHystrixCommand(usagestatsBaseAddress,restTemplate);
- String dataRepositories = getTotalByType("datasource",baseAddress+"/resources",
- "?query= " +
- " oaftype exact datasource and " +
- " datasourcetypename exact Data Repository " );
-
- String literature = getTotalByType("datasource",baseAddress+"/resources",
- "?query= " +
- " oaftype exact datasource and " +
- " ( datasourcetypename exact Institutional Repository " +
- " or datasourcetypename exact Publication Repository )");
-
- String journal = getTotalByType("datasource",baseAddress+"/resources",
- "?query= " +
- " oaftype exact datasource and " +
- " datasourcetypename exact Journal");
-
- String publications = getTotalByType("other",baseAddress,"/publications/count");
- String datasets = getTotalByType("other",baseAddress,"/datasets/count");
- String software = getTotalByType("other",baseAddress,"/software/count");
-
-
- Map lastYearUsagestats = getLastYearUsageStatsTotal();
Map stats = new HashMap<>();
- stats.put("aggregators",aggregators);
- stats.put("dataRepositories",dataRepositories);
- stats.put("literature",literature);
- stats.put("journal",journal);
- stats.put("publications",publications);
- stats.put("datasets",datasets);
- stats.put("software",software);
- stats.put("lastYearUsagestats", lastYearUsagestats);
-
-// Integer usagestats = getUsageStatsTotal();
- stats.put("usagestats",null);
+ stats.put("aggregators",aggregatorsHystrixCommand.execute());
+ stats.put("dataRepositories",dataRepositoriesHystrixCommand.execute());
+ stats.put("literature",literatureHystrixCommand.execute());
+ stats.put("journal",journalHystrixCommand.execute());
+ stats.put("publications",publicationHystrixCommand.execute());
+ stats.put("datasets",datasetsHystrixCommand.execute());
+ stats.put("software",softwareHystrixCommand.execute());
+ stats.put("lastYearUsagestats", lastYearUsageStatsHystrixCommand.execute());
+ stats.put("usagestats",usageStatsTotalHystrixCommand.execute());
return stats;
}
-
-
- private String getTotalByType(String type,String url,String query) {
- UriComponents uriComponents = UriComponentsBuilder
- .fromHttpUrl(url + query)
- .queryParam("page",0)
- .queryParam("size",0)
- .queryParam("format","json")
- .build().encode();
-
- ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
-
- // if(rs.getStatusCode().equals(HttpStatus.OK)){
- if(type.equalsIgnoreCase("datasource")){
- Map metadata = (Map) ((Map)rs.getBody()).get("meta");
- return String.valueOf(metadata.get("total"));
- }else {
- Map metadata = (Map) (rs.getBody());
- return String.valueOf(metadata.get("total"));
- }
- //}
- // return null;
- }
-
- private Map getLastYearUsageStatsTotal() {
-
- UriComponents uriComponents = UriComponentsBuilder
- .fromHttpUrl(usagestatsBaseAddress + "/totals")
- .build().encode();
-
- ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
-
- // if(rs.getStatusCode().equals(HttpStatus.OK)){
-
- List yearly_stats = (List) ((Map)rs.getBody()).get("yearly_stats");
- Map lastYear = (Map) yearly_stats.get(yearly_stats.size()-1);
- Integer downloads = (Integer) lastYear.get("downloads");
- Integer views = (Integer) lastYear.get("views");
- Integer year = (Integer) lastYear.get("year");
-
- Map usagestats = new HashMap<>();
- usagestats.put("number",String.valueOf(downloads+views));
- usagestats.put("year",year);
-
- return usagestats;
- //}
- }
-
- private Integer getUsageStatsTotal() throws JSONException {
- UriComponents uriComponents = UriComponentsBuilder
- .fromHttpUrl(usagestatsEvents)
- .build().encode();
-
-// ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
- String rs = restTemplate.getForObject(uriComponents.toUri(), String.class);
- JSONObject resultSet = new JSONObject(rs);
- JSONObject totals = resultSet.getJSONObject("totals");
- return Integer.valueOf(totals.getString("events"));
- }
}
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/AggregatorsHystrixCommand.java b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/AggregatorsHystrixCommand.java
new file mode 100644
index 0000000..653fb72
--- /dev/null
+++ b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/AggregatorsHystrixCommand.java
@@ -0,0 +1,48 @@
+package eu.dnetlib.repo.manager.service.customHystrixCommands;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponents;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.util.Map;
+
+public class AggregatorsHystrixCommand extends HystrixCommand {
+
+ RestTemplate restTemplate;
+ String baseAddress;
+
+ public AggregatorsHystrixCommand(String baseAddress, RestTemplate restTemplate) {
+ super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
+ this.baseAddress = baseAddress;
+ this.restTemplate = restTemplate;
+ }
+
+ @Override
+ protected String run() throws Exception {
+ String url = baseAddress + "/resources" +
+ "?query= " +
+ " oaftype exact datasource and " +
+ " ( datasourcetypename exact Institutional Repository Aggregator " +
+ " or datasourcetypename exact Publication Repository Aggregator )";
+
+ UriComponents uriComponents = UriComponentsBuilder
+ .fromHttpUrl(url)
+ .queryParam("page", 0)
+ .queryParam("size", 0)
+ .queryParam("format", "json")
+ .build().encode();
+
+ ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
+ Map metadata = (Map) ((Map) rs.getBody()).get("meta");
+ return String.valueOf(metadata.get("total"));
+ }
+
+ @Override
+ protected String getFallback() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DataRepositoriesHystrixCommand.java b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DataRepositoriesHystrixCommand.java
new file mode 100644
index 0000000..8bdd0ca
--- /dev/null
+++ b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DataRepositoriesHystrixCommand.java
@@ -0,0 +1,47 @@
+package eu.dnetlib.repo.manager.service.customHystrixCommands;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponents;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.util.Map;
+
+public class DataRepositoriesHystrixCommand extends HystrixCommand {
+
+ RestTemplate restTemplate ;
+ private String baseAddress;
+
+ public DataRepositoriesHystrixCommand(String baseAddress,RestTemplate restTemplate) {
+ super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
+ this.baseAddress = baseAddress;
+ this.restTemplate = restTemplate;
+ }
+
+ @Override
+ protected String run() {
+ String url = baseAddress+"/resources" +
+ "?query= " +
+ " oaftype exact datasource and " +
+ " datasourcetypename exact Data Repository ";
+
+ UriComponents uriComponents = UriComponentsBuilder
+ .fromHttpUrl(url)
+ .queryParam("page",0)
+ .queryParam("size",0)
+ .queryParam("format","json")
+ .build().encode();
+
+ ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,null,Map.class);
+ Map metadata = (Map) ((Map)rs.getBody()).get("meta");
+ return String.valueOf(metadata.get("total"));
+ }
+
+ @Override
+ protected String getFallback() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DatasetsHystrixCommand.java b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DatasetsHystrixCommand.java
new file mode 100644
index 0000000..7353716
--- /dev/null
+++ b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/DatasetsHystrixCommand.java
@@ -0,0 +1,44 @@
+package eu.dnetlib.repo.manager.service.customHystrixCommands;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponents;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.util.Map;
+
+public class DatasetsHystrixCommand extends HystrixCommand {
+
+ RestTemplate restTemplate;
+ String baseAddress;
+
+ public DatasetsHystrixCommand(String baseAddress,RestTemplate restTemplate) {
+ super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
+ this.restTemplate = restTemplate;
+ this.baseAddress = baseAddress;
+ }
+
+ @Override
+ protected String run() throws Exception {
+ String url = baseAddress+"/datasets/count";
+
+ UriComponents uriComponents = UriComponentsBuilder
+ .fromHttpUrl(url)
+ .queryParam("page", 0)
+ .queryParam("size", 0)
+ .queryParam("format", "json")
+ .build().encode();
+
+ ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
+ Map metadata = (Map) (rs.getBody());
+ return String.valueOf(metadata.get("total"));
+ }
+
+ @Override
+ protected String getFallback() {
+ return null;
+ }
+}
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/JournalHystrixCommand.java b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/JournalHystrixCommand.java
new file mode 100644
index 0000000..0ba0bba
--- /dev/null
+++ b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/JournalHystrixCommand.java
@@ -0,0 +1,48 @@
+package eu.dnetlib.repo.manager.service.customHystrixCommands;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponents;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.util.Map;
+
+public class JournalHystrixCommand extends HystrixCommand {
+
+ RestTemplate restTemplate;
+ private String baseAddress;
+
+ public JournalHystrixCommand(String baseAddress, RestTemplate restTemplate) {
+ super(HystrixCommandGroupKey.Factory.asKey("StatisticsGroup"));
+ this.baseAddress = baseAddress;
+ this.restTemplate = restTemplate;
+ }
+
+ @Override
+ protected String run() throws Exception {
+ String url = baseAddress+"/resources"+
+ "?query= " +
+ " oaftype exact datasource and " +
+ " datasourcetypename exact Journal";
+
+ UriComponents uriComponents = UriComponentsBuilder
+ .fromHttpUrl(url)
+ .queryParam("page", 0)
+ .queryParam("size", 0)
+ .queryParam("format", "json")
+ .build().encode();
+
+ ResponseEntity rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, null, Map.class);
+ Map metadata = (Map) ((Map) rs.getBody()).get("meta");
+ return String.valueOf(metadata.get("total"));
+ }
+
+ @Override
+ protected String getFallback() {
+ return null;
+ }
+
+}
diff --git a/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/LastYearUsageStatsHystrixCommand.java b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/LastYearUsageStatsHystrixCommand.java
new file mode 100644
index 0000000..eb9561a
--- /dev/null
+++ b/src/main/java/eu/dnetlib/repo/manager/service/customHystrixCommands/LastYearUsageStatsHystrixCommand.java
@@ -0,0 +1,52 @@
+package eu.dnetlib.repo.manager.service.customHystrixCommands;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponents;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LastYearUsageStatsHystrixCommand extends HystrixCommand