Esempio n. 1
0
        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();
                }
            }
        }
Esempio n. 2
0
        public IMessage CreateMessage()
        {
            BaseMessage answer = new BaseMessage();

            return(answer);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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();
                }
            }
        }