Java报告推送失败补偿机制;钉钉群通知消息核心代码

简介: Java报告推送失败补偿机制,超过次数后使用钉钉通知开发自动补偿实现:要求方法调用的过程中,失败的时候,系统有办法进行自动重试,重试达到一定次数后,钉钉通知开发。实现设计:注解,反射,定时任务

Java报告推送失败补偿机制,超过次数后使用钉钉通知开发

自动补偿实现:

要求方法调用的过程中,失败的时候,系统有办法进行自动重试,重试达到一定次数后,钉钉通知开发。

实现设计:注解,反射,定时任务

自动一般涉及到定时任务。

钉钉群通知消息核心代码

钉钉群通知消息核心代码

application-local.yml

自动一般涉及到定时任务。
钉钉群通知消息核心代码
钉钉群通知消息核心代码
在这里插入图片描述
application-local.yml
messa

钉钉订单监听消息

@Slf4j
@Component
@SuppressWarnings("PMD")
public class DingOrderDistributeMessageListener implements MessageListener {
    @Autowired
    private MessageConfig messageConfig;
    @Override
    public Action consume(Message message, ConsumeContext consumeContext) {
        try {
            boolean notifyOpen = messageConfig.getNotifyDistributeOpen();
            if (!notifyOpen) {
                log.info("订单分配通知开关已关闭/未配置 messageOpen:{}", notifyOpen);
                return Action.CommitMessage;
            }
            // 订单钉钉通知群url
            String dingWebHookUrl = messageConfig.getDingDistributeUrl();
            // 密钥
            String orderSecret = messageConfig.getDingDistributeSecret();
            // 钉钉消息体
            String messageBody = messageConfig.getDingDistributeMessageBody();
            if (StringUtils.isEmpty(messageBody) || StringUtils.isEmpty(dingWebHookUrl)
                    || StringUtils.isEmpty(orderSecret)) {
                log.info("发送订单分配钉钉消息, 消息配置项未配置");
                return Action.CommitMessage;
            }
            // 请求体
            String requestBody = new String(message.getBody(), StandardCharsets.UTF_8);
            // 报告消息体
            DingOrderDistributeMessage orderMessage = JSONObject.parseObject(requestBody,
                    DingOrderDistributeMessage.class);
            // 请求消息
            String sendMessage = String.format(messageBody, "\n", orderMessage.getCode() + "\n",
                    orderMessage.getDeviceType() + "\n", orderMessage.getAppVersion() + "\n",
                    orderMessage.getGoodsName() + "\n", orderMessage.getPayAmount() + "\n",
                    orderMessage.getPayType() + "\n", orderMessage.getPlaceTime() + "\n",
                    orderMessage.getDistributeTime() + "\n", orderMessage.getAdminUserName());
            List<String> mobileList = new ArrayList<>();
            if (StringUtils.isNotEmpty(orderMessage.getAdminUserPhone())) {
                mobileList.add(orderMessage.getAdminUserPhone());
            }
            String dingMessage = DingMessageUtil.generateMessageBody(sendMessage, false, mobileList);
            // 发送钉钉消息
            DingMessageUtil.sendMessage(orderSecret, dingMessage, dingWebHookUrl);
            return Action.CommitMessage;
        } catch (Exception e) {
            log.error("发送报告钉钉消息出现异常:{}", e);
            return Action.ReconsumeLater;
        }
    }
}

MessageConfig 是个实体类

@ConfigurationProperties(prefix = "message.config")
@Component
@Data
public class MessageConfig {
    @ApiModelProperty("钉钉报告机密钥")
    private String dingReportSecret;
    @ApiModelProperty("钉钉报告地址")
    private String dingReportUrl;
    @ApiModelProperty("钉钉报告密钥")
    private String dingOrderSecret;
    @ApiModelProperty("钉钉订单消息图片地址")
    private String dingOrderPicUrl;
    @ApiModelProperty("钉钉订单消息头部")
    private String dingOrderTitle;
    @ApiModelProperty("订单钉钉报告地址")
    private String dingOrderUrl;
    @ApiModelProperty("订单路由地址")
    private String orderRouteUrl;
    @ApiModelProperty("钉钉订单消息体")
    private String dingOrderMessageBody;
    @ApiModelProperty("钉钉报告消息体")
    private String dingReportMessageBody;
    @ApiModelProperty("消息开关")
    private Boolean notifyOpen;
    @ApiModelProperty("钉钉日报")
    private String dingDailyReportMessageBody;
    @ApiModelProperty("订单分配通知开关")
    private Boolean notifyDistributeOpen;
    @ApiModelProperty("分配订单通知密钥")
    private String dingDistributeSecret;
    @ApiModelProperty("分配通知地址")
    private String dingDistributeUrl;
    @ApiModelProperty("订单分配消息主体")
    private String dingDistributeMessageBody;
}

微服务实际去调用这钉钉消息

    public void sendOrderDistributeMessage(Order order, String adminUserName, String adminUserPhone,
                                           Date distributeTime) {
        log.info("发送订单分配钉钉消息 order:{}, adminUserName:{}, adminUserPhone:{}, distributeTime:{}", order,
                adminUserName, adminUserPhone, distributeTime);
        // 适配部分下单在支付通知才回填支付方式
        Order dbOrder = orderService.getByOrderNo(order.getOrderNo());
        OrderItemGoods goods = orderService.getOrderItemGoodsByOrderNo(order.getOrderNo());
        DingOrderDistributeMessage orderMessage = new DingOrderDistributeMessage();
        orderMessage.setGoodsName(goods.getGoodsName());
        String suffix = "元";
        String payType = dbOrder.getPayTypeChannel().getName();
        PayTypeChannel payTypeChannel = dbOrder.getPayTypeChannel();
        switch (payTypeChannel) {
            case APPLE_IN:
                payType = "苹果支付";
                break;
            case WX_MWEB:
            case WX_APP:
            case WX_JSAPI:
            case WX_MICROPAY:
            case WX_NATIVE:
                payType = "微信";
                break;
            case SSCM:
                suffix = "上上贝";
                payType = "上上贝";
                break;
            case ALIPAY_PC:
            case ALIPAY_QR:
            case ALIPAY_WAP:
            case ALIPAY_MOBILE:
                payType = "支付宝";
                break;
            default:
                break;
        }
        orderMessage.setPayType(payType);
        orderMessage.setPayAmount(AmountUtils.changeFen2Yuan(order.getPayAmount()) + suffix);
        orderMessage.setPlaceTime(DateUtils.formatYYYYMMDDHHMMSS(order.getPlaceTime()));
        User user = userRemoteService.getById(order.getPlaceUserId()).getData();
        orderMessage.setUserName(user.getUsername());
        orderMessage.setCode(user.getCode());
        orderMessage.setOrderNo(order.getOrderNo());
        List<UserChannel> userChannelList = userRemoteService.getUserChannelList().getData();
        Map<String, String> userChannelMap = userChannelList.stream()
                .collect(Collectors.toMap(UserChannel::getChannelCode, UserChannel::getChannelName));
        orderMessage.setDeviceType(userChannelMap.get(user.getChannelCode()));
        orderMessage.setAppVersion(user.getVersionName());
        orderMessage.setDistributeTime(DateUtils.formatYYYYMMDDHHMMSS(distributeTime));
        orderMessage.setAdminUserName(adminUserName);
        orderMessage.setAdminUserPhone(adminUserPhone);
        mqSend.sendDingOrderDistributeMessage(orderMessage);
    }
    /**
     *  发送钉钉订单分配消息
     * @param orderMessage
     */
    void sendDingOrderDistributeMessage(DingOrderDistributeMessage orderMessage);
    @Override
    public void sendDingOrderDistributeMessage(DingOrderDistributeMessage orderMessage) {
        String message = JSON.toJSONString(orderMessage);
        LOGGER.info("sendPayOrderMessage take success send message to mq message = {}", message);
        producerUtil.sendAsyncMsg(orderConfig.getOrderTopic(), orderConfig.getOrderTopicDistributeDingTag(),
                message, orderMessage.getOrderNo());
    }
相关文章
|
7天前
|
搜索推荐 Java 索引
|
1天前
|
数据可视化 Java
使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】
这篇文章介绍了使用Java语言和Swing框架实现的扫雷小游戏的详细代码和实现过程。
使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】
|
1天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
|
3天前
|
Java 开发者
Java中的Lambda表达式:简化你的代码之旅
【8月更文挑战第17天】 在编程的海洋中,简洁是航行的风帆。Lambda表达式,作为Java 8的一大亮点,为开发者提供了一种更为紧凑、易读的编码方式。本篇文章将带你领略Lambda表达式的魅力,从基础概念到实际应用,让你的代码像诗句一样流畅。
13 4
|
1天前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。
|
1天前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
1天前
|
Java 开发者
在Java编程的广阔天地中,if-else与switch语句犹如两位老练的舵手,引领着代码的流向,决定着程序的走向。
在Java编程中,if-else与switch语句是条件判断的两大利器。本文通过丰富的示例,深入浅出地解析两者的特点与应用场景。if-else适用于逻辑复杂的判断,而switch则在处理固定选项或多分支选择时更为高效。从逻辑复杂度、可读性到性能考量,我们将帮助你掌握何时选用哪种语句,让你在编程时更加得心应手。无论面对何种挑战,都能找到最适合的解决方案。
5 1
|
7天前
|
搜索推荐 Java
|
3天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
6天前
|
Java 程序员 编译器
深入浅出Java异常处理机制
在Java编程的世界中,异常处理就像是我们生活中的急救包,它帮助我们处理程序运行时出现的意外情况。本文将带你了解Java异常处理的基础知识,探索异常类型,学习如何捕获和处理它们,并讨论最佳实践。让我们一起走进Java异常处理的世界,学会如何使用这个强大的工具来保护我们的程序。