Получение фиксированного количества записей с использованием Spring Data JPA - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь создать приложение Spring Boot, в котором мне нужно извлечь записи из базы данных и сделать вызов REST API для каждой записи, извлеченной из базы данных.Но вместо того, чтобы извлекать все записи сразу, я хочу получить их в пакетном размере, скажем, 10, сделать остальной вызов для них, а затем получить еще 10 и делать то же самое до последней записи.Я использую Spring-Data-JPA.Как мне этого добиться?

PS: это многопоточный вызов, а БД - Amazon DynamoDB

Мой код до сих пор:

Контроллер:

//Multi Threaded Call to rest
@GetMapping("/myApp-multithread")
public String getQuoteOnSepThread() throws InterruptedException, ExecutionException {
    System.out.println("#################################################Multi Threaded Post Call######################");
    ExecutorService executor= Executors.newFixedThreadPool(10);
    List<Future<String>> myFutureList= new ArrayList<Future<String>>();
    long startTime=System.currentTimeMillis()/1000;


    ***//Here instead of fetching and calling Mycallable for each one, I want 
    // to do it in batches of 10***

    Iterable<Customer> customerIterable=repo.findAll();
    List<Customer> customers=new ArrayList<Customer>();
    customerIterable.forEach(customers::add);


    for(Customer c:customers) {
        MyCallable myCallable= new MyCallable(restTemplate, c);
        Future<String> future= executor.submit(myCallable);
        myFutureList.add(future);
    }

    for(Future<String> fut:myFutureList) {
        fut.get();
    }
    executor.shutdown();

    long timeElapsed= (System.currentTimeMillis()/1000)-startTime;

    System.out.println("->>>>>>>>>>>>>>>Time Elapsed In Multi Threaded Post Call<<<<<<<<<<<<<<<-"+timeElapsed);
    return "Success";

}

Мой призыв:

@Scope("prototype")
@Component
public class MyCallable implements Callable<String>{

  private RestTemplate restTemplate;
  private Customer c;

  public MyCallable(RestTemplate rt, Customer cust) {
        this.restTemplate = rt;
        this.c = cust;
    }

@Override
public String call() throws Exception {

    System.out.println("Customer no"+ c.getId() +"On thread Number"+Thread.currentThread().getId());
    restTemplate.postForObject("http://localhost:3000/save", c, String.class);
    return "Done";

}

}

Как мне этого добиться?

1 Ответ

0 голосов
/ 24 января 2019

Spring Data JPA предлагает Page и Slice для рассмотрения этого случая (см. PagingAndSortingRepository и Pageable)

public interface PagingAndSortingRepository<T, ID extends Serializable> 
  extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

Вы можете создать Pageable запрос как:

Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

и передайте его в пользовательский репозиторий (который должен быть расширен PagingAndSortingRepository):

Page<T> pageResult = customRepository.findAll(firstPageWithTwoElements);
...