Découplage des événements de printemps

Oozzzy 2022-06-23 07:34:15 阅读数:83

couplagedesnementsprintemps

Découplage des services:

  • Aop
  • Event
  • Mq
  • agent

Ce sont des affaires intrusives, Mais les affaires intrusives sont inévitables.

1.Événements personnalisés

Définir les événements,Succession ApplicationEvent La classe pour devient une classe d'événements

@Data
@ToString
public class OrderProductEvent extends ApplicationEvent {

/** Information transportée par ce type d'événement */
private String orderId;
public OrderProductEvent(Object source, String orderId) {

super(source);
this.orderId = orderId;
}
}

2.Définir l'auditeur

Écouter et gérer les événements,Réalisation ApplicationListener InterfaceOu utiliser @EventListener Notes

@Slf4j
@Component
public class OrderProductListener implements ApplicationListener<OrderProductEvent> {

/** Utiliser onApplicationEvent Méthode de réception du message */
@SneakyThrows
@Override
public void onApplicationEvent(OrderProductEvent event) {

String orderId = event.getOrderId();
long start = System.currentTimeMillis();
Thread.sleep(2000);
long end = System.currentTimeMillis();
log.info("{}: Il a fallu du temps pour vérifier les prix des articles commandés :({})MS", orderId, (end - start));
}
}

3.Définir l'éditeur

Événements de publication,Adoption ApplicationEventPublisher Événements de publication

@Slf4j
@Service
@RequiredArgsConstructor
public class OrderService {

/** InjectionApplicationContextUtilisé pour publier des événements */
private final ApplicationContext applicationContext;
/** * Passer une commande * * @param orderId OrdreID */
public String buyOrder(String orderId) {

long start = System.currentTimeMillis();
// 1.Demander les détails de la commande
// 2. Prix de la commande d'inspection (Synchronisation)
applicationContext.publishEvent(new OrderProductEvent(this, orderId));
// 3.Notification par SMS(Traitement asynchrone)
long end = System.currentTimeMillis();
log.info("Tâche accomplie.,Temps total:({})MS", end - start);
return "Achat réussi";
}
}

4.Exécution d'un seul essai

@SpringBootTest
public class OrderServiceTest {

@Autowired private OrderService orderService;
@Test
public void buyOrderTest() {

orderService.buyOrder("732171109");
}
}
2022-04-24 10:13:17.535 INFO 44272 --- [ main] c.c.m.e.listener.OrderProductListener : 732171109: Il a fallu du temps pour vérifier les prix des articles commandés :(2008)MS
2022-04-24 10:13:17.536 INFO 44272 --- [ main] c.c.mingyue.event.service.OrderService : Tâche accomplie.,Temps total:(2009)MS

5.Spring Event Utilisation asynchrone

Certains scénarios d'affaires n'ont pas besoin d'être synchronisés en une seule demande , Comme l'envoi de courrier 、 Envoi de SMS, etc .

5.1 Événements personnalisés

@Data
@AllArgsConstructor
public class MsgEvent {

/** Information transportée par ce type d'événement */
public String orderId;
}

5.2 2.Définir l'auditeur

Recommandé @EventListener Notes

@Slf4j
@Component
public class MsgListener {

@SneakyThrows
@EventListener(MsgEvent.class)
public void sendMsg(MsgEvent event) {

String orderId = event.getOrderId();
long start = System.currentTimeMillis();
log.info(" Développer l'envoi de SMS ");
log.info(" Développement envoyer le courrier ");
Thread.sleep(4000);
long end = System.currentTimeMillis();
log.info("{}:Envoyer un SMS、 Le courrier prend du temps :({})MS", orderId, (end - start));
}
}

5.3 Définir l'éditeur

/** * Passer une commande * * @param orderId OrdreID */
public String buyOrder(String orderId) {

long start = System.currentTimeMillis();
// 1.Demander les détails de la commande
// 2. Prix de la commande d'inspection (Synchronisation)
applicationContext.publishEvent(new OrderProductEvent(this, orderId));
// 3.Notification par SMS(Traitement asynchrone)
applicationContext.publishEvent(new MsgEvent(orderId));
long end = System.currentTimeMillis();
log.info("Tâche accomplie.,Temps total:({})MS", end - start);
return "Achat réussi";
}

5.4 Exécution d'un seul essai(Synchroniser)

@Test
public void buyOrderTest() {

orderService.buyOrder("732171109");
}

Les résultats sont les suivants:

2022-04-24 10:24:13.905 INFO 54848 --- [ main] c.c.m.e.listener.OrderProductListener : 732171109: Il a fallu du temps pour vérifier les prix des articles commandés :(2004)MS
2022-04-24 10:24:13.906 INFO 54848 --- [ main] c.c.mingyue.event.listener.MsgListener : Développer l'envoi de SMS
2022-04-24 10:24:13.907 INFO 54848 --- [ main] c.c.mingyue.event.listener.MsgListener : Développement envoyer le courrier
2022-04-24 10:24:17.908 INFO 54848 --- [ main] c.c.mingyue.event.listener.MsgListener : 732171109:Envoyer un SMS、 Le courrier prend du temps :(4002)MS
2022-04-24 10:24:17.908 INFO 54848 --- [ main] c.c.mingyue.event.service.OrderService :

5.5 Activer asynchrone

Augmentation de la classe de démarrage @EnableAsync Notes

@EnableAsync
@SpringBootApplication
public class MingYueSpringbootEventApplication {

public static void main(String[] args) {

SpringApplication.run(MingYueSpringbootEventApplication.class, args);
}
}

Listener La classe a besoin d'une méthode asynchrone pour activer l'augmentation @Async Notes

@Async
@SneakyThrows
@EventListener(MsgEvent.class)
public void sendMsg(MsgEvent event) {

String orderId = event.getOrderId();
long start = System.currentTimeMillis();
log.info(" Développer l'envoi de SMS ");
log.info(" Développement envoyer le courrier ");
Thread.sleep(4000);
long end = System.currentTimeMillis();
log.info("{}:Envoyer un SMS、 Le courrier prend du temps :({})MS", orderId, (end - start));
}

5.6 Exécution d'un seul essai(Asynchrone)

Le thread qui envoie le SMS s'affiche task-1,Une fois le fil principal terminé(Temps total:(2017)MS) La console a cessé d'imprimer

2022-04-24 10:30:59.002 INFO 59448 --- [ main] c.c.m.e.listener.OrderProductListener : 732171109: Il a fallu du temps pour vérifier les prix des articles commandés :(2009)MS
2022-04-24 10:30:59.009 INFO 59448 --- [ main] c.c.mingyue.event.service.OrderService : Tâche accomplie.,Temps total:(2017)MS
2022-04-24 10:30:59.028 INFO 59448 --- [ task-1] c.c.mingyue.event.listener.MsgListener : Développer l'envoi de SMS
2022-04-24 10:30:59.028 INFO 59448 --- [ task-1] c.c.mingyue.event.listener.MsgListener :
Copyright:Cet article est[Oozzzy]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/174/202206230641124049.html