Вызов нескольких параллельных вызовов службам SOAP с использованием Spring boot # SOAP Service - PullRequest
0 голосов
/ 10 октября 2019

Я сейчас использую весеннюю загрузку. У меня есть список объектов запросов (около 1000), и я хотел бы вызывать службы SOAP параллельно для всех объектов и получать ответ для всех них. Как только все запросы обработаны, я хочу выполнить свою программу параллельно.

Любые хорошие рекомендации?

public class ServiceImpl implements Service {

    @Autowired
    private SOAPConnector connector;

    public void getEmployeeData(){
    List<Request> lstRequest = [List of Objects];
    List<Response> lstResponse = new ArrayList();
    for(int i=0 ; i <=lstRequest.size()-1; i++)
    {       
        lstResponse.add(connector.callEmployeeService());
    }   
        callAnotherMethod(lstResponse);
    }
}


public class SOAPConnector extends WebServiceGatewaySupport {

    public Response callEmployeeService(Request request) {        
        try{
            return (Response) getWebServiceTemplate().marshalSendAndReceive(request);
        } catch (Exception e) {            

        }
    }
}


@Configuration
public class Configurator {

    @Value("${service.url}")
    private String SERVICE_URL;

    @Autowired
    ComponentMessageSender httpComponentsMessageSender;

    @Bean
    public SOAPConnector getClient() {
        SOAPConnector client = new SOAPConnector();
        client.setMarshaller(getMarshaller());
        client.setUnmarshaller(getMarshaller());
        client.setDefaultUri(SERVICE_URL);

        try {
            client.setMessageSender(httpComponentsMessageSender.getHttpComponentsMessageSender());

        } catch (Exception e){
            System.out.println("error on message sender ");
        }

        return client;
    }

    private Jaxb2Marshaller getMarshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(Request.class, Response.class);
        return marshaller;
    }
}

1 Ответ

0 голосов
/ 10 октября 2019

Пожалуйста, посмотрите на Java 8's CompletableFuture. Вы можете сделать следующее:

List<Request> lstRequest = [List of Objects];
CompletableFuture[] futures = new CompletableFuture[lstRequest.size()];

for(int i=0 ; i <=lstRequest.length - 1; i++) {       
    futures[i] = CompletableFuture.supplyAsync(() -> connector.callEmployeeService());
}   

CompletableFuture.allOf(lstResponse).thenApply((result) -> {
    // This is where you get all of your responses
});
...