//by yan 20220629

1、配置文件设置超时时间

//application.properties
######  feign config
#全局默认设置
feign.client.config.default.connectTimeout=20000
feign.client.config.default.readTimeout=20000
#按微服务应用名称设置
feign.client.config.contract.connectTimeout=80000
feign.client.config.contract.readTimeout=80000

2、代码对整个接口类单独配置超时时间


@FeignClient(name = "xx", path = "xx",configuration = {FeignLogConfiguration.class, FeignTimeoutConfig.class})
public interface FeignXXXService {

}
@Configuration
public class FeignTimeoutConfig {

    /**
     *
     * @Author Yan
     * @Date 2022/6/29 11:57
     * @Param []
     * @return feign.Request.Options
     **/
    @Bean
    Request.Options feignOptions() {
        return new Request.Options(60 * 1000, 60 * 1000);
    }

}

3、代码对单独Feign方法设置超时时间

//Feign接口方法定义
    @RequestMapping(value="flow/getSignFile", method= RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Object getSignFile(Request.Options options, @RequestBody Map<String, Object> param);

//Spring 启动报错:
Caused by: 
java.lang.IllegalStateException: Method has too many Body parameters: public abstract java.lang.Object com.duowan.hr.modules.app.services.FeignContractDocusignService.getSignFile(feign.Request$Options,java.util.Map)
	at feign.Util.checkState(Util.java:128)
	at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:114)
	at org.springframework.cloud.netflix.feign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:133)
	at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.java:64)
	at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:146)
	at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:53)



//Feign接口方法调用
 Request.Options options =new Request.Options(60 * 1000, 60 * 1000);
 feignXXXService.getSignFile(options,param);



//解决方案,如下:
    @RequestMapping(value="flow/getSignFile", method= RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
 public Object getSignFile(@RequestParam(required = false,name = "options") Request.Options options,@RequestBody Map<String, Object> param);


//调用时报错:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class feign.Request$Options and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: feign.Request$Options[0])
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.10.5.jar:2.10.5]
	at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.10.5.jar:2.10.5]
	at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:404) ~[jackson-databind-2.10.5.jar:2.10.5]
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.10.5.jar:2.10.5]
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.10.5.jar:2.10.5]
	at com.fasterxml.jackson.databind.ser.std.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:252) ~[jackson-databind-2.10.5.jar:2.10.5]

//解决方案,如下:
    @RequestMapping(value="flow/getSignFile", method= RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
 public Object getSignFile(@RequestHeader(required = false,name = "options") Request.Options options,@RequestBody Map<String, Object> param);


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