/// <summary> /// Sends messages asynchronously. For PersistentMessage types, the /// MessageCorrelationContext provides caller to know if the message was /// acknowledge or not by the Solace Event Broker. /// </summary> /// <param name="message"></param> /// <returns></returns> public Task <MessageCorrelationContext> SendAsync(Message message) { using (var solaceMsg = SolaceNativeMsgAdapter.ConvertToNativeMsg(message)) { var msgCtx = new MessageCorrelationContext(message, message.CorrelationId); var tcs = new TaskCompletionSource <MessageCorrelationContext>(); solaceMsg.CorrelationKey = new MessageTaskPair(msgCtx, tcs); ReturnCode rc; try { rc = session.Send(solaceMsg); } catch (Exception e) { solaceMsg.Dispose(); throw new MessagingException(e.Message, e); } switch (rc) { case ReturnCode.SOLCLIENT_OK: case ReturnCode.SOLCLIENT_IN_PROGRESS: // OK break; default: throw new MessagingException("Send failure: " + rc.ToString()); } if (!message.IsPersistent) { // There will be no ack, immediately consider it acknowledged (complete synchronously) tcs.SetResult(msgCtx); } return(tcs.Task); } }
public MessageTaskPair(MessageCorrelationContext messageCorrelationContext, TaskCompletionSource <MessageCorrelationContext> taskCompletionSource) { this.msgCorrelationContext = messageCorrelationContext; this.tcs = taskCompletionSource; }