起因: 因为服务器启动时,保存的数据和node层保存的数据不一致。虽然有定时同步的功能,但是启动后到第一次同步之间有段真空期,所有这个问题最后评估下来是要修复的。
经过思考后,决定服务器启动时,向redis里推送一条消息提示前端要同步数据。因此使用了以前用过的@PostConstruct试图解决这个问题。
代码如下:
@Configuration
public class TransferSecretKeySyncConfig {
private static final String CHANNEL = "iot_restart";
private static final String RESTART_MESSAGE = "{\"type\":\"restart\"}";
@Autowired
private RedisAgent redisAgent;
@PostConstruct
public void syncTransferSecretLKey(){
redisAgent.publish(CHANNEL, RESTART_MESSAGE);
}
}
但是和前端一起测试时发现问题: 服务器启动时发送的消息没有生效, 后来去查看log发现,前端确实发送了请求,但是请求结果返回是502。
后枉然大悟,使用@PostConstract往redis里发送消息时,服务器还没完全启动,这时调用接口返回502也是意料之中的事。 因此便去寻找在服务器完全启动后做一些事的方法。
修改后
@Component
@Slf4j
public class TransferSecretKeySyncConfig implements CommandLineRunner {
private static final String CHANNEL = "iot_restart";
private static final String RESTART_MESSAGE = "{\"type\":\"restart\"}";
@Autowired
private RedisAgent redisAgent;
@Override
public void run(String... args) throws Exception {
log.info("send sync transfer secret key to redis...");
redisAgent.publish(CHANNEL, RESTART_MESSAGE);
}
}
得以解决