spring boot 事件机制,多监听处理

需求背景:

在对接第三方系统(例OA),不同业务表单,在OA最终审批完成后,需要不同的业务实现类,实现OA审批通过或驳回后的业务逻辑。

方案:由于OA回调的接口统一,只需要返回OA单号+OA审批状态+业务类型编码,所以使用Spring内部广播通知机制实现,具体业务通过监听机,监听对应的业务类型,实现OA最终状态后的业务逻辑处理。

第一步:创建OaEvent

/**
 * oa表单回调事件
 */
@Getter
@Setter
public class OaEvent extends ApplicationEvent {
    /**oa单号*/
    private String oaNum;
    /**1-审批通过,-1-审批驳回*/
    private Integer status;
    
    /**
     * @param source 业务类型唯一标识
     * @param oaNum oa单号
     * @param status 审批状态
     */
    public OaEvent(Object source, String oaNum, Integer status) {
        super(source);
        this.oaNum = oaNum;
        this.status = status;
    }
}

第二步:发送OA审批状态回调事件

OaEvent event = new OaEvent("oa.sys.from.add", "123456", 1);
publisher.publishEvent(event);

第三步:创建监听,接收OaEvent事件,备注:@EventListener(classes = {OaEvent.class}, condition = "#root.event.source == 'oa.sys.from.add'") // classes-监听指定的实现ApplicationEvent.class的事件类,condition-通过条件填写

@Async //spring 事件机制默认为同步,只有加上@Async,监听才是异步执行
@EventListener(classes = {OaEvent.class}, condition = "#root.event.source == 'oa.sys.from.add'") // classes-监听指定的实现ApplicationEvent.class的事件类,condition-通过条件填写
protected void listenOaEvent(OaEvent event) {
   //处理对应的业务逻辑
   System.out.println(JSON.toJSONString(event));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 中使用 Redis 监听删除事件,可以结合使用 RedisTemplate 和 Spring Data Redis 提供的监听器(EventListener),具体实现步骤如下: 1. 创建一个 RedisTemplate 对象,用于操作 Redis 数据库: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` 2. 创建一个 RedisKeyExpirationListener 类,实现 RedisKeyExpiredEvent 事件处理方法: ```java @Component public class RedisKeyExpirationListener implements ApplicationListener<RedisKeyExpiredEvent> { @Override public void onApplicationEvent(RedisKeyExpiredEvent event) { String key = event.getSource().toString(); System.out.println("Key expired: " + key); } } ``` 3. 在 RedisTemplate 对象上注册监听器: ```java @Configuration public class RedisConfig { @Autowired private RedisKeyExpirationListener redisKeyExpirationListener; @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); // 注册监听器 template.setEnableTransactionSupport(true); template.getConnectionFactory().getConnection().subscribe(new MessageListenerAdapter(redisKeyExpirationListener)); return template; } } ``` 在这个例子中,我们使用 RedisKeyExpiredEvent 事件监听 Redis 中的键过期事件。当 Redis 中的键过期时,会触发 RedisKeyExpiredEvent 事件事件源是被删除的键名。在 RedisKeyExpirationListener 中,我们实现 onApplicationEvent 方法,打印出被删除的键名。 在 RedisTemplate 注册监听器的过程中,我们使用了 MessageListenerAdapter 类将 RedisKeyExpirationListener 转化为 MessageListener 对象,然后订阅 Redis 的键事件频道。当 Redis 中有键事件发生时,MessageListenerAdapter 会将事件转发给 RedisKeyExpirationListener 处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值