public class LoginEvent extends ApplicationEvent {
private final String userName;
public LoginEvent(Object source, String username) {
super(source);
this.userName = username;
}
public String getUserName() {
return userName;
}
}
@Service
public class LoginEventPublisher {
private final ApplicationEventPublisher applicationEventPublisher;
public LoginEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void publishLoginEvent(String username) {
LogonEvent loginEvent = new LoginEvent(this, username);
applicationEventPublisher.publishEvent(loginEvent);
}
}
// Прослушиватель событий обработки журнала
@Component
public class LoginEventPrintLogListener {
@EventListener
public void handleUserLoginEvent(LoginEvent event) {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий входа пользователя в систему, например, регистрация или запуск других действий.
System.out.println("User logged in: " + username);
}
}
// Прослушиватель событий уведомления о входе в систему
@Component
public class LoginEventMessageNoticeListener {
@EventListener
public void LoginEventMessageNoticeListener(LoginEvent event) {
String username = event.getUserName();
// Отправьте сообщение, чтобы уведомить пользователей
System.out.println("message send User logged in: " + username);
}
}
@Component
public class MyCommandLineRunner implements CommandLineRunner {
private final LoginEventPublisher loginEventPublisher;
public MyCommandLineRunner(LoginEventPublisher loginEventPublisher) {
this.loginEventPublisher = loginEventPublisher;
}
@Override
public void run(String... args) {
// существует логика восстановления, выполняемая после запуска приложения
System.out.println("MyCommandLineRunner executed!");
// Вход успешен
// Логика входа в систему после выполнения
loginEventPublisher.publishLoginEvent("Сяо Ван");
}
}
2023-10-13 16:04:02.021 INFO 5356 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1250 ms
2023-10-13 16:04:02.382 INFO 5356 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-10-13 16:05:31.792 INFO 5356 --- [ main] c.e.s.SpringBootTestMavenApplication : Started SpringBootTestMavenApplication in 200.49 seconds (JVM running for 201.165)
MyCommandLineRunner executed!
message send User logged in: Сяо Ван
User logged in: Сяо Ван
// Прослушиватель событий обработки журнала
@Component
public class LoginEventPrintLogListener {
@EventListener
public void handleUserLoginEvent(LoginEvent event) {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий входа пользователя в систему, например, регистрация или запуск других действий.
System.out.println("User logged in: " + username);
}
}
// Прослушиватель событий уведомления о входе в систему
@Component
public class LoginEventMessageNoticeListener {
@EventListener
public void LoginEventMessageNoticeListener(LoginEvent event) {
String username = event.getUserName();
// Отправьте сообщение, чтобы уведомить пользователей
System.out.println("message send User logged in: " + username);
}
}
@Component
public class LoginEventPrintLogListenerTest implements ApplicationListener<LoginEvent> {
@Override
public void onApplicationEvent(LoginEvent event) {
System.out.println("this is a Listener with not annotation");
}
}
@SpringBootApplication
// включать Async
@EnableAsync
public class SpringBootTestMavenApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTestMavenApplication.class, args);
}
}
@Component
public class LoginEventPrintLogListener {
@EventListener
// Настроить задачу асинхронно Создайте новый поток для обработки события.
@Async
public void handleUserLoginEvent(LoginEvent event) throws Exception {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий входа пользователя в систему, например, регистрация или запуск других действий.
System.out.println("User logged in: " + username);
}
}
@Component
public class LoginEventPrintLogListener {
@EventListener(condition = "#event.userName.equals('Сяо Ван')")
public void handleUserLoginEvent(LoginEvent event) throws Exception {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий входа пользователя в систему, например, регистрация или запуск других действий.
System.out.println("User logged in: " + username);
}
}
Вариант 1. Разделите логику обработки транзакций и публикации событий, чтобы избежать описанных выше ненормальных сценариев (рекомендуется).
Вариант 2:использовать TransactionalEventListener Укажите связь последовательности с выполнением транзакции.
@Component
public class MyCommandLineRunner implements CommandLineRunner {
private final RegisterEventPublisher registerEventPublisher;
public MyCommandLineRunner(RegisterEventPublisher registerEventPublisher) {
this.RegisterEventPublisher = registerEventPublisher;
}
@Override
@Transactional
public void run(String... args) {
// существует логика восстановления, выполняемая после запуска приложения
System.out.println("MyCommandLineRunner executed!");
// Регистрация прошла успешно
// Регистрация логики после выполнения
registerEventPublisher.publishRegisterEvent("Сяо Ван");
// Исключение выполнения вызывает откат транзакции
}
}
@Component
public class RegisterEventPrintLogListener {
// Транзакция будет выполнена после ее отправки
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleUserRegisterEvent(RigisterEvent event) throws Exception {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий регистрации пользователей, например ведение журнала или запуск других операций.
System.out.println("User register: " + username);
}
}
@Component
public class LoginEventPrintLogListener {
@EventListener
@Order(1)
public void handleUserLoginEvent(LoginEvent event) throws Exception {
String username = event.getUserName();
// существуют. Здесь выполняется логика обработки событий входа пользователя в систему, например, регистрация или запуск других действий.
System.out.println("User logged in: " + username);
}
}
@Component
public class LoginEventMessageNoticeListener {
@EventListener
@Order(2)
public void LoginEventMessageNoticeListener(LoginEvent event) {
String username = event.getUserName();
// Отправьте сообщение, чтобы уведомить пользователей
System.out.println("message send User logged in: " + username);
}
}
public class GenericEvent<T> extends ApplicationEvent {
private T eventData;
public GenericEvent(Object source, T eventData) {
super(source);
this.eventData = eventData;
}
public T getEventData() {
return eventData;
}
}
@Service
public class EventPublisherService {
private final ApplicationEventPublisher eventPublisher;
public EventPublisherService(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public <T> void publishGenericEvent(T eventData) {
GenericEvent<T> genericEvent = new GenericEvent<>(this, eventData);
eventPublisher.publishEvent(genericEvent);
}
}
@Component
public class GenericEventListener {
@EventListener
public <T> void handleGenericEvent(GenericEvent<T> event) {
T eventData = event.getEventData();
System.out.println("Received a generic event with data: " + eventData);
}
}
@Component
public class MyErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.info("handle error -> {}", t.getClass());
}
}
@Service
public class EventListenerService {
@Autowired
private SimpleApplicationEventMulticaster simpleApplicationEventMulticaster;
@Autowired
private MyErrorHandler errorHandler;
@PostConstruct
public void init(){
simpleApplicationEventMulticaster.setErrorHandler(errorHandler);
}
}
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
👋 привет, я Lorin Лорейн, один Java Разработчик бэкэнд-технологий!девиз:Technology has the power to make the world a better place.
🚀 Моя страсть к технологиям — это моя мотивация продолжать учиться и делиться ими. Мой блог — это место об экосистеме Java, серверной разработке и последних технологических тенденциях.
🧠 как Java Будучи энтузиастом серверных технологий, я не только увлечен изучением новых возможностей языков и глубины технологий, но и страстно желаю поделиться своими идеями и знаниями. практика. Я верю, что обмен знаниями и сотрудничество с сообществом могут помочь нам расти вместе.
💡 В моем блоге вы найдете подробные статьи об основных концепциях Java, базовой технологии JVM, часто используемых платформах, таких как Spring и Mybatis, управлении базами данных, таких как MySQL, промежуточном программном обеспечении для обработки сообщений, таком как RabbitMQ и Rocketmq, оптимизации производительности и т. д. Я также поделюсь некоторыми советами по программированию и методами решения проблем, которые помогут вам лучше освоить программирование на Java.
🌐 Я поощряю взаимодействие и создание сообщества, поэтому, пожалуйста, оставляйте свои вопросы, предложения или запросы по темам и дайте мне знать, что вас интересует. Кроме того, я буду делиться последними новостями Интернета и технологий, чтобы вы всегда были в курсе последних событий в мире технологий. Я с нетерпением жду возможности вместе с вами двигаться вперед по пути технологий и исследовать безграничные возможности мира технологий.
📖 Следите за обновлениями моего блога и давайте вместе стремиться к техническому совершенству.
ЯсуществоватьучаствоватьНа третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 года будет проводиться конкурс сочинений. Соберите команду, чтобы выиграть приз!