Spring Event实现发布/订阅模式

Spring Event对发布/订阅模式进行了封装,使用起来更加简单,看看怎么来实现吧

自定义事件

  • MessageSubjectEvent:继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。
/**
 * <p>
 *   消息通知生产者
 * </p>
 * @author king
 * @since 2023-03-21
 **/
@Slf4j
public class MessageProducerEvent extends ApplicationEvent {
    
    public MessageProducerEvent(Message source) {
        super(source);
    }
}
  • Message:事件消息,定义了事件的消息体。
public class Message implements Serializable {
    // 属性...

    // 方法...    

}

事件监听者

事件监听者,有两种实现方式,一种是实现ApplicationListener接口,另一种是使用@EventListener注解。

实现ApplicationListener接口

实现ApplicationListener接口,重写onApplicationEvent方法,将类定义为Bean,这样,一个监听者就完成了。

  • MessageProducerEvent 
/**
 * <p>
 *   消息处理生成者
 * </p>
 *
 * @author king
 * @since 2023-03-22
 **/
@Slf4j
@Component
public class MessageHandlerProducer implements ApplicationListener<MessageProducerEvent> {

    @Override
    public void onApplicationEvent(@NonNull MessageProducerEvent event) {
        System.out.println("event.getSource() = " + event.getSource());
        System.out.println("event.getTimestamp() = " + event.getTimestamp());
        log.info("[afterMessageProducer]...");
    }
}

使用@EventListener注解

使用@EventListener注解就更简单了,直接在方法上,加上@EventListener注解就行了。

/**
 * <p>
 *   消息处理生成者
 * </p>
 *
 * @author king
 * @since 2023-03-22
 **/
@Slf4j
@Component
public class MessageHandlerProducer {
    
    @EventListener(value = MessageProducerEvent.class)
    public void onApplicationEvent(@NonNull MessageProducerEvent event) {
        System.out.println("event.getSource() = " + event.getSource());
        System.out.println("event.getTimestamp() = " + event.getTimestamp());
        log.info("[afterMessageProducer]...");
    }
}

测试

最后测试一下吧

/**
 * 发布订阅 test
 *
 * @author king
 * @since 2023-03-22
 **/
@SpringBootTest
public class PubsubTest {

    @Autowired
    private ApplicationEventPublisher publisher;

    Message message = Message.builder()
            .key("123")
            .msgId(11111)
            .build();

    @Test
    void testProducer(){
        System.out.println("执行业务代码...");
        publisher.publishEvent(new MessageProducerEvent(message));
    }
}
  • 执行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值