Skip to content

Commit 7a654ea

Browse files
committed
Populate Text(58) field when rejectMessageOnUnhandledException=true
If rejectMessageOnUnhandledException=true and an unhandled exception is thrown from the fromCallback(), include the exception message in the Text(58) field of the resulting Reject or BusinessMessageReject.
1 parent 2e72203 commit 7a654ea

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

quickfixj-core/src/main/java/quickfix/Session.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,13 +1214,13 @@ ignore the message and let the problem correct itself (optimistic approach).
12141214
}
12151215
if (!(MessageUtils.isAdminMessage(msgType))
12161216
&& (sessionBeginString.compareTo(FixVersions.BEGINSTRING_FIX42) >= 0)) {
1217-
generateBusinessReject(message, BusinessRejectReason.APPLICATION_NOT_AVAILABLE,
1217+
generateBusinessReject(message, t.getMessage(), BusinessRejectReason.APPLICATION_NOT_AVAILABLE,
12181218
0);
12191219
} else {
12201220
if (MsgType.LOGON.equals(msgType)) {
12211221
disconnect("Problem processing Logon message", true);
12221222
} else {
1223-
generateReject(message, SessionRejectReason.OTHER, 0);
1223+
generateReject(message, t.getMessage(), SessionRejectReason.OTHER, 0);
12241224
}
12251225
}
12261226
} else {
@@ -1732,6 +1732,11 @@ private void setRejectReason(Message reject, int field, String reason,
17321732

17331733
private void generateBusinessReject(Message message, int err, int field) throws FieldNotFound,
17341734
IOException {
1735+
generateBusinessReject(message, null, err, field);
1736+
}
1737+
1738+
private void generateBusinessReject(Message message, String text, int err, int field) throws FieldNotFound,
1739+
IOException {
17351740
final Header header = message.getHeader();
17361741
ApplVerID targetDefaultApplicationVersionID = getTargetDefaultApplicationVersionID();
17371742
final Message reject = messageFactory.create(sessionID.getBeginString(), targetDefaultApplicationVersionID,
@@ -1746,7 +1751,12 @@ private void generateBusinessReject(Message message, int err, int field) throws
17461751
reject.setInt(BusinessRejectReason.FIELD, err);
17471752
state.incrNextTargetMsgSeqNum();
17481753

1749-
final String reason = BusinessRejectReasonText.getMessage(err);
1754+
final String reason;
1755+
if (text != null) {
1756+
reason = text;
1757+
} else {
1758+
reason = BusinessRejectReasonText.getMessage(err);
1759+
}
17501760
setRejectReason(reject, field, reason, field != 0);
17511761
getLog().onErrorEvent(
17521762
"Reject sent for message number " + msgSeqNum + (reason != null ? (": " + reason) : "")

quickfixj-core/src/test/java/quickfix/SessionTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1771,7 +1771,7 @@ public void fromApp(Message message, SessionID sessionId)
17711771
throws FieldNotFound, IncorrectDataFormat,
17721772
IncorrectTagValue, UnsupportedMessageType {
17731773
super.fromApp(message, sessionId);
1774-
throw new Error("TEST");
1774+
throw new Error("TESTApp");
17751775
}
17761776
};
17771777

@@ -1788,6 +1788,8 @@ public void fromApp(Message message, SessionID sessionId)
17881788
.getHeader().getString(MsgType.FIELD));
17891789
assertEquals(MsgType.BUSINESS_MESSAGE_REJECT, application
17901790
.lastToAppMessage().getHeader().getString(MsgType.FIELD));
1791+
assertEquals("TESTApp", application.lastToAppMessage()
1792+
.getString(Text.FIELD));
17911793

17921794
session.next(createHeartbeatMessage(3));
17931795
assertEquals(4, session.getExpectedTargetNum());
@@ -1796,6 +1798,8 @@ public void fromApp(Message message, SessionID sessionId)
17961798
.getHeader().getString(MsgType.FIELD));
17971799
assertEquals(MsgType.REJECT, application.lastToAdminMessage()
17981800
.getHeader().getString(MsgType.FIELD));
1801+
assertEquals("TESTAdmin", application.lastToAdminMessage()
1802+
.getString(Text.FIELD));
17991803

18001804
session.next(createAdminMessage(4));
18011805
assertEquals(5, session.getExpectedTargetNum());
@@ -1805,6 +1809,8 @@ public void fromApp(Message message, SessionID sessionId)
18051809
.getString(MsgType.FIELD));
18061810
assertEquals(MsgType.HEARTBEAT, application.lastToAdminMessage()
18071811
.getHeader().getString(MsgType.FIELD));
1812+
assertFalse(application.lastToAdminMessage()
1813+
.isSetField(Text.FIELD));
18081814
} catch (final Throwable t) {
18091815
fail("Error was thrown: " + t.getMessage());
18101816
}

0 commit comments

Comments
 (0)