پرش به محتویات

Application Events

مقدمه

یکی از قابلیت های درونی کتابخانه Spring امکان ارسال event های داخلی است که بتوان یک یا چند subscriber روی آن تعریف کرد.

با اینکار میتوان بدون تغییر قسمت زیادی از کد روی یک مرحله خاصی از کار که یک Event رخ میدهد کد جدید اضافه کرد و به انجام کاری پرداخت.

توضیح مثال

در این مثال یک event به هنگام یک restcall اتفاق میافتد و دو subscriber روی این event رجیستر کرده اند

event

هر event باید بچه ی AbstractEvent باشند

@Getter
public class EventA extends ApplicationEvent {

    private final String message;

    @Builder
    public EventA(Object source, String message) {
        super(source);
        this.message = message;
    }

}

publish an event

زمانی که نیاز به انتشار یک Event داشته باشیم میتوانیم از ‍‍‍‍ApplicationEventPublisher استفاده کنیم که این bean در context موجود است

به عنوان مثال در اینجا یک Event از نوع EventA به هنگام یک RestCall انتشار می یابد

@Slf4j
@RestController
@RequestMapping("/A")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ServiceA {


    private final ApplicationEventPublisher eventPublisher;


    @GetMapping
    public void startAEvent() {

        log.info("before publish event A");

        EventA event = EventA.builder()
            .source(this)
            .message("event a")
            .build();

        eventPublisher.publishEvent(event);

        log.info("after publish event A");
    }

}

subscribe to event

هنگامی که نیاز داشته باشیم به یک Event انتشار یافته گوش دهیم باید ApplicationListener را پیاده سازی کنیم

به عنوان مثال این کد به Event های انتشار یافته از نوع EventA گوش میکند

@Slf4j
@Component
public class EventASubscriber implements ApplicationListener<EventA> {

    @Override
    public void onApplicationEvent(EventA event) {
        log.info("received new event {} from {} at {}",
             event.getMessage(), event.getSource(), event.getTimestamp());
    }

}

تقدم و تاخر subscriber ها

برای اینکه بتوانیم بگوییم یک subscriber زود تر از دیگری روی یک event اجرا شود میتوانیم از @Order استفاده کنیم که هر چه مقدار درونش کمتر باشد subscriber زود تر اجرا میشود

نکات

  • لازم به ذکر است که subscriber ها با thread فعلی اجزا میشنود یعنی thread انتشار دهنده event هنگام انتشار block میشود و subscriber ها اجزا میشوند

application logs