`
hbxflihua
  • 浏览: 676171 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用spring-retry实现支付系统异步通知

阅读更多

支付系统异步通知承接上文:DelayQueue实现支付系统异步通知 

本篇介绍通过spring-retry来实现支付系统异步通知功能。

 

1、添加所需的jar

<dependency>
	<groupId>org.springframework.retry</groupId>
	<artifactId>spring-retry</artifactId>
	<version>1.1.2.RELEASE</version>
</dependency>

 2、实现任务重试服务

package com.huatech.service;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.RetryException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import com.huatech.common.delay.RetMessage;
import com.huatech.common.util.HttpsUtil;
/**
 * 任务重试服务
 * 
 * 	第一次成功则不再重试;
 * 	第一次失败,10分钟后重试第二次;
 * 	第二次失败,20分钟后重试第三次;
 * 	第三次失败,40分钟后重试第四次;
 * 	第四次失败,60分钟后重试第五次;
 * @author lh
 *
 */
//@Configuration
@EnableRetry
@Service
public class TaskRetryService {
	
	
	private static final Logger LOGGER = LoggerFactory.getLogger(TaskRetryService.class);
	
	//返回结果
	private static final String RES_SUCCESS = "success";
	//时间单位:10min
	private static final long TIME_UNIT = 1000 * 60 * 10;
	//重试次数
	private static final int MAX_ATTEMPTS = 5;
	
	 @Retryable(value = {RetryException.class, RuntimeException.class},
	            maxAttempts = MAX_ATTEMPTS,
	            backoff = @Backoff(delay = TIME_UNIT, maxDelay=TIME_UNIT * 6, multiplier= 2 ))
	public void notice(RetMessage msg){
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("reqData", msg.getReqData());
		String httpResult = null;
		try {
			httpResult = HttpsUtil.getInstance().doPostRetString(msg.getUrl(), null, paramMap);
			LOGGER.info("第{}次异步回调,返回结果{},返回参数:{},响应结果:{}", msg.getTimes(), httpResult,
					paramMap.get("reqData"), RES_SUCCESS.equals(httpResult));
			if (!RES_SUCCESS.equals(httpResult)) {
				msg.setTimes(msg.getTimes() + 1);
				msg.setSuccess(false);
				throw new RetryException("retry failed");
			}else{
				msg.setSuccess(true);
			}
		} catch (URISyntaxException | IOException e) {
		}		
	}

}

 

分享到:
评论
2 楼 hbxflihua 2019-01-19  
ivi13 写道
这种方式会有个问题,假如有个商户的交易量特别大,通知全部失败,一段时间内线程数会猛增,会导致系统问题吧

这个问题提的好。通知全部失败还不是最坏的,回调接口地址失效完全可以在方法调用前做一层校验。另外,通知类操作可以独立出一个服务来,即使线程数暴增,也不会影响到其他的业务。最坏的情况其实是回调接口大量失败,这种你做前置校验的意义已经不大了。
1 楼 ivi13 2018-11-20  
这种方式会有个问题,假如有个商户的交易量特别大,通知全部失败,一段时间内线程数会猛增,会导致系统问题吧

相关推荐

    spring-amqp,spring-retry,spring-rabbit

    标题中的"spring-amqp"、"spring-retry"和"spring-rabbit"是Spring框架的三个关键组件,它们主要用于构建高效、可靠的分布式系统,尤其是在消息传递和错误处理方面。 1. **Spring AMQP**: Spring AMQP是Spring框架...

    Spring-retry 1.1.4重试功能.rar

    本文将详细阐述Spring-retry 1.1.4的重试功能及其核心概念、配置和使用方法。 一、核心概念 1. **RetryTemplate**:这是Spring-retry的核心类,用于定义和执行重试逻辑。通过这个模板,我们可以设置重试策略、回退...

    spring-retry-example:Spring重试和番石榴重试演示

    目前有两个开源的类库spring retry and guava retry都支持编程式,spring retry更加融合spring的aop注解驱动,使用更加的方便。模拟异常场景为了实现demo,模拟了异常的场景异常调用...

    smart-retry:Smart Retry主要是用来进行任务重试的。和Guava Retry、Spring Retry相比,Smart Retry最大的特点是异步重试,支持持久化,系统重启之后可以继续重试

    和Guava Retry、Spring Retry相比,Smart Retry最大的特点是异步重试,支持持久化,系统重启之后可以继续重试。背景在微服务环境下,会根据不同的业务将拆分成不同的服务,比如会员服务、订单服务、商品服务等等,每...

    rabbitmq 所需jar包

    RabbitMQ是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,被广泛用于分布式系统中的异步任务处理、解耦和扩展性提升。在这个主题中,我们将深入探讨与Java开发相关的...

    spring整合rabbitmq需要的jar包(spring版本4.2.0)

    Spring Retry提供了一种声明式的方式来重试这些操作,增加了系统的健壮性。 整合Spring与RabbitMQ的步骤通常包括以下部分: 1. **配置连接**:首先,我们需要在Spring的配置文件中设置RabbitMQ的相关属性,如...

    RabbitMQ-3.4.1安装文件+Spring-rabbit+RabbitMQ-3.4.1安装手册

    使用Spring-rabbit,开发者可以轻松地在Spring应用中发送和接收消息,实现消息驱动的架构。它包括了模板(Template)用于发送消息,以及监听器容器(Listener Container)来处理接收的消息。此外,Spring-rabbit还...

    springboot-rabbitmq-retry-queues:该存储库对该博客文章https中引入的RabbitMQ的非阻塞重试队列解决方案进行了概括

    本存储库`springboot-rabbitmq-retry-queues`主要关注的是如何在Spring Boot应用中实现RabbitMQ的非阻塞重试队列解决方案,这是一个针对处理消息处理失败时的策略,可以避免因单个任务失败而导致整个系统的阻塞。...

    spring-boot集成RabbitMQ

    将 Spring Boot 与 RabbitMQ 结合,可以有效地实现异步处理、解耦系统组件,提高系统的可扩展性和可靠性。 1. **配置 RabbitMQ** 在 Spring Boot 项目中集成 RabbitMQ 首先需要在 `application.properties` 或 `...

    spring-boot-ignite:展示如何将apache ignite与spring boot集成,以及使用持久性内存功能和sql查询来覆盖内存缓存中的ign的案例

    展示如何将apache ignite与spring boot集成在一起,以及使用持久性内存功能和sql查询来覆盖内存缓存中的ign的案例 将Spring Boot与Apache Ignite集成 如何启用和使用Apache Ignite的持久性持久内存功能,该功能可以...

    spring-amqp:春天

    - **Retry机制**:通过配置RabbitTemplate,可以实现消息的重试策略,提高系统稳定性。 - **Transactions and Acknowledgments**:Spring AMQP支持事务和手动确认模式,确保消息的可靠传输。 4. **实战应用** - ...

    Spring Batch in Action英文pdf版

    通过使用Spring Integration,开发者可以将批处理作业与消息队列、服务调用等集成,从而实现作业与其他系统的交互。 知识点十:监控和测试 为了能够监控和调试批处理作业,Spring Batch提供了丰富的日志记录和监控...

    spring batch

    - **实时处理与异步处理**:虽然不是主要设计目的,但在某些场景下也可以实现类似的功能。 ##### 1.3 架构概览 Spring Batch 的核心架构包括以下几个组件: - **Job**:定义了批处理任务的整体逻辑。 - **Step**...

    rabbit 使用1.docx

    ### Spring Boot 集成 RabbitMQ 实践指南 #### 一、RabbitMQ 环境搭建 在深入了解 Spring Boot 如何与 RabbitMQ 集成...通过这些配置,开发者可以轻松地实现异步处理、任务分发等功能,提高系统的整体性能和稳定性。

    springboot整合stream使用rabbitmq作为消息中间件

    当我们谈论"SpringBoot整合stream使用rabbitmq作为消息中间件"时,我们涉及的关键技术点主要包括Spring Boot的Stream模块、RabbitMQ的使用以及它们如何协同工作来实现高效的微服务通信。 Spring Boot Stream模块是...

    2019java面试宝典.rar

    - 服务容错:Failsafe、Failsfast、Fallback、Retry、Mock等策略,帮助系统应对服务失败。 3. Spring全家桶: - Spring Framework:核心容器,提供了依赖注入(DI)和面向切面编程(AOP)。 - Spring MVC:用于...

    Spring Boot整合RabbitMQ开发实战详解

    在使用 RabbitMQ 时,需要注意的一点是,消息的发送和接收是异步的,需要异步处理消息。另外,RabbitMQ 也提供了很多高级特性,如消息确认、消息 retry 等,可以根据需要选择使用。 Spring Boot 整合 RabbitMQ 可以...

    1000道 互联网Java工程师面试题 485页_PDF密码解除.pdf

    - **与Spring集成良好:**MyBatis可以轻松地与Spring框架集成,实现事务管理等功能。 **3. MyBatis框架的缺点:** - **SQL管理分散:**MyBatis的SQL语句是放在XML映射文件中的,这可能导致SQL管理和维护变得复杂。...

    基于dubbo的服务方完整项目示例

    - 在服务提供者的Spring配置文件(如`beans.xml`)中,使用`&lt;dubbo:service&gt;`标签定义服务,指定接口、实现类以及其它属性,如版本、协议、分组等。 5. **注册中心配置** - Dubbo支持多种注册中心,如Zookeeper、...

    dubbo-demo.tar.gz

    5. **异常处理和熔断机制**:理解Dubbo的容错机制,如Failsafe、Fallback、Retry等,以及如何在服务之间实现Hystrix或Sentinel的熔断保护。 6. **服务监控**:学习如何使用Dubbo自带的监控中心,或者集成其他监控...

Global site tag (gtag.js) - Google Analytics