Rumah  >  Artikel  >  Java  >  Cara menggunakan pendengar acara springboot

Cara menggunakan pendengar acara springboot

PHPz
PHPzke hadapan
2023-05-14 10:01:20863semak imbas

Boot case

Mari kita lihat kes mudah

@Configuration
public class SelfBusiness {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness.class);
        context.getBean(MyService.class).doBusiness();
        context.close();
    }
    @Component
    static class MyService {
        private static final Logger logger = LoggerFactory.getLogger(MyService.class);
        @Autowired
        private ApplicationEventPublisher publisher;
        public void doBusiness (){
            logger.debug("主线业务");
            logger.debug("发送短信");
            logger.debug("发送邮件");
        }
    }

Jalankan kod di atas dan perhatikan kesannya

Cara menggunakan pendengar acara springboot

Digabungkan dengan. hasil output, logik yang perlu dilaksanakan dalam kod ini ialah selepas pelaksanaan perniagaan talian utama selesai, operasi seperti menghantar mesej teks dan e-mel perlu dilakukan tidak cukup elegan dan tidak cukup mesra dari segi kebolehskalaan perniagaan berikutnya, jika perniagaan barisan utama berikutnya selesai dan operasi audit lain perlu ditambah, logik kod baharu perlu ditambah, yang menggabungkan dengan ketat perniagaan barisan utama dan logik cawangan. ;

Dalam erti kata lain, kami menantikan Kesannya perniagaan barisan utama langsung tidak mengambil berat tentang operasi perniagaan lain, ia hanya perlu melengkapkan logiknya sendiri, yang memerlukan penggunaan acara itu. fungsi pendengar disediakan oleh musim bunga;

Gunakan proses transformasi pendengar acara

Terdapat dua cara utama untuk menggunakan pendengar acara dalam springboot (spring Satu ialah melaksanakan antara muka ApplicationListener, dan satu lagi ialah). untuk menambah anotasi @EventListener ke kelas Seterusnya, kedua-dua kaedah ini akan diterangkan satu persatu; objek) dan mewarisi ApplicationEvent

 static class MyEvent extends ApplicationEvent {
        public MyEvent(Object source) {
            super(source);
        }
    }

Ia boleh difahami dengan cara ini, dalam kod, Mungkin terdapat banyak jenis acara dan perniagaan yang berbeza sepadan dengan acara yang berbeza Untuk pendengar tertentu, ia hanya mahu untuk mendengar acara jenis A;

2. Auto Tentukan kelas perniagaan untuk melaksanakan antara muka ApplicationListener

  
	@Data
    static class Params {
        private String id ;
        private String name;
        private String phone;
    }
	@Component
    static class SmsApplicationListener implements ApplicationListener<MyEvent> {
        private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class);
        @Override
        public void onApplicationEvent(MyEvent myEvent) {
            Object source = myEvent.getSource();
            try {
                Params params = objectMapper.readValue(source.toString(), Params.class);
                logger.debug("userId : {}",params.getId());
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            logger.debug("执行 sms 发短信业务");
        }
    }
    @Component
    static class EmailApplicationListener implements ApplicationListener<MyEvent> {
        private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class);
        @Override
        public void onApplicationEvent(MyEvent myEvent) {
            Object source = myEvent.getSource();
            logger.debug("执行 email 发邮件业务");
        }
    }

Jelas sekali, jenis acara yang pendengar di sini mahu listen to ialah MyEvent yang kami takrifkan di atas Dengan cara ini, apabila perniagaan dicetuskan, ia boleh digunakan dalam onApplicationEvent Dapatkan parameter yang diluluskan dan laksanakan operasi perniagaan pemesejan teks (e-mel)

3. . Acara penerbitan perniagaan talian utama

@Component
    static class MyService {
        private static final Logger logger = LoggerFactory.getLogger(MyService.class);
        @Autowired
        private ApplicationEventPublisher publisher;
        public void doBusiness (){
            Params params = new Params();
            params.setId("001");
            params.setName("xiaoma");
            params.setPhone("133******");
            logger.debug("主线业务");
            try {
                publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params)));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //publisher.publishEvent(new MyEvent("MyService doBusiness()"));
            //logger.debug("发送短信");
            //logger.debug("发送邮件");
        }
    }

Untuk perniagaan talian utama, ini Kemudian anda tidak perlu lagi menulis logik untuk menghantar mesej teks atau e-mel Anda hanya memerlukan penerbit untuk menerbitkan acara tersebut lulus parameter, hantar bersama-sama

Kod lengkap

