5

Trong ứng dụng của tôi, tôi phải xử lý nhiều công việc không đồng bộ từ chuỗi ứng dụng chính và thu thập kết quả của từng công việc. Tôi có một giải pháp Java đơn giản thực hiện điều này bằng cách sử dụng ExecutorService và ExecutorCompletionService để thu thập kết quả công việc.Tương đương với mùa xuân của CompletionService?

Bây giờ tôi muốn chuyển đổi mã của mình thành giải pháp Mùa xuân. docs chỉ cho tôi cách sử dụng chú thích ExecutorService và @Async, nhưng tôi không chắc chắn cách thức và nếu tôi có thể thu thập kết quả của nhiều công việc.

Nói cách khác: Tôi đang tìm kiếm tương đương Spring của CompletionService. Có một điều như vậy?

mã hiện tại của tôi:

class MyService { 

private static ExecutorService executorService; 
private static CompletionService<String> taskCompletionService; 

// static init block 
static { 
    executorService = Executors.newFixedThreadPool(4); 
    taskCompletionService = new ExecutorCompletionService<String>(executorService); 

    // Create thread that keeps looking for results 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Future<String> future = taskCompletionService.take(); 
        String s = future.get(); 
        LOG.debug(s); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    }).start(); 
} 

// This method can and will be called multiple times, 
// so multiple jobs are submitted to the completion service 
public void solve(List<Long> ids) throws IOException, SolverException { 
    String data = createSolverData(ids); 
    taskCompletionService.submit(new SolverRunner(data, properties)); 
} 
} 

Trả lời

1

Bạn cần phải xem xét mục tiêu chính của bạn là gì, bởi vì mã hiện tại của bạn sẽ hoạt động tốt cùng với các lớp khác mùa xuân liên quan. Spring cung cấp hỗ trợ cho Java ExecutorService bản địa cũng như thư viện bên thứ 3 phổ biến khác như Quartz

Có lẽ những gì bạn đang thiết lập dịch vụ thi hành trên thùng chứa mùa xuân (ví dụ: sử dụng cấu hình sau đây trên bean mùa xuân của bạn xml)

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 

và trang trí lớp MyService của bạn với @Service chú thích và tiêm các tham chiếu đến các dịch vụ thi hành di chúc

0

tôi đã kết thúc việc xác định đậu của tôi trong bối cảnh ứng dụng Spring và tiêm các completionservice vào MyService. Làm việc như một sự quyến rũ.

<task:executor id="solverExecutorService" pool-size="5" queue-capacity="100" /> 
<spring:bean id="solverCompletionService" class="nl.marktmonitor.solver.service.SolverCompletionService" scope="singleton"> 
    <constructor-arg name="executor" ref="solverExecutorService"/> 
</spring:bean> 
Các vấn đề liên quan