spring boot非同期タスクスケジューリングの実現方法
spring bootを使用していない前に、私達のやり方は配置ファイルの中でタスクプールを定義して、@Aync注釈のタスクをタスクプールに捨てて実行します。その後、spring bootの中で、どうやって非同期タスクの呼び出しを実現しますか?方法はもっと簡単です。
私達はやはり前の方に結合します。
spring boot統合JMS(ActiveMQ実現)
このブログのコードを実現します。
一、機能説明
消費者はキューの中のメッセージを傍受すると、メッセージを受信するタスクを非同期のタスクとして処理します。
二、コード修正
消費者1:
スレッド池の具体的な使い方については、私のもう一つのブログを参照してください。
四、非同期タスクはリターンがあります。
実際の開発において、私たちは常に非同期の任務が戻ってくる場合がありますが、spring bootでは、どうやって実現されましたか?
非同期メールを例に説明します。コード例は以下の通りです。
締め括りをつける
以上は小编が皆さんに绍介したspring boot异歩(Async)の任务スケジュールの実现方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
私達はやはり前の方に結合します。
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)の任务スケジュールの実现方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。