@TransactionalEventListener商品同步MQ 实战

TransactionalEventListener 实战场景

创建一个 EventEntity 用于event-listener 之间传输对象

@Data
public class EventEntity extends ApplicationEvent {

    private static final long serialVersionUID = -6206752641309458207L;

    private String id;

    private String tag;

    public EventEntity (Object source, String tag, String id) {
        super(source);
        this.tag = tag;
        this.id = id;
    }
}

定义个枚举 区分 不同的事件类别

public enum GoodsTagsEnum {

    /**
     * "生成商品索引"
     */
    GENERATOR_GOODS_INDEX("生成商品索引"),
    /**
     * "生成店铺商品索引"
     */
    GENERATOR_STORE_GOODS_INDEX("生成店铺商品索引"),
    /**
     * "更新商品索引"
     */
    UPDATE_GOODS_INDEX("更新商品索引"),
    /**
     * "更新商品索引促销信息"
     */
    UPDATE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"),
    /**
     * "更新商品索引促销信息"
     */
    DELETE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"),

    /**
     * "更新商品索引部分字段"
     */
    UPDATE_GOODS_INDEX_FIELD("更新商品索引部分字段"),
    /**
     * "重置商品索引"
     */
    RESET_GOODS_INDEX("重置商品索引"),
    /**
     * "删除店铺商品索引"
     */
    STORE_GOODS_DELETE("删除店铺商品索引"),
    /**
     * "删除商品"
     */
    GOODS_DELETE("删除商品"),
    /**
     * "审核商品"
     */
    GOODS_AUDIT("审核商品"),
    /**
     * "收藏商品"
     */
    GOODS_COLLECTION("收藏商品"),
    /**
     * "购买商品完成"
     */
    BUY_GOODS_COMPLETE("购买商品完成"),
    /**
     * "删除商品SKU"
     */
    SKU_DELETE("删除商品SKU"),
    /**
     * "查看商品"
     */
    VIEW_GOODS("查看商品"),
    /**
     * "商品评价"
     */
    GOODS_COMMENT_COMPLETE("商品评价");

    private final String description;

    GoodsTagsEnum(String description) {
        this.description = description;
    }

    public String description() {
        return description;
    }


}

创建一个事件发布者

@Service
public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements GoodsSkuService {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;
    /**
     * 更新商品sku状态根据店铺id
     *
     * @param storeId      店铺id
     * @param marketEnable 市场启用状态
     * @param authFlag     审核状态
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateGoodsSkuStatusByStoreId(String storeId, String marketEnable, String authFlag) {
        LambdaUpdateWrapper<GoodsSku> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(GoodsSku::getStoreId, storeId);
        updateWrapper.set(CharSequenceUtil.isNotEmpty(marketEnable), GoodsSku::getMarketEnable, marketEnable);
        updateWrapper.set(CharSequenceUtil.isNotEmpty(authFlag), GoodsSku::getAuthFlag, authFlag);
        boolean update = this.update(updateWrapper);
        if (Boolean.TRUE.equals(update)) {
            if (GoodsStatusEnum.UPPER.name().equals(marketEnable)) {
                applicationEventPublisher.publishEvent(new EventEntity ("生成店铺商品", GoodsTagsEnum.GENERATOR_STORE_GOODS_INDEX.name(), storeId));
            } else if (GoodsStatusEnum.DOWN.name().equals(marketEnable)) {
                cache.vagueDel(CachePrefix.GOODS_SKU.getPrefix());
                applicationEventPublisher.publishEvent(new EventEntity ("删除店铺商品", GoodsTagsEnum.STORE_GOODS_DELETE.name(), storeId));
            }
        }
    }
    /**
     * 发送生成ES商品索引
     *
     * @param goods 商品信息
     */
    @Override
    public void generateEs(Goods goods) {
        // 不生成没有审核通过且没有上架的商品
        if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) {
            return;
        }
        applicationEventPublisher.publishEvent(new EventEntity ("生成商品", GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId()));
    }

定义 @TransactionalEventListener 来监听事件

@Component
public class GeneratorEsGoodsIndexListener {

    /**
     * rocketMq
     */
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    /**
     * rocketMq配置
     */
    @Autowired
    private RocketmqCustomProperties rocketmqCustomProperties;

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void generatorEsGoodsIndex(EventEntity esGoodsIndexEvent) {
        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + esGoodsIndexEvent.getTag();
        //发送mq消息
        rocketMQTemplate.asyncSend(destination, esGoodsIndexEvent.getId(), RocketmqSendCallbackBuilder.commonCallback());
    }

}

总结

  1. 先定义传输模型 以及 type
  2. 新增或者更改 商品 成功后 发布 Event 事件
  3. 在@TransactionalEventListener 中接收事件回调
  4. 最后发送mq 到远程消费 ,例如商品信息发送mq 后洗到Elastichsearch
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值