@Configuration
public class SelfBusiness {
    private static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness.class);
        context.getBean(MyService.class).doBusiness();
        context.close();
    }
    @Data
    static class Params {
        private String id ;
        private String name;
        private String phone;
    }
    /**
     * 自定义事件对象
     */
    static class MyEvent extends ApplicationEvent {
        public MyEvent(Object source) {
            super(source);
        }
    }
    @Component
    static class MyService {
        private static final Logger logger = LoggerFactory.getLogger(MyService.class);
        @Autowired
        private ApplicationEventPublisher publisher;
        public void doBusiness (){
            Params params = new Params();
            params.setId("001");
            params.setName("xiaoma");
            params.setPhone("133******");
            logger.debug("主线业务");
            try {
                publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params)));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //publisher.publishEvent(new MyEvent("MyService doBusiness()"));
            //logger.debug("发送短信");
            //logger.debug("发送邮件");
        }
    }
    /**
     * 监听事件触发后要执行的业务
     */
    @Component
    static class SmsApplicationListener implements ApplicationListener {
        private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class);
        @Override
        public void onApplicationEvent(MyEvent myEvent) {
            Object source = myEvent.getSource();
            try {
                Params params = objectMapper.readValue(source.toString(), Params.class);
                logger.debug("userId : {}",params.getId());
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            logger.debug("执行 sms 发短信业务");
        }
    }
    @Component
    static class EmailApplicationListener implements ApplicationListener {
        private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class);
        @Override
        public void onApplicationEvent(MyEvent myEvent) {
            Object source = myEvent.getSource();
            logger.debug("执行 email 发邮件业务");
        }
    }
}

Jalankan semula kod di atas dan perhatikan kesannya. Anda dapat melihat bahawa ia masih boleh memenuhi kesan yang diharapkan

2 Laksanakannya dengan menambahkan anotasi @EventListener

Cara menggunakan pendengar acara springbootKaedah ini tidak lagi perlu melaksanakan antara muka ApplicationListener, tetapi hanya menambah anotasi @EventListener terus ke kaedah kelas mendengar. Ia agak dipermudahkan. Kod lengkap disiarkan terus di bawah

package com.congge.config;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Configuration
public class SelfBusiness2 {
    private static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness2.class);
        context.getBean(MyService.class).doBusiness();
        context.close();
    }
    @Data
    static class Params {
        private String id ;
        private String name;
        private String phone;
    }
    /**
     * 自定义事件对象
     */
    static class MyEvent extends ApplicationEvent {
        public MyEvent(Object source) {
            super(source);
        }
    }
    @Component
    static class MyService {
        private static final Logger logger = LoggerFactory.getLogger(MyService.class);
        @Autowired
        private ApplicationEventPublisher publisher;
        public void doBusiness (){
            Params params = new Params();
            params.setId("001");
            params.setName("xiaoma");
            params.setPhone("133******");
            logger.debug("主线业务");
            try {
                publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params)));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
    }
    @Component
    static class SmsListenerService {
        private static final Logger logger = LoggerFactory.getLogger(SmsListenerService.class);
        @EventListener
        public void smsListener(MyEvent myEvent){
            Object source = myEvent.getSource();
            try {
                SelfBusiness2.Params params = objectMapper.readValue(source.toString(), SelfBusiness2.Params.class);
                logger.debug("userId : {}",params.getId());
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            logger.debug("执行 sms 发短信业务");
        }
    }
    @Component
    static class EmailListenerService {
        private static final Logger logger = LoggerFactory.getLogger(EmailListenerService.class);
        @EventListener
        public void emailListener(MyEvent myEvent){
            Object source = myEvent.getSource();
            try {
                SelfBusiness2.Params params = objectMapper.readValue(source.toString(), SelfBusiness2.Params.class);
                logger.debug("userId : {}",params.getId());
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            logger.debug("执行 email 发邮件业务");
        }
    }
}

Jalankan Kod di atas dan perhatikan kesannya, anda juga boleh mencapai kesan yang diharapkan

Ketiga, gunakan asynchronous

Cara menggunakan pendengar acara springboot Tambahan pula, untuk meningkatkan kecekapan pelaksanaan logik perniagaan barisan utama , kami berharap logik perniagaan acara penerbitan akan dilaksanakan secara tidak segerak, bagaimana untuk melakukannya

Melihat melalui kod sumber, kami dapat mengetahui bahawa ApplicationEventPublisher menggunakan satu urutan untuk menghantar secara serentak apabila menerbitkan acara secara lalai Jika anda perlu menggunakan asynchronous, anda perlu menyesuaikan ThreadPoolTaskExecutor dan SimpleApplicationEventMulticaster, jadi kami hanya perlu menulis ganti. kacang kedua-dua komponen ini, dan tambahkan dua kacang berikut pada kelas perniagaan di atas; >

Bandingkan kesan satu benang di atas

Atas ialah kandungan terperinci Cara menggunakan pendengar acara springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam