0


内外网短信状态接收超时通知的常用的解决方案

怎样做技术选型

•不要特立独行,优先使用公司约定技术栈,统一组件!

•使用成熟的技术!

•使用成熟技术的成熟功能!

•使用团队熟悉技术栈中间件!

•考虑后期数据量用户量

•考虑后期运维难度(结合公司实施人员运维水平)

常用的解决方案


方案1


可以利用redis自带的key自动过期机制,短信推送时将id写入redis,过期时间30分钟,30分钟后检查短信状态,如果未收到短信发送状态,则进行处理。(内网短信平台选用次方案)

@Bean
    public RedisMessageListenerContainer getListenerContainer(RedisConnectionFactory connectionFactory){
        //创建连接容器
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        //放入redis连接
        container.setConnectionFactory(connectionFactory);
        //写入需要被监听的类型,即超时监听

        Topic topic = new PatternTopic("__keyevent@0__:expired");
        container.addMessageListener(getTopicListener(phoneMsgService), topic);
        return container;
    }
@Override
    public void onMessage(Message message, byte[] bytes) {
        byte[] body = message.getBody();
        String keyName = new String(body);
        log.info(keyName);
        //超时还未收到短信发送状态的短信再次添加到队列,进行业务处理
        if (keyName.startsWith(MSG_SEND_KEY)){
            String pc = keyName.substring(MSG_SEND_KEY.length());
            phoneMsgService.drainMessagePushReadyQueue(pc);
        }
    }

•方案2

•使用quartz定时任务,短信推送后,生成一个30分钟后运行的任务,30分钟后检查短信状态,如果未收到短信发送状态,则进行处理。

•方案3

•基于MQ延时队列(使用了rabbitmq的延时队列,需要安装延时插件)

•方案4

•按时间间隔例如每分钟轮询数据库,如果超时则进行处理,效率差!时间精准度底!数据库压力大,不建议使用。


本文转载自: https://blog.csdn.net/qq_63033995/article/details/124191480
版权归原作者 wuhan_xiaoniu 所有, 如有侵权,请联系我们删除。

“内外网短信状态接收超时通知的常用的解决方案”的评论:

还没有评论