目前课程中对于packNo的判断代码如下:
private long lastPackNo = -1;
//NACK
long packNo = cmdPack.getPackNo();
if (packNo == lastPackNo + 1){
}else if (packNo <= lastPackNo){
}else {
//跳号
}
lastPackNo 是放在内存中的,
如果撮合服务重启之后 lastPackNo 的值会 重新赋值为 -1,那么当收到udp广播的时候,新到的包的packNo与-1进行比对,必然会被识别为跳包了,就会重新拉取历史包,再次放入ringbuff中重新撮合,这里有两种情况:
情况1.重新拉取的这些委托包都是未被撮合的,这是ok的,可以重新进行撮合
情况2.重新拉取的这些委托包可能会包含(已经撮合过的和没有撮合的),因为lastPackNo =-1,造成重新拉取委托包,拉到了那些未被撮合的委托包,这种情况会再次重新撮合那些已经被撮合过的委托包
另外.如果不重新拉取的话,似乎又不知道哪些已经撮合过了哪些没有撮合,因为数据都在ringbuff内存里面,系统一重启ringbuff内存里面的东西都没有了。
以上问题我不知道实际生产环境中老师是怎么解决的,因此基于内存撮合,内存易失性问题会造成各种异常需要处理,比较麻烦