public void Send(IDestination destination, IMessage imessage, bool persistent, byte priority, TimeSpan timeToLive) { BaseMessage message = (BaseMessage)imessage; MessageQueue mq = null; MessageQueue responseQueue = null; MessageQueueTransaction transaction = null; try { // Locate the MSMQ Queue we will be sending to if (messageQueue != null) { if (destination.Equals(this.destination)) { mq = messageQueue; } else { throw new NMSException("This producer can only be used to send to: " + destination); } } else { mq = openMessageQueue((Destination)destination); } // Convert the Mesasge into a MSMQ message message.NMSPersistent = persistent; message.NMSTimeToLive = timeToLive; message.NMSPriority = priority; // message.NMSTimestamp = new DateTime().Date.; Message msg = messageConverter.ToMsmqMessage(message); // TODO: message.NMSMessageId = // Now Send the message if (mq.Transactional) { if (session.Transacted) { mq.Send(msg, session.MessageQueueTransaction); } else { // Start our own mini transaction here to send the message. transaction = new MessageQueueTransaction(); transaction.Begin(); mq.Send(msg, transaction); transaction.Commit(); } } else { if (session.Transacted) { // We may want to raise an exception here since app requested // a transeced NMS session, but is using a non transacted message queue // For now silently ignore it. } mq.Send(msg); } } finally { // Cleanup if (transaction != null) { transaction.Dispose(); } if (responseQueue != null) { responseQueue.Dispose(); } if (mq != null && mq != messageQueue) { mq.Dispose(); } } }
public IMessage CreateMessage() { BaseMessage answer = new BaseMessage(); return(answer); }
/// <summary> /// Creates an NMS message of appropriate type for the specified MSMQ /// message, and convert the message body if specified. /// </summary> /// <param name="message">MSMQ message.</param> /// <param name="convertBody">true if the message body must be /// converted.</param> /// <result>NMS message created for retrieving the MSMQ message.</result> protected virtual BaseMessage CreateNmsMessage(Message message, bool convertBody) { BaseMessage result = null; if ((int)NMSMessageType.TextMessage == message.AppSpecific) { TextMessage textMessage = new TextMessage(); if (convertBody) { ConvertTextMessageBodyToNMS(message, textMessage); } result = textMessage; } else if ((int)NMSMessageType.BytesMessage == message.AppSpecific) { BytesMessage bytesMessage = new BytesMessage(); if (convertBody) { ConvertBytesMessageBodyToNMS(message, bytesMessage); } result = bytesMessage; } else if ((int)NMSMessageType.ObjectMessage == message.AppSpecific) { ObjectMessage objectMessage = new ObjectMessage(); if (convertBody) { ConvertObjectMessageBodyToNMS(message, objectMessage); } result = objectMessage; } else if ((int)NMSMessageType.MapMessage == message.AppSpecific) { MapMessage mapMessage = new MapMessage(); if (convertBody) { ConvertMapMessageBodyToNMS(message, mapMessage); } result = mapMessage; } else if ((int)NMSMessageType.StreamMessage == message.AppSpecific) { StreamMessage streamMessage = new StreamMessage(); if (convertBody) { ConvertStreamMessageBodyToNMS(message, streamMessage); } result = streamMessage; } else { BaseMessage baseMessage = new BaseMessage(); result = baseMessage; } result.ReadOnlyBody = true; return(result); }
/// <summary> /// Converts the specified MSMQ message to an equivalent NMS message. /// </summary> /// <param name="message">MSMQ message to be converted.</param> /// <param name="convertBody">true if message body should be converted.</param> /// <result>Converted NMS message.</result> public virtual IMessage ToNmsMessage(Message message, bool convertBody) { BaseMessage answer = CreateNmsMessage(message, convertBody); // Get the NMS property data from the extension area PrimitiveMap propertyData = PrimitiveMap.Unmarshal(message.Extension); try { answer.NMSMessageId = message.Id; answer.NMSCorrelationID = propertyData.GetString("NMSCorrelationID"); answer.NMSDeliveryMode = (message.Recoverable ? MsgDeliveryMode.Persistent : MsgDeliveryMode.NonPersistent); answer.NMSDestination = ToNmsDestination(message.DestinationQueue); } catch (InvalidOperationException) { } try { answer.NMSReplyTo = ToNmsDestination(message.ResponseQueue); answer.NMSTimeToLive = message.TimeToBeReceived; answer.NMSPriority = ToNmsMsgPriority(message.Priority); } catch (InvalidOperationException) { } try { if (message.Label != null) { if (SetLabelAsNMSType) { answer.NMSType = message.Label; } else { answer.Properties["Label"] = message.Label; } } answer.Properties["LookupId"] = message.LookupId; } catch (InvalidOperationException) { } foreach (object keyObject in propertyData.Keys) { try { string key = (keyObject as string); if (string.Compare(key, "NMSType", true) == 0) { answer.NMSType = propertyData.GetString(key); } else if (string.Compare(key, "NMSCorrelationID", true) == 0) { answer.NMSCorrelationID = propertyData.GetString("NMSCorrelationID"); } else { answer.Properties[key] = propertyData[key]; } } catch (InvalidOperationException) { } } return(answer); }
protected virtual BaseMessage CreateNmsMessage(Message message) { BaseMessage result = null; if ((int)NMSMessageType.TextMessage == message.AppSpecific) { TextMessage textMessage = new TextMessage(); string content = String.Empty; if (message.BodyStream != null && message.BodyStream.Length > 0) { byte[] buf = null; buf = new byte[message.BodyStream.Length]; message.BodyStream.Read(buf, 0, buf.Length); content = Encoding.UTF32.GetString(buf); } textMessage.Text = content; result = textMessage; } else if ((int)NMSMessageType.BytesMessage == message.AppSpecific) { byte[] buf = null; if (message.BodyStream != null && message.BodyStream.Length > 0) { buf = new byte[message.BodyStream.Length]; message.BodyStream.Read(buf, 0, buf.Length); } BytesMessage bytesMessage = new BytesMessage(); bytesMessage.Content = buf; result = bytesMessage; } else if ((int)NMSMessageType.ObjectMessage == message.AppSpecific) { ObjectMessage objectMessage = new ObjectMessage(); objectMessage.Body = message.Body; result = objectMessage; } else if ((int)NMSMessageType.MapMessage == message.AppSpecific) { byte[] buf = null; if (message.BodyStream != null && message.BodyStream.Length > 0) { buf = new byte[message.BodyStream.Length]; message.BodyStream.Read(buf, 0, buf.Length); } MapMessage mapMessage = new MapMessage(); mapMessage.Body = PrimitiveMap.Unmarshal(buf); result = mapMessage; } else if ((int)NMSMessageType.StreamMessage == message.AppSpecific) { StreamMessage streamMessage = new StreamMessage(); // TODO: Implement result = streamMessage; } else { BaseMessage baseMessage = new BaseMessage(); result = baseMessage; } return(result); }
public void Send(IDestination destination, IMessage imessage, MsgDeliveryMode deliveryMode, MsgPriority priority, TimeSpan timeToLive) { BaseMessage message = (BaseMessage)imessage; MessageQueue mq = null; try { // Locate the MSMQ Queue we will be sending to if (messageQueue != null) { if (destination.Equals(this.destination)) { mq = messageQueue; } else { throw new NMSException("This producer can only be used to send to: " + destination); } } else { mq = openMessageQueue((Destination)destination); } message.NMSDeliveryMode = deliveryMode; message.NMSTimeToLive = timeToLive; message.NMSPriority = priority; if (!DisableMessageTimestamp) { message.NMSTimestamp = DateTime.UtcNow; } if (!DisableMessageID) { // TODO: message.NMSMessageId = } // Convert the Mesasge into a MSMQ message Message msg = session.MessageConverter.ToMsmqMessage(message); if (mq.Transactional) { if (session.Transacted) { mq.Send(msg, session.MessageQueueTransaction); } else { // Start our own mini transaction here to send the message. using (MessageQueueTransaction transaction = new MessageQueueTransaction()) { transaction.Begin(); mq.Send(msg, transaction); transaction.Commit(); } } } else { if (session.Transacted) { // We may want to raise an exception here since app requested // a transeced NMS session, but is using a non transacted message queue // For now silently ignore it. } mq.Send(msg); } } finally { if (mq != null && mq != messageQueue) { mq.Dispose(); } } }