---
title: "Solon Rpc 超时和心跳控制"
---

超时是调用的保护边界；心跳是长连接存活检测。


### 1、请求超时的控制（对 http、socket、websocket 通道都有效）

* 使用注解控制 timeout （单位：秒）

```java
//在接口使用时配置
@NamiClient(name = "userapi",  path="/rpc/v1/user", timeout=60*5)
UserService userService;

//或者 

//在接口声明时配置
@NamiClient(name = "userapi",  path="/rpc/v1/user", timeout=60*5)
public class UserService{
   //..
}
```

* 使用构建器

```java
UserService userService = Nami.builder().name("userapi").path("/rpc/v1/user")
                                       .timeout(60*5)
                                       .decoder(SnackDecoder.instance)
                                       .encoder(SnackTypeEncoder.instance)
                                       .create(UserService.class);
```

* 使用全局配置（会对全局有影响，使用时注意）

```java
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        return new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                builder.timeout(60*5);
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
            }
        };
    }
}
```


### 2、心跳间隔控制（仅对 socket、websocket 长链接通道有效）

* 使用注解控制 heartbeat （单位：少）

```java
@NamiClient(name = "userapi",  path="/rpc/v1/user", heartbeat=30);
UserService userService;
```

* 使用构建器

```java
UserService userService = Nami.builder().name("userapi").path("/rpc/v1/user")
                                       .heartbeat(30)
                                       .decoder(SnackDecoder.instance)
                                       .encoder(SnackTypeEncoder.instance)
                                       .create(UserService.class);
```


* 使用全局配置（会对全局有影响，使用时注意）

```java
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        return new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                builder.heartbeat(30)
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
            }
        };
    }
}
```





### 3、 超时后的业务处理

超时不等于服务端一定没有执行：请求可能已经到达服务端，只是响应没及时回来。因此：

- 查询可以在确认幂等后有限重试。
- 新增、扣款、发货等写操作不要盲目重试。
- 需要重试时使用业务幂等键，并在服务端去重。
- 记录调用目标、接口、耗时和 traceId，不要记录敏感请求头。

