Sehen wir uns unten einen einfachen Fall an:
@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("发送邮件"); } }
Führen Sie den obigen Code aus und beobachten Sie den Effekt
In Kombination mit den Ausgabeergebnissen ist die von diesem Code zu implementierende Logik die nach dem Hauptliniengeschäft Wenn die Ausführung abgeschlossen ist, muss sie ausgeführt werden. Es ist nichts Falsches daran, Vorgänge wie das Versenden von Textnachrichten und E-Mails durchzuführen, aber es ist nicht elegant genug und nicht benutzerfreundlich genug im Hinblick auf die spätere Skalierbarkeit des Geschäfts Es muss eine weitere Prüfoperation hinzugefügt werden. Durch das Hinzufügen einer neuen Codelogik werden die Hauptgeschäfts- und Nebengeschäftslogik eng gekoppelt. Das heißt, wir erwarten, dass sich das Hauptgeschäftsgeschäft nicht um andere Geschäftsvorgänge kümmert überhaupt und muss nur seine eigene Logik vervollständigen. Dies erfordert die Verwendung der von Spring bereitgestellten Ereignis-Listener-Funktion. , indem die ApplicationListener-Schnittstelle implementiert wird, und die andere darin besteht, sie zur Klasse @EventListener hinzuzufügen. Als Nächstes werden diese beiden Methoden nacheinander erläutert
1 Implementierungsschritte durch Implementierung der ApplicationListener-Schnittstelle
1. Passen Sie eine Ereignisklasse (Objekt) an und erben Sie ApplicationEvent
static class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } }Es kann so verstanden werden: Im Code kann es viele Arten von Ereignissen geben, und unterschiedliche Unternehmen entsprechen unterschiedlichen Ereignissen. Für einen bestimmten Zuhörer möchte es nur
@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 发邮件业务"); } }
Offensichtlich ist der Ereignistyp, den der Listener hier abhören möchte, auf diese Weise, wenn Das Geschäft wird ausgelöst, die übergebenen Parameter können in onApplicationEvent abgerufen werden, sodass der Geschäftsvorgang per SMS ausgeführt wird (E-Mail senden)
Wenn wir uns den Quellcode ansehen, können wir erkennen, dass ApplicationEventPublisher synchrones Senden mit einem Thread verwendet Wenn Sie Ereignisse standardmäßig veröffentlichen, müssen Sie ThreadPoolTaskExecutor und SimpleApplicationEventMulticaster anpassen. Fügen Sie der obigen Business-Klasse die folgenden beiden Beans hinzu Führen Sie den Code zu diesem Zeitpunkt erneut aus, führen Sie ihn mehrmals aus und Sie können den Effekt sehenVergleichen Sie den obigen Single-Threaded-Effekt
Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Springboot-Ereignis-Listener. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!