in FixAntenna/NetCore/FixEngine/Session/IoThreads/NoQueueMessagePumper.cs [318:395]
private bool SerializeAndSend(string msgType, FixMessage content, ChangesType? changesType, bool checkState)
{
if (checkState)
{
if (!_started)
{
throw new InvalidOperationException("Pumper is not started, it cannot send any messages in this state.");
}
if (((AbstractFixSession)_fixSession).AlreadySendingLogout)
{
throw new InvalidOperationException("Session is shutting down, cannot send any messages in this state.");
}
}
try
{
var offset = _messageBuffer.Offset;
if (changesType != null)
{
_fixMessageFactory.Serialize(content, changesType, _messageBuffer, _context);
}
else
{
_fixMessageFactory.Serialize(null, msgType, content, _messageBuffer, _context);
}
var len = _messageBuffer.Offset - offset;
long written = _transport.Write(_messageBuffer, offset, len);
if (written != len)
{
throw new IOException("Transport sent only part of message (" + written + " vs " + len + ")");
}
if (msgType != null || changesType != null)
{
try
{
_sequenceManager.IncrementOutSeqNum();
}
catch (IOException e)
{
Log.Error("Failed to increment sequence", e);
return false;
}
}
UpdateMessageProcessedTimestamp();
_outgoingLog.AppendMessage(_messageBuffer.GetByteArray(), offset, len);
try
{
_fixSession.ExtendedFixSessionListener.OnMessageSent(_messageBuffer.GetByteArray(), offset, len);
}
catch (Exception e)
{
if (Log.IsDebugEnabled)
{
Log.Warn("ExtendedFIXSessionListener::OnMessageSent thrown error. Cause:" + e.Message, e);
}
else
{
Log.Warn("ExtendedFIXSessionListener::OnMessageSent thrown error. Cause:" + e.Message);
}
}
}
catch (IOException e)
{
Log.Error("Failed to send message: " + e.Message, e);
ReportErrorAndShutdown(e);
throw new MessageNotSentException("Message wasn't sent due to error", e);
}
finally
{
_messageBuffer.ResetBuffer();
}
return true;
}