Spring 3: How to call @Async annotated methods from the TaskExecutor

后端 未结 4 1167
说谎
说谎 2020-12-31 09:15

I\'m new to asynchronous task execution in Spring, so please forgive me if this sounds like a silly question.

I read that @Async annotation is introduced from Sprin

4条回答
  •  我在风中等你
    2020-12-31 10:15

    Complete Example

    1. Config Spring

      @Configuration        
      @EnableAsync        
      @ComponentScan("com.async")
      public class AppConfig {
      
          @Bean
          public AsyncManager asyncManger() {
              return new AsyncManager();
          }
      
          @Bean
          public AsyncExecutor asyncExecutor() {
              return new AsyncExecutor();
          }
      }
      
    2. Executor Class Created, Executor i have created so that spring takes care of thread management.

      public class AsyncExecutor extends AsyncConfigurerSupport {
      
          @Override
          public Executor getAsyncExecutor() {
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              executor.setCorePoolSize(2);
              executor.setMaxPoolSize(2);
              executor.setQueueCapacity(500);
              executor.setThreadNamePrefix("Violation-");
              executor.initialize();
              return executor;
          }
      }
      
    3. Create a manager.

      public class AsyncManager {
      
          @Autowired
          private AsyncService asyncService;
      
          public void doAsyncTask(){
              try {
                  Map violation = asyncService.getViolation();
                  if(!org.springframework.util.CollectionUtils.isEmpty(violation)){
                      violation.entrySet().forEach( violationEntry -> {System.out.println(violationEntry.getKey() +"" +violationEntry.getValue());});
                  }
                  System.out.println("do some async task");
              } catch (Exception e) {
              }
      
          }
      }
      
    4. Configure your service class.

      @Service
      public class AsyncService {
      
          @Autowired
          private AsyncExecutor asyncExecutor;
      
          @Async
          public Map getViolation() {
              // TODO Auto-generated method stub
              List list = Arrays.asList(100l,200l,300l,400l,500l,600l,700l);
              Executor executor = asyncExecutor.getAsyncExecutor();
              Map  returnMap = new HashMap<>();
              for(Long estCode : list){
                  ViolationDetails violationDetails = new ViolationDetails(estCode);
                  returnMap.put(estCode, violationDetails);
                  executor.execute((Runnable)new ViolationWorker(violationDetails));
              }
              return returnMap;       
          }
      }
      class ViolationWorker implements Runnable{
      
          private ViolationDetails violationDetails;
      
          public ViolationWorker(ViolationDetails violationDetails){
              this.violationDetails = violationDetails;
          }
      
          @Override
          public void run() {
              violationDetails.setViolation(System.currentTimeMillis());
              System.out.println(violationDetails.getEstablishmentID() + "    " + violationDetails.getViolation());
          }
      }
      
    5. Model.

      public class ViolationDetails {
          private long establishmentID;
          private long violation;
      
      
          public ViolationDetails(long establishmentID){
              this.establishmentID = establishmentID;
          }
      
          public long getEstablishmentID() {
              return establishmentID;
          }
          public void setEstablishmentID(long establishmentID) {
              this.establishmentID = establishmentID;
          }
          public long getViolation() {
              return violation;
          }
          public void setViolation(long violation) {
              this.violation = violation;
          }
      
      }
      
    6. Test to Run

      public class AppTest {
          public static void main(String[] args) throws SQLException {
              AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
              ctx.register(AppConfig.class);
              ctx.refresh();
      
              AsyncManager task= ctx.getBean(AsyncManager.class);
              task.doAsyncTask();
          }
      }
      

提交回复
热议问题