diff --git a/src/main/java/ru/micord/ervu/av/service/FileUploadService.java b/src/main/java/ru/micord/ervu/av/service/FileUploadService.java index 18ab489..680244d 100644 --- a/src/main/java/ru/micord/ervu/av/service/FileUploadService.java +++ b/src/main/java/ru/micord/ervu/av/service/FileUploadService.java @@ -11,7 +11,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import org.apache.http.HttpEntity; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; @@ -34,16 +33,13 @@ import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.support.Acknowledgment; import org.springframework.kafka.support.SendResult; import org.springframework.lang.NonNull; -import org.springframework.retry.annotation.Backoff; -import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import ru.micord.ervu.av.exception.FileUploadException; import ru.micord.ervu.av.exception.InvalidHttpFileUrlException; -import ru.micord.ervu.av.exception.RetryableException; import ru.micord.ervu.av.kafka.dto.InMessage; import ru.micord.ervu.av.kafka.dto.OutErrorMessage; -import ru.micord.ervu.av.response.AvResponse; import ru.micord.ervu.av.response.AvFileSendResponse; +import ru.micord.ervu.av.response.AvResponse; /** * @author r.latypov @@ -60,13 +56,15 @@ public class FileUploadService { private final KafkaTemplate kafkaTemplate; private final NewTopic outErrorTopic; private final NewTopic outSuccessTopic; + private final ReceiveScanReportRetryable receiveScanReportRetryable; @Autowired public FileUploadService(KafkaTemplate kafkaTemplate, NewTopic outErrorTopic, - NewTopic outSuccessTopic) { + NewTopic outSuccessTopic, ReceiveScanReportRetryable receiveScanReportRetryable) { this.kafkaTemplate = kafkaTemplate; this.outErrorTopic = outErrorTopic; this.outSuccessTopic = outSuccessTopic; + this.receiveScanReportRetryable = receiveScanReportRetryable; } @KafkaListener(id = "${spring.kafka.consumer.group-id}", topics = "${kafka-in.topic.name}") @@ -201,8 +199,11 @@ public class FileUploadService { stringBuilder.append(" Status: ").append(status).append("."); } if (avFileSendResponse.error() != null) { - stringBuilder.append(" Error code: ").append(avFileSendResponse.error().code()) - .append(". Error message: ").append(avFileSendResponse.error().message()).append(". "); + stringBuilder.append(" Error code: ") + .append(avFileSendResponse.error().code()) + .append(". Error message: ") + .append(avFileSendResponse.error().message()) + .append(". "); } throw new FileUploadException(stringBuilder.toString()); } @@ -220,7 +221,7 @@ public class FileUploadService { throw new FileUploadException(e); } - return receiveScanReport(client, get); + return receiveScanReportRetryable.receiveScanReport(client, get); } } catch (IOException e) { @@ -229,35 +230,6 @@ public class FileUploadService { } } - @Retryable(retryFor = {RetryableException.class}, maxAttempts = 10, - backoff = @Backoff(delay = 1000)) - public AvResponse receiveScanReport(CloseableHttpClient client, HttpGet get) - throws FileUploadException { - - try (CloseableHttpResponse getResponse = client.execute(get)) { - int getStatusCode = getResponse.getStatusLine().getStatusCode(); - if (getStatusCode == HttpStatus.OK.value()) { - String getResponseJson = EntityUtils.toString(getResponse.getEntity()); - AvResponse avResponse = new Gson().fromJson(getResponseJson, AvResponse.class); - if (avResponse.completed() == null) { - throw new RetryableException(); - } - return avResponse; - } - else { - throw new FileUploadException("http status code " + getStatusCode + " for " + get.getURI() - + " get request."); - } - } - catch (ClientProtocolException e) { - throw new RuntimeException(e); - } - catch (IOException e) { - // непредусмотренная ошибка доступа через http-клиент - throw new FileUploadException(e); - } - } - private void uploadFile(String filePath, String uploadUrl) throws FileUploadException { File file = new File(filePath); diff --git a/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java b/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java new file mode 100644 index 0000000..35e1d46 --- /dev/null +++ b/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java @@ -0,0 +1,52 @@ +package ru.micord.ervu.av.service; + +import java.io.IOException; + +import com.google.gson.Gson; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpStatus; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; +import ru.micord.ervu.av.exception.FileUploadException; +import ru.micord.ervu.av.exception.RetryableException; +import ru.micord.ervu.av.response.AvResponse; + +/** + * @author r.latypov + */ +@Service +public class ReceiveScanReportRetryable { + @Retryable(retryFor = {RetryableException.class}, maxAttempts = 10, + backoff = @Backoff(delay = 1000)) + public AvResponse receiveScanReport(CloseableHttpClient client, HttpGet get) + throws FileUploadException { + + try (CloseableHttpResponse getResponse = client.execute(get)) { + int getStatusCode = getResponse.getStatusLine().getStatusCode(); + if (getStatusCode == HttpStatus.OK.value()) { + String getResponseJson = EntityUtils.toString(getResponse.getEntity()); + AvResponse avResponse = new Gson().fromJson(getResponseJson, AvResponse.class); + if (avResponse.completed() == null) { + throw new RetryableException(); + } + return avResponse; + } + else { + throw new FileUploadException("http status code " + getStatusCode + " for " + get.getURI() + + " get request."); + } + } + catch (ClientProtocolException e) { + throw new RuntimeException(e); + } + catch (IOException e) { + // непредусмотренная ошибка доступа через http-клиент + throw new FileUploadException(e); + } + } +}