package org.ohdsi.webapi.test; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.ohdsi.webapi.exampleapplication.ExampleApplicationWithJobService; import org.ohdsi.webapi.job.JobExecutionResource; import org.ohdsi.webapi.job.JobInstanceResource; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; import org.springframework.retry.policy.TimeoutRetryPolicy; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; /** * */ public class JobServiceIT extends WebApiIT { @Value("${exampleservice.endpoint}") private String endpointExample; @Value("${jobservice.endpoint.job}") private String endpointJob; @Value("${jobservice.endpoint.jobexecution}") private String endpointJobExecution; @Value("${jobservice.endpoint.jobexecution.alt}") private String endpointJobExecutionAlternative; @Test public void createAndFindJob() { //create/queue job final ResponseEntity<JobExecutionResource> postEntity = getRestTemplate().postForEntity(this.endpointExample, null, JobExecutionResource.class);//TODO 409 or other errors prevent deserialization... assertOk(postEntity); final JobExecutionResource postExecution = postEntity.getBody(); assertJobExecution(postExecution); //check on status of job final Map<String, Object> params = new HashMap<String, Object>(); params.put("instanceId", postExecution.getJobInstanceResource().getInstanceId()); params.put("executionId", postExecution.getExecutionId()); //retry until asynchronous job is complete final RetryTemplate template = new RetryTemplate(); final TimeoutRetryPolicy policy = new TimeoutRetryPolicy(); policy.setTimeout(30000L); template.setRetryPolicy(policy); final ResponseEntity<JobExecutionResource> getEntityExecution = template .execute(new RetryCallback<ResponseEntity<JobExecutionResource>, IllegalStateException>() { @Override public ResponseEntity<JobExecutionResource> doWithRetry(final RetryContext context) { // Do stuff that might fail, e.g. webservice operation final ResponseEntity<JobExecutionResource> getEntityExecution = getRestTemplate().getForEntity( JobServiceIT.this.endpointJobExecution, JobExecutionResource.class, params); final JobExecutionResource getExecution = getEntityExecution.getBody(); assertJobExecution(getExecution); if (!"COMPLETED".equals(getExecution.getStatus())) { JobServiceIT.this.log.debug("Incomplete job, trying again..."); throw new IllegalStateException("Incomplete job"); } return getEntityExecution; } }); //end retry final JobExecutionResource getExecution = getEntityExecution.getBody(); assertJobExecution(getExecution); final ResponseEntity<JobInstanceResource> getEntityInstance = getRestTemplate().getForEntity(this.endpointJob, JobInstanceResource.class, params); assertOk(getEntityInstance); assertJobInstance(getEntityInstance.getBody()); Assert.state(postExecution.getExecutionId().equals(getExecution.getExecutionId())); //Check alternate endpoint final ResponseEntity<JobExecutionResource> getEntityExecutionAlt = getRestTemplate().getForEntity( this.endpointJobExecutionAlternative, JobExecutionResource.class, params); final JobExecutionResource getExecutionAlt = getEntityExecutionAlt.getBody(); assertJobExecution(getExecution); Assert.state(postExecution.getExecutionId().equals(getExecutionAlt.getExecutionId())); } private void assertJobInstance(final JobInstanceResource instance) { Assert.state(instance.getInstanceId() != null); Assert.state(ExampleApplicationWithJobService.EXAMPLE_JOB_NAME.equals(instance.getName())); } private void assertOk(final ResponseEntity<?> entity) { Assert.state(entity.getStatusCode() == HttpStatus.OK); } private void assertJobExecution(final JobExecutionResource execution) { Assert.state(execution != null); Assert.state(execution.getExecutionId() != null); Assert.state(execution.getJobInstanceResource().getInstanceId() != null); } }