Spring Bootを使用する前に、私たちのアプローチは、構成ファイルのタスクプールを定義し、@Async注釈付きタスクを実行のためにタスクプールにスローすることでした。したがって、Spring Bootでは、非同期タスク呼び出しを実装する方法では、この方法はより簡単です。
前のものを組み合わせてみましょう
Spring Boot Integrated JMS(ActiveMQ実装)
このブログのコードが実装されています。
1。関数の説明
消費者がキュー内のメッセージに耳を傾けると、メッセージを受け取るタスクを非同期タスクとして処理します。
2。コードの変更
消費者1:
パッケージcom.chhliu.springboot.jms; org.springframework.jms.annotation.jmslistenerをインポートします。 org.springframework.scheduling.annotation.asyncをインポートします。 org.springframework.stereotype.componentをインポートします。 @component public class Consumer {@jmslistener(destination = "mytest.queue")@async // IS: "+テキスト); }}消費者2:
パッケージcom.chhliu.springboot.jms; org.springframework.jms.annotation.jmslistenerをインポートします。 org.springframework.messaging.handler.annotation.sendtoをインポートします。 org.springframework.stereotype.componentをインポートします。 @component public class Consumer2 {@jmslistener(destination = "mytest.queue")@sendto( "out.queue")public string receidqueue(string text){system.out.println(thread.currentthread()。getName()。 「返信メッセージ」+テキストを返します。 }}次の注釈をテストクラスに追加します。
パッケージcom.chhliu.springboot.jms; javax.jms.destinationをインポートします。 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; org.springframework.scheduling.annotation.enableasyncをインポートします。 Import org.springframework.test.context.junit4.springrunner; @runwith(springrunner.class)@springboottest @enableasync // public class springbootjmsapplicationtests {@autowired private prodicerプロデューサーをサポートする非同期タスクを有効にします。 @test public void contextloads()throws arturnedexception {宛先宛先= new activemqqueue( "mytest.queue"); for(int i = 0; i <100; i ++){producer.sendmessage(宛先、 "myname is chhliu !!!"); }}} 3。テスト結果
DefaultMessageListenerContainer-1:Consumer2受信:mynameはchhliu !!! out.queue queueから受信した返信メッセージは次のとおりです。 Simpleasynctaskexecutor-45:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2受信:mynameはchhliu !!! out.queue queueから受信した返信メッセージは次のとおりです。 simpleasynctaskexecutor-46:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2が受け取ったメッセージは次のとおりです。 out.queue queueから受信した返信メッセージは次のとおりです。 simpleasynctaskexecutor-47:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2が受け取ったメッセージは次のとおりです。 out.queue queueから受信した返信メッセージは次のとおりです。 Simpleasynctaskexecutor-48:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2 is:myname is chhliu !!! out.queue queueから受信した返信メッセージは次のとおりです。 simpleasynctaskexecutor-49:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2が受け取ったメッセージは次のとおりです。 out.queue queueから受信した返信メッセージは次のとおりです。 Simpleasynctaskexecutor-50:消費者が受け取ったメッセージは次のとおりです。 DefaultMessageListenerContainer-1:Consumer2が受け取ったメッセージは次のとおりです。
上記のテスト結果から、消費者2は非同期タスク法を使用していないため、消費者2は固定されたスレッドDefastMessageListenerContainer-1によって処理されることがわかります。 Consumer 1は非同期タスクメソッドを使用し、受信したメッセージが別のスレッドで処理されるたびに使用されます。メッセージが受信されると、タスクは処理のためにタスクプールに直接スローされ、メインスレッドは実行され続けます。また、テスト結果から、Spring BootがデフォルトでNewCachedThreadPoolスレッドプールを使用していることも推測できます。
スレッドプールの具体的な使用については、私からの別のブログ投稿を参照してください://www.vevb.com/article/134870.htm
4.非同期タスクが戻ってきました
実際の開発では、非同期タスクが戻ってくる状況に遭遇することがよくあります。では、スプリングブーツにどのように実装しますか?
以下は、説明として非同期メール送信の例です。例コードは次のとおりです。
@async( "taskexecutepool")//非同期タスクはtaskexecutepoolタスクプールに提出され、パブリックフューチャー<応答> dosendemail(mailinfo mailinfo){//非同期タスクリターン、未来の<応答>を使用して、get.info() DosendeMail非同期メソッドが呼び出されました! "); sendMailsession Session = null;応答res = new Response(); boolean isok = sendemail(mailinfo); //電子メールを送信する特定の方法if(isok){res.setsuccess(true); } else {res.setsuccess(false); } new Asyncresult <Response>(res)を返します。返品後に使用する方法は?サンプルコードは次のとおりです。
Future <Response> result = taskjob.dosendemail(mailinfo); res = result.get(6、timeunit.seconds);
このようにして、非同期タスクの返品を取得できます!
要約します
上記は、スプリングブート非同期(非同期)タスクスケジューリングの実装方法です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!