gpt4 book ai didi

java - 从 spring 批处理器调用 Async REST api

转载 作者:行者123 更新时间:2023-12-04 23:08:44 25 4
gpt4 key购买 nike

我写了一个处理列表列表的 Spring 批处理作业。

阅读器返回列表列表。
处理器在每个 ListItem 上工作并返回已处理的 List。
Writer 从 List of List 将内容写入 DB 和 sftp。

我有一个用例,我从 spring 批处理器调用 Async REST api。
在 ListenableFuture 响应中,我实现了 LitenableFutureCallback 来处理成功和失败,它按预期工作,但在异步调用返回某些内容之前,ItemProcessor 不会等待来自异步 api 的回调并将对象(列表)返回给 writer。

我不确定如何实现和处理来自 ItemProcessor 的异步调用。

我确实阅读了有关 AsyncItemProcessor 和 AsyncItemWriter 的信息,但我不确定这是否是我应该在这种情况下使用的东西。

我还想过从 AsyncRestTemplate 对 ListenableFuture 响应调用 get(),但根据文档,它会阻塞当前线程,直到收到响应。

我正在寻求有关如何实现此功能的帮助。下面的代码片段:

处理器:

public class MailDocumentProcessor implements ItemProcessor<List<MailingDocsEntity>, List<MailingDocsEntity>> {

... Initialization code

@Override
public List<MailingDocsEntity> process(List<MailingDocsEntity> documentsList) throws Exception {
logger.info("Entering MailingDocsEntity processor");


List<MailingDocsEntity> synchronizedList = Collections.synchronizedList(documentsList);


for (MailingDocsEntity mailingDocsEntity : synchronizedList) {
System.out.println("Reading Mailing id: " + mailingDocsEntity.getMailingId());

..code to get the file

//If the file is not a pdf convert it
String fileExtension = readFromSpResponse.getFileExtension();
String fileName = readFromSpResponse.getFileName();
byte[] fileBytes = readFromSpResponse.getByteArray();

try {

//Do checks to make sure PDF file is being sent
if (!"pdf".equalsIgnoreCase(fileExtension)) {
//Only doc, docx and xlsx conversions are supported

...Building REquest object
//make async call to pdf conversion service
pdfService.convertDocxToPdf(request, mailingDocsEntity);

} else {
logger.error("The file cannot be converted to a pdf.\n"
);

}
}


} catch (Exception ex){
logger.error("There has been an exception while processing data", ex);

}

}
return synchronizedList;
}

}

异步 PdfConversion 服务类:
@Service
public class PdfService{


@Autowired
@Qualifier("MicroServiceAsyncRestTemplate")
AsyncRestTemplate microServiceAsyncRestTemplate;

public ConvertDocxToPdfResponse convertDocxToPdf(ConvertDocxToPdfRequest request, MailingDocsEntity mailingDocsEntity){

ConvertDocxToPdfResponse pdfResponse = new ConvertDocxToPdfResponse();


try {

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<?> entity = new HttpEntity<>(request, headers);



ListenableFuture<ResponseEntity<ConvertDocxToPdfResponse>> microServiceResponse = microServiceAsyncRestTemplate.postForEntity(batchMailProcessingConfiguration.getPdfUrl(), entity, ConvertDocxToPdfResponse.class);

ConvertDocxToPdfResponse resultBody = microServiceResponse.get().getBody();
microServiceResponse.addCallback(new ListenableFutureCallback<ResponseEntity<ConvertDocxToPdfResponse>>() {

@Override
public void onSuccess(ResponseEntity<ConvertDocxToPdfResponse> result) {
...code to do stuff on success


}

@Override
public void onFailure(Throwable ex) {
pdfResponse.setMessage("Exception while retrieving response");

}
});

} catch (Exception e) {
String message = "There has been an error while issuing a pdf generate request to the pdf micro service";
pdfResponse.setMessage(message);
logger.error(message, e);
}


return pdfResponse;
}

}

我最初的批处理作业是同步的,我正在转换为异步以加快处理速度。
我确实尝试寻找类似的问题,但找不到足够的信息。
任何指示或帮助都将受到高度赞赏。

谢谢!!

最佳答案

I did read about AsyncItemProcessor and AsyncItemWriter, but I am not sure if that is something I should use in this scenario.



是的, AsyncItemProcessorAsyncItemWriter适合您的用例。 AsyncItemProcessor将执行委托(delegate) ItemProcessor 的逻辑(您的休息调用)对于新线程上的项目。项目完成后, Future结果的一部分被传递给 AsynchItemWriter要写。 AsynchItemWriter然后将打开 Future并写下项目。这些组件的优点是您不必处理 Future s 自己包装、拆包等。

你可以找到:
  • 更多详情:https://docs.spring.io/spring-batch/4.0.x/reference/html/spring-batch-integration.html#asynchronous-processors
  • 这里有一个例子:https://github.com/mminella/scaling-demos/blob/master/single-jvm-demos/src/main/java/io/spring/batch/scalingdemos/asyncprocessor/AsyncProcessorJobApplication.java

  • 希望这可以帮助。

    关于java - 从 spring 批处理器调用 Async REST api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52302649/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com