1. Execução e agendamento de tarefas
A Spring usa as interfaces Taskexecutor e TaskScheduler para fornecer abstrações para tarefas de execução e agendamento assíncronas.
O Taskexecutor da Spring é o mesmo que a interface java.util.concurrent.executor. Essa interface possui apenas um método executado (tarefa executável).
1.1. Tipo de Taskexecutor
A primavera integrou muitas implementações do Taskexecutor e você não precisa implementá-las:
1.2. Anotações suportam programação e execução assíncrona
Para ativar o suporte para as anotações @Scheduled e @async, adicione @enablescheduling e @enableasync a um de seus
@Configuration Classes:@Configuration@Enableasync@enablechedulingpublic class AppConfig {}Preste atenção especial
O modo de aconselhamento padrão para processar as anotações @async é "proxy", que permite a interferência de chamadas apenas através do proxy; As chamadas locais na mesma classe não podem ser interceptadas dessa maneira. Para um modo de interferência mais avançado, considere mudar para o modo "AspectJ" em combinação com o tempo de compilação ou a soldagem no tempo de carga.
Por padrão, o @async é tratado com proxy. Portanto, os métodos na mesma classe não podem ser chamados de forma assíncrona com @async, e essa situação ainda é síncrona.
Por exemplo: o seguinte, Calling Sayhi () diretamente externamente, pode ser executado de forma assíncrona, enquanto diz que o Sayhi () ainda é executado de forma síncrona quando chama Sayhello ()
public classe A {public void SayHello () {Sayhi (); } @Async public void dizhi () {}}1.3. @Async Anotation
Adicionar anotação @async ao método significa que esta é uma chamada assíncrona. Em outras palavras, o chamador do método receberá a devolução imediatamente e a execução do método real é enviar uma tarefa no Taskexecutor da Spring.
Em outras palavras, o chamador retornará imediatamente após a invocação e a execução real do método ocorrerá em uma tarefa que foi submetida a um Taskexecutor de primavera.
@Asyncvoid dosomething () {// Isso será executado de forma assíncrona} @Asyncvoid dosomething (strings) {// Isso será executado de forma assíncrona} @Asyncfuture <string> returnSomething (int i) {// Isso será executado de forma assíncrona}Perceber:
Os métodos @async podem não apenas declarar um tipo de devolução java.util.concurrent.future, mas também org.springframework.util.concurrent.ListenableFuture ou, como o STRAND 4.2, o java do java.util.utrony.Current.completablefuture: o riquente intertativo 8
1.4. @Async Limited Executor
Por padrão, quando a anotação @async é adicionada ao método, um executor que suporta o driver de anotação será usado. No entanto, o valor do valor da anotação @async pode especificar um executor adicional
@Async ("otherexecutor") void dosomething (strings s) {// Isso será executado de forma assíncrona por "Otherexecutor"}Aqui, o Otherexecutor é o nome de qualquer feijão do executor no recipiente da primavera.
1.5. @Async Exception Management
Quando um método @async tem um valor de retorno do tipo futuro, é fácil gerenciar a exceção lançada ao digitar o método get () do futuro para obter o resultado da execução da tarefa. Se o tipo de retorno for anulado, a exceção não será capturada.
classe pública myasyncuncaughtexceptionhandler implementa asyncuncaughtexceptionhandler {@Override public void handleuncaughtexception (throwable ex, método, objeto ... params) {// manipulam exceção}} 2. Configuração do pool de threads
importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.scheduling.annotation.enableasync; importar; org.springframework.scheduling.concurrent.threadpooltaskexecutor;@configature@Enableasyncpublic classe TaskexecutorConfig {private integro corePoolSize = 30; Inteiro privado maxpoolsize = 50; Inteiro privado keepAliveSegunds = 300; // PRIVADO Inteiro @Bean ("Mythreadpooltaskexecutor") publicPoolTaskexecutor mythreadpooltaskexecutor () {threadpooltaskexecutor Executor = new ThreadPooltaskexecutor (); Executor.SetCorePoolSize (CorePoolSize); Executor.SetMaxPoolSize (Maxpoolsize); executor.setKeepaliveSeconds (KeepaliveSeconds); // Executor.SetQueuecApacity (Queuecapacidade); Executor.SetWaitForTaskstocompleteOnshutdown (true); executor.initialize (); executor de retorno; }} Chamar
@Async ("mythreadpooltaskexecutor") @Override public void presente (entidade do cupompresentLogentity) {try {couponbaseSponse rst = cuponsendrpcService.send (entity.getUserId () entity.getCounBatchKey (), "1",, 1,, 1 e entity.getUserId (), egity.getCouponBatchKey (), "1",, 1,, 1 e entity.getUserId ()gOnBoNbatchKey (), "1",, 1,, 1 ", e entidade, endrpCounBatchKey ()," 1 ", 1 e entidade. if (null! = rst && rst.issuccess ()) {entity.setStatus (presentestatusenum.success.gettype ()); } else {string reason = (null == rst)? "Exceção de resposta": rst.getmsg (); entity.setFailureroason (Razão); entity.setStatus (presentestatusenum.failure.getType ()); }} catch (Exceção ex) {log.error (ex.getMessage (), ex); entity.setFailureroason (Ex.getMessage ()); entity.setStatus (presentestatusenum.failure.getType ()); } cupompresedLogdao.update (entidade); }resultado
[INFO] 2018-05-09 16: 27: 39.887 [Mythreadpooltaskexecutor-1] [com.ourhours.coupon.rpc.dubbo.receiveleGfilter]-Receber método-name: send; Argumentos: [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
[Info] 2018-05-09 16: 27: 39.889 [mythreadpooltaskexecutor-2] [com.ourhours.coupon.rpc.dubbo.receiveleGfilter]-Receber método-name: send; Argumentos: [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
Consulte:
Documentação de referência da estrutura da mola 4.3.17. Release
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.