導入
ビジネス処理では、一部の企業はよりリーズナブルな非同期方法を使用しています。たとえば、特定のビジネスロジックでは、一部のデータがRedisキャッシュに保存されます。キャッシュは単なる補助関数です。成功や失敗は、主要なビジネスに根本的な影響を与えません。このプロセスは、非同期方法を介して実行できます。
春には、メソッドに@Asyncアノテーションを設定することにより、この方法は非同期に呼ばれます。つまり、この方法は呼び出し後すぐに戻り、この方法の実際の実行は、SpringのTaskexecutorに引き渡されて完了します。
コードの例
このプロジェクトは、通常のSpringプロジェクトであるSpring Configurationファイルです。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:Context = "http://www.springframework.org/schema/context" xmlns:task = "http://www.springframework.org/schema/task" xsi:schemalocation = "http://www.springframework http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context.context/spring-context/spring-context/spring-context.xd http://www.springframework.org/schema/task http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd base-package = "com.lzumetal.ssm"/> <! - 非同期タスクを実行するためのスレッドプールtaskexecutor-> <task:executor id = "myexecutor" pool-size = "5"/> <タスク:注釈駆動型executor = "myexecutor"/> </> </> <
2つのサービスクラス:
package com.lzumetal.ssm.anotation.service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.concurrent.ExecutionException;import java.util.concurrent.future;/** * Business Service */@servicePublic Class BusinessService {private static final logger log = oggeractory.getLogger(businessService.class); @autowired private cacheservice cacheservice; public void dobusiness(){log.error( "私たちのビジネスに対処し始めます"); cacheservice.cachedata(); log.Error( "Comlete Service Operation"); } / ***非同期メソッドの実行の返品値を取得* / public void dobusiness withasyncreturn()throws executionexception、arturtedexception {log.Error( "私たちのビジネスに対処し始めます"); future <string> future = cacheservice.cachedatawithreturn(); log.error(future.get()); //future.get()メソッドはブロッキングlog.error( "comlete service operation"); }}パッケージcom.lzumetal.ssm.Anotation.Service; Import org.slf4j.logger; Import org.slf4j.loggerfactory; Import org.springframework.scheduling.annotation.Async; Import org.springframework.scheduling.annotation.Annotation.Ansicrresult; org.springframework.stereotype.service; Import java.util.concurrent.future; import java.util.concurrent.timeunit;/***キャッシュサービス*/@servicepublic cacheService {private static final logger log = loggerfactory.getlogger(cachervice.class); @async(value = "myexecutor")// taskexecutorを指定してタスクを実行しますpublic void cachedata(){try {timeunit.seconds.sleep(3l); } catch(arturnedexception e){e.printstacktrace(); } log.Error( "成功結果をキャッシュに保存する"); } @async public Future <string> cachedatawithreturn(){try {timeunit.seconds.sleep(3l); } catch(arturnedexception e){e.printstacktrace(); } log.Error( "成功結果をキャッシュに保存する"); //返された結果は、Asyncresultクラスのreturn new Asyncresult <>( "Async Operation Success")によってラップする必要があります。 }}テストクラス:
パッケージcom.lzumetal.ssm.anotation.test;インポートcom.lzumetal.sssm.aanotation.service.service.businessservice; Import org.junit.test; import org.junit.runner.runwith; Import org.springframework.beans.annotation.Annotation.Autowired; org.springframework.test.context.contextconfiguration; Import org.springframework.test.context.junit4.springjunit4classrunner; Import java.util.concurrent.timeUnit; @runwith(springjunit4classrunner.classrunner.classurations(springjunit4classrunner.classuration) {"classpath:spring-context.xml"})public class maintest {@autowired private businessservice businessservice; @test public void test()throws interruptedException {businessService.dobusiness(); //メインスレッドが早すぎるとしないでください。そうしないと、コンソールでは、非同期メソッドTimeUnit.Seconds.Sleep(5L)の出力コンテンツが表示されません。 } @test public void testasyncreturn()throws Exception {BusinessService.DobusinessWithAsyncreTurn(); TimeUnit.Seconds.Sleep(5L); }}test()メソッドを実行した結果:
22:20:33,207情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:260 -LOADED DEFAULT TESTEXECUTIONLISTENERクラス名[Meta -inf/spring.Factories]:[org.springframework.test.context.web.servlettestexecutionlistener、 org.springframework.context.support.dirtextextbeforemodestestecutionlistener、org.springframework.test.context.support.dependencyinjectiontexecutionlistener、org.springframework.test.context.conport.support.support.support.support.support.support.support.support.context.context.context.contex org.springframework.test.context.transaction.transactionaltestexecutionlistener、org.springframework.test.context.jdbc.sqlscriptstestexecutionlistener]
22:20:33,226情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:209 -TESTEXECUTIONLISTENER [org.springframework.test.context.web.servlettestexecutionlistener]をインスタンス化できませんでした。カスタムリスナークラスを指定するか、デフォルトのリスナークラス(および必要な依存関係)を利用可能にします。違反クラス:[Javax/Servlet/ServletContext]
22:20:33,227情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:187 -TESTEXECUTIONLISTENERS:[org.springframework.test.context.support.dirtextbeforemodestestecutionlistener@100fc185、 org.springframework.test.context.support.dependencyInjectionTestexecutionlistener@643b1d11、org.springframework.test.context.support.dirtiescontexttestestecutionlistener@2ef5e5e3、 org.springframework.test.context.transaction.transactionaltestexecutionlistener@36d4b5c、org.springframework.test.context.jdbc.sqlscriptstestestestexecutionlistener@6d00a15d] 22:20:20:33,324 Inthedededefeddefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefd - クラスパスリソースからXMLビーンの定義をロードする[Spring -Context.xml]
22:20:33,585情報メインサポート。genericApplicationContext:583 -refrifning org.springframework.context.support.genericapplicationcontext@4f7d0008:起動日[5月30日22:20:33 CST 2018];コンテキスト階層のルート
22:20:33,763情報Main concurrent.threadpooltaskexecutor:165-初期化Executorservice
22:20:33,766情報メインサポート。PostProcessorRegistrationDelegate$ beanpostprocessorchecker:325 -bean 'myexecutor' of [org.springframework.scheduling.config.taskutorfactorybean]オートプロキシ)
22:20:33,767情報メインサポート。PostProcessorRegistrationDelegate$ BeanPostProcessorChecker:325 -Bean 'myexecutor' of [org.springframework.scheduling.concurrent.threadpooltaskexcutor]オートプロキシ)
22:20:34,107エラーメインサービス。BusinessService:24-当社のビジネスに対処し始める
22:20:34,113エラーメインサービス。BusinessService:26-完全なサービス操作
22:20:37,166エラーmyexecutor -1 service.cacheservice:28-成功結果をキャッシュに保存します
22:20:39,117情報スレッド-0 support.genericapplicationcontext:984 -close org.springframework.context.support.genericapplicationcontext@4f7d0008:起動日[5月30日22:20:33 CST 2018];コンテキスト階層のルート
22:20:39,118情報スレッド-0 CONCURRENT.THREADPOOLTASKEXECUTOR:203 -ExecutorServiceのシャットダウン
testasyncreturn()メソッドを実行した結果:
21:38:16,908情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:260 -LOADED DEFAULT TESTEXECUTIONSLISTENERクラス名[Meta -Inf/Spring.Factories]:[org.springframework.test.context.web.servlettestecutionlistener、 org.springframework.context.support.dirtextextbeforemodestestecutionlistener、org.springframework.test.context.support.dependencyinjectiontexecutionlistener、org.springframework.test.context.conport.support.support.support.support.support.support.support.support.context.context.context.contex org.springframework.test.context.transaction.transactionaltestexecutionlistener、org.springframework.test.context.jdbc.sqlscriptstestexecutionlistener]
21:38:16,926情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:209 -TESTEXECUTIONLISTENER [org.springframework.test.context.web.web.servlettestexecutionlistener]をインスタンス化できませんでした。カスタムリスナークラスを指定するか、デフォルトのリスナークラス(および必要な依存関係)を利用可能にします。違反クラス:[Javax/Servlet/ServletContext]
21:38:16,927情報メインサポート。DEFAULTTESTCONTEXTBOOTSTRAPPER:187 -TESTEXECUTIONLISTENERS:[org.springframework.test.context.support.dirtextbeforemodestestecutionlistener@100fc185、 org.springframework.test.context.support.dependencyInjectionTestexecutionlistener@643b1d11、org.springframework.test.context.support.dirtiescontexttestestecutionlistener@2ef5e5e3、 org.springframework.test.context.transaction.transactionaltestexecutionlistener@36d4b5c、org.springframework.test.context.jdbc.sqlscriptstestestestexecutionlistener@6d00a15d] - クラスパスリソースからXMLビーンの定義をロードする[Spring -Context.xml]
21:38:17,263情報メインサポート。genericApplicationContext:583 -refribhing org.springframework.context.support.genericapplicationcontext@4f7d0008:起動日[5月30日21:38:17 CST 2018];コンテキスト階層のルート
21:38:17,405情報Main concurrent.threadpooltaskexecutor:165 -Executorserviceの初期化
21:38:17,407情報メインサポート。PostProcessorRegistrationDelegate$ beanpostprocessorchecker:325 -bean 'myexecutor' of [org.springframework.scheduling.config.taskutorfactorybean]オートプロキシ)
21:38:17,407情報メインサポート。PostProcessorRegistrationDelegate$ beanpostprocessorchecker:325 -bean 'myexecutor' of [org.springframework.scheduling.concurrent.threadpooltaskexcutor]オートプロキシ)
21:38:17,692エラーメインサービス。BusinessService:35-当社のビジネスに対処し始めます
21:38:20,833エラーmyexecutor -1 service.cacheservice:39-成功結果をキャッシュに保存します
21:38:20,834エラーMain Service.BusinessService:37 -Async Operation Success
21:38:20,835エラーメインサービス。BusinessService:38-完全なサービス操作
21:38:25,838情報スレッド-0 support.genericApplicationContext:984 -closht org.springframework.context.support.genericapplicationcontext@4f7d0008:起動日[5月30日21:38:17 CST 2018];コンテキスト階層のルート
21:38:25,839情報スレッド-0 CONCURRENT.THREADPOOLTASKEXECUTOR:203 -Executorserviceのシャットダウン
@asyncの使用ポイント
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。