日期:2014-05-20  浏览次数:20894 次

Mina框架中服务器端怎样判断信息发送失败?(从而实现消息重发机制)
mina框架的监听可监听信息发送成功是触发和IoHlander 业务类中messageSent(IoSession session, Object message)只可收到发送成功的消息

------解决方案--------------------
前些时候,我也曾接触过mina

像楼主所说的问题,个人觉得,单靠一方是无法完成的。
通讯本身就是双方的。你的发送端只负责发送消息,至于消息是否能如期的到达接收端,并不是你发送端能完全掌控的。比如说,物流公司往外地发货,他也只负责将货物装上长途运输公司的汽车上,至于货物是否能如期到达目的地,他根本就无法预知,就好像长途汽车在途中出车祸等等,这些物流公司不可能第一时间能预知的。他只能通过对方的签收单来确认货物是否已经运送到了。
所以,我认为如果要实现楼主的要求,就必须要通讯的双方配合,比如说,我发送一条消息,对方必须在指定的时间内给个回应来告诉我消息已经正常接收完毕。
------解决方案--------------------
关键看你怎样定义发送失败这个词的意思了。

比如,在网络发送数据的时候,
1.本地发送线程过载,某些数据未写入IO。
2.网络链路断开,部分数据无法到达目的地。
3.数据推送到对端,但是,对端未作处理。

当然,时间过程中可能还有其他情况,你可以认为是发送失败的。
1.发送过载的情况,一般都是通过创建多条连接并行传输,并且,采用阻塞队列进行流量控制。
2.网络链路故障,一般程序会抛出异常,进行异常处理就好。
当然,也可以辅以超时时间,进行程序调优。
3.一般的网络通信,你发送一个数据,对端都应该响应一个结果,表示,发送的数据我接收的搞定了。
因为,接收数据也会出现过载,数据格式错误,等等的状况,有个响应结果,对发送端也有利。

一般情况下,我们消息的重发机制,就是建立在这种“一问一答”式的通讯方式之上的。
如果发送了一个消息到对方,结果长时间没有应答信息,那么,我们认为,对方没收到消息,
之后我们重发上一次的消息,等待再次超时,一般而言,这种周期或者重发次数,我们定为3次。

连续3次都失败,说明这条通信线路不可靠,断开重新建立连接进行发送。