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());
    }
相关文章
|
1月前
|
Java
Java并发编程中的锁机制
【2月更文挑战第22天】 在Java并发编程中,锁机制是一种重要的同步手段,用于保证多个线程在访问共享资源时的安全性。本文将介绍Java锁机制的基本概念、种类以及使用方法,帮助读者深入理解并发编程中的锁机制。
|
1月前
|
Java 程序员
Java中的异常处理机制
【2月更文挑战第22天】在Java编程中,异常处理是一个重要的概念。它允许程序员在程序执行过程中遇到错误时,对错误进行处理,而不是让程序崩溃。本文将介绍Java中的异常处理机制,包括异常的分类、如何捕获和处理异常以及自定义异常等内容。
17 1
|
1月前
|
存储 Java 数据库
|
1月前
|
Java
深入了解Java中的锁机制
深入了解Java中的锁机制
|
1月前
|
Java 程序员 编译器
认识Java 的反射机制
反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。
27 5
|
25天前
|
开发框架 Java API
java反射机制的原理与简单使用
java反射机制的原理与简单使用
17 1
|
13天前
|
安全 Java 调度
深入理解Java中的线程安全与锁机制
【4月更文挑战第6天】 在并发编程领域,Java语言提供了强大的线程支持和同步机制来确保多线程环境下的数据一致性和线程安全性。本文将深入探讨Java中线程安全的概念、常见的线程安全问题以及如何使用不同的锁机制来解决这些问题。我们将从基本的synchronized关键字开始,到显式锁(如ReentrantLock),再到读写锁(ReadWriteLock)的讨论,并结合实例代码来展示它们在实际开发中的应用。通过本文,读者不仅能够理解线程安全的重要性,还能掌握如何有效地在Java中应用各种锁机制以保障程序的稳定运行。
|
18天前
|
Java 程序员 开发者
深入理解Java异常处理机制
在Java编程中,异常处理是确保程序健壮性与稳定性的重要组成部分。本文旨在深度剖析Java异常处理机制的核心概念、结构及其实际应用策略,帮助开发者更好地理解并运用异常处理来优化程序设计。我们将从Java异常体系结构入手,探讨try-catch-finally语句块的执行流程,分析自定义异常的必要性与实现方式,并通过实例演示如何有效地管理和处理异常情况。
23 3
|
25天前
|
设计模式 XML 存储
java中的反射机制
java中的反射机制
12 1
|
1月前
|
Java