The following problem was encountered. When a Logout message is received as the response on Logon message, the next target sequence number is incremented independently of the actual sequence number of the Logout message.
Example:
Let nextTargetMsgSeqNum = N
1) The sender sends Logon message
2) The target replies with Logout message having msgSeqNum = M, where M > N
3) The sender increments the nextTargetMsgSeqNum though msgSeqNum of received Logout message is higher than nextTargetMsgSeqNum
I expected that the nextTargetMsgSeqNum wouldn't be incremented in this situation.
I suggest to increment nextTargetMsgSeqNum conditionally when processing Logout message.
Example code:
~~~~
private void nextLogout(Message logout) throws IOException, RejectLogon, FieldNotFound,
IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
if (!verify(logout, false, false)) {
return;
}
String msg; if (!state.isLogoutSent()) { msg = "Received logout request"; if (logout.isSetField(Text.FIELD)) { msg += ": " + logout.getString(Text.FIELD); } getLog().onEvent(msg); generateLogout(logout); getLog().onEvent("Sent logout response"); } else { msg = "Received logout response"; getLog().onEvent(msg); } state.setLogoutReceived(true); final int sequence = logout.getHeader().getInt(MsgSeqNum.FIELD); if (!isTargetTooHigh(sequence)) { state.incrNextTargetMsgSeqNum(); } if (resetOnLogout) { resetState(); } disconnect(msg, false);
}
In the current code nextTargetMsgSeqNum is incremented independently of the actual sequence number of the Logout message:
private void nextLogout(Message logout) throws IOException, RejectLogon, FieldNotFound,
IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
if (!verify(logout, false, false)) {
return;
}
String msg; if (!state.isLogoutSent()) { msg = "Received logout request"; if (logout.isSetField(Text.FIELD)) { msg += ": " + logout.getString(Text.FIELD); } getLog().onEvent(msg); generateLogout(logout); getLog().onEvent("Sent logout response"); } else { msg = "Received logout response"; getLog().onEvent(msg); } state.setLogoutReceived(true); state.incrNextTargetMsgSeqNum(); if (resetOnLogout) { resetState(); } disconnect(msg, false);
}
~~~~~~