EligibilityServiceApplication.java

package uk.gov.dhsc.htbhf.eligibility;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.context.event.EventListener;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import uk.gov.dhsc.htbhf.CommonRestConfiguration;
import uk.gov.dhsc.htbhf.dwp.http.GetRequestBuilder;
import uk.gov.dhsc.htbhf.logging.EventLogger;
import uk.gov.dhsc.htbhf.logging.LoggingConfiguration;
import uk.gov.dhsc.htbhf.logging.event.ApplicationStartedEvent;


@SuppressWarnings("PMD.UseUtilityClass")
@SpringBootApplication
@EnableSwagger2
@EnableAsync
@Import({CommonRestConfiguration.class, LoggingConfiguration.class})
@Slf4j
public class EligibilityServiceApplication {

    @Value("${app.version:}") // use APP_VERSION env variable if available, otherwise give no version info
    private String appVersion;

    @Value("${instance.index:}") // use INSTANCE_INDEX env variable if available, otherwise give no index info
    private String instanceIndex;

    @Value("${vcap.application.application_id:}") // the id of the application as provided by cf
    private String applicationId;

    @Autowired
    private EventLogger eventLogger;

    public static void main(String[] args) {
        SpringApplication.run(EligibilityServiceApplication.class, args);
    }

    @EventListener(ApplicationReadyEvent.class)
    public void logAfterStartup() {
        eventLogger.logEvent(ApplicationStartedEvent.builder()
                .applicationId(applicationId)
                .applicationVersion(appVersion)
                .instanceIndex(instanceIndex)
                .build()
        );
    }

    @Bean
    public TaskExecutor taskExecutor(@Value("${taskexecutor.threadpool.min-size}") Integer threadpoolMinSize,
                                     @Value("${taskexecutor.threadpool.max-size}") Integer threadpoolMaxSize,
                                     ContextCopyingDecorator contextCopyingDecorator) {
        log.info("Creating ThreadPoolTaskExecutor with min pool size {} and max {}", threadpoolMinSize, threadpoolMaxSize);
        var executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(threadpoolMinSize);
        executor.setMaxPoolSize(threadpoolMaxSize);
        executor.setTaskDecorator(contextCopyingDecorator);
        // set queue size to zero to prevent tasks waiting in the queue before spinning up more threads.
        executor.setQueueCapacity(0);
        return executor;
    }

    @Bean
    public GetRequestBuilder getRequestBuilder() {
        return new GetRequestBuilder();
    }
}