spring boot非同期タスクスケジューリングの実現方法


spring bootを使用していない前に、私達のやり方は配置ファイルの中でタスクプールを定義して、@Aync注釈のタスクをタスクプールに捨てて実行します。その後、spring bootの中で、どうやって非同期タスクの呼び出しを実現しますか?方法はもっと簡単です。
私達はやはり前の方に結合します。
spring boot統合JMS(ActiveMQ実現)
このブログのコードを実現します。
一、機能説明
消費者はキューの中のメッセージを傍受すると、メッセージを受信するタスクを非同期のタスクとして処理します。
二、コード修正
消費者1:

package com.chhliu.springboot.jms; 
import org.springframework.jms.annotation.JmsListener; 
import org.springframework.scheduling.annotation.Async; 
import org.springframework.stereotype.Component; 
@Component 
public class Consumer { 
 @JmsListener(destination = "mytest.queue") 
 @Async //        ,               ,                  
 public void receiveQueue(String text) { 
  System.out.println(Thread.currentThread().getName()+":Consumer      :"+text); 
 } 
} 
消費者2:

package com.chhliu.springboot.jms; 
import org.springframework.jms.annotation.JmsListener; 
import org.springframework.messaging.handler.annotation.SendTo; 
import org.springframework.stereotype.Component; 
@Component 
public class Consumer2 { 
 @JmsListener(destination = "mytest.queue") 
 @SendTo("out.queue") 
 public String receiveQueue(String text) { 
  System.out.println(Thread.currentThread().getName()+":Consumer2      :"+text); 
  return "return message"+text; 
 } 
} 
テストクラスに以下の注を追加します。

package com.chhliu.springboot.jms; 
import javax.jms.Destination; 
import org.apache.activemq.command.ActiveMQQueue; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.scheduling.annotation.EnableAsync; 
import org.springframework.test.context.junit4.SpringRunner; 
@RunWith(SpringRunner.class) 
@SpringBootTest 
@EnableAsync //          
public class SpringbootJmsApplicationTests { 
 @Autowired 
 private Producer producer; 
 @Test 
 public void contextLoads() throws InterruptedException { 
  Destination destination = new ActiveMQQueue("mytest.queue"); 
  for(int i=0; i<100; i++){ 
   producer.sendMessage(destination, "myname is chhliu!!!"); 
  } 
 } 
} 
三、テスト結果 

DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-45:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-46:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-47:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-48:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-49:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
 out.queue          :return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-50:Consumer      :myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2      :myname is chhliu!!! 
上記のテスト結果から、消費者2は非同期的なタスク方式を使用していないため、消費者2消費者メッセージは、固定スレッドDefault Message ListenerContiner-1というスレッドで処理されており、消費者1は、非同期的なタスクを使用しているため、受信したメッセージはそれぞれ異なるスレッドで処理されており、メッセージを受信すると、消費者1は異なるスレッドで処理されることが示されている。直接にタスクをタスクプールに捨てて処理しますが、メインスレッドは走り続けます。テスト結果から、spring bootはデフォルトでnewCachedThreadPoolスレッド池を使っていると推測されます。
スレッド池の具体的な使い方については、私のもう一つのブログを参照してください。
四、非同期タスクはリターンがあります。
実際の開発において、私たちは常に非同期の任務が戻ってくる場合がありますが、spring bootでは、どうやって実現されましたか?
非同期メールを例に説明します。コード例は以下の通りです。

@Async("taskExecutePool") //         taskExecutePool       
 public Future<Response> doSendEmail(MailInfo mailInfo) {//       ,  Future<Response>      
  log.info(Thread.currentThread().getName()+"   doSendEmail    !"); 
  SendMailSession session = null; 
  Response res = new Response(); 
  boolean isOK = sendEmail(mailInfo);//          
 if(isOK){   
  res.setSuccess(true);  
 }else{ 
  res.setSuccess(false); 
 } 
 return new AsyncResult<Response>(res); 
帰ったらどう使いますか?サンプルコードは以下の通りです。

Future<Response> result = taskJob.doSendEmail(mailInfo); 
   res = result.get(6, TimeUnit.SECONDS); 
このようにすれば、非同期タスクのリターンが得られます。
締め括りをつける
以上は小编が皆さんに绍介したspring boot异歩(Async)の任务スケジュールの実现方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。