http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/ByIdMessageReader.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/ByIdMessageReader.cs b/src/main/csharp/Readers/ByIdMessageReader.cs index f981ca8..6a544f4 100644 --- a/src/main/csharp/Readers/ByIdMessageReader.cs +++ b/src/main/csharp/Readers/ByIdMessageReader.cs @@ -1,136 +1,136 @@ -using System; -using System.Messaging; -using Apache.NMS.MSMQ; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// MSMQ message reader, returning messages matching the specified - /// message identifier. - /// </summary> - public class ByIdMessageReader : AbstractMessageReader - { - private string messageId; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="messageQueue">The MSMQ message queue from which - /// messages will be read.</param> - /// <param name="messageConverter">A message converter for mapping - /// MSMQ messages to NMS messages.</param> - /// <param name="messageId">The message identifier of messages to - /// be read.</param> - public ByIdMessageReader(MessageQueue messageQueue, - IMessageConverter messageConverter, string messageId) - : base(messageQueue, messageConverter) - { - this.messageId = messageId; - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available. - /// </summary> - /// <returns>Peeked message.</returns> - public override IMessage Peek() - { - return Convert(messageQueue.PeekById(messageId)); - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available or the specified time-out occurs. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Peeked message.</returns> - public override IMessage Peek(TimeSpan timeSpan) - { - return Convert(messageQueue.PeekById(messageId, timeSpan)); - } - - /// <summary> - /// Receives the first message available in the queue referenced by - /// the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <returns>Received message.</returns> - public override IMessage Receive() - { - return Convert(messageQueue.ReceiveById(messageId)); - } - - /// <summary> - /// Receives the first message available in the queue referenced by the - /// MessageQueue matching the selection criteria, and waits until either - /// a message is available in the queue, or the time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan) - { - return Convert(messageQueue.ReceiveById(messageId, timeSpan)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(MessageQueueTransaction transaction) - { - return Convert(messageQueue.ReceiveById(messageId, transaction)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan, - MessageQueueTransaction transaction) - { - return Convert(messageQueue.ReceiveById(messageId, timeSpan, - transaction)); - } - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. - /// </summary> - /// <param name="message">MSMQ message.</param> - /// <return>true if the message matches the selection criteria.</return> - public override bool Matches(Message message) - { - // NB: case-sensitive match - return message.Id == messageId; - } - } -} +using System; +using System.Messaging; +using Apache.NMS.MSMQ; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// MSMQ message reader, returning messages matching the specified + /// message identifier. + /// </summary> + public class ByIdMessageReader : AbstractMessageReader + { + private string messageId; + + /// <summary> + /// Constructor. + /// </summary> + /// <param name="messageQueue">The MSMQ message queue from which + /// messages will be read.</param> + /// <param name="messageConverter">A message converter for mapping + /// MSMQ messages to NMS messages.</param> + /// <param name="messageId">The message identifier of messages to + /// be read.</param> + public ByIdMessageReader(MessageQueue messageQueue, + IMessageConverter messageConverter, string messageId) + : base(messageQueue, messageConverter) + { + this.messageId = messageId; + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available. + /// </summary> + /// <returns>Peeked message.</returns> + public override IMessage Peek() + { + return Convert(messageQueue.PeekById(messageId)); + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available or the specified time-out occurs. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Peeked message.</returns> + public override IMessage Peek(TimeSpan timeSpan) + { + return Convert(messageQueue.PeekById(messageId, timeSpan)); + } + + /// <summary> + /// Receives the first message available in the queue referenced by + /// the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <returns>Received message.</returns> + public override IMessage Receive() + { + return Convert(messageQueue.ReceiveById(messageId)); + } + + /// <summary> + /// Receives the first message available in the queue referenced by the + /// MessageQueue matching the selection criteria, and waits until either + /// a message is available in the queue, or the time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan) + { + return Convert(messageQueue.ReceiveById(messageId, timeSpan)); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(MessageQueueTransaction transaction) + { + return Convert(messageQueue.ReceiveById(messageId, transaction)); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan, + MessageQueueTransaction transaction) + { + return Convert(messageQueue.ReceiveById(messageId, timeSpan, + transaction)); + } + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. + /// </summary> + /// <param name="message">MSMQ message.</param> + /// <return>true if the message matches the selection criteria.</return> + public override bool Matches(Message message) + { + // NB: case-sensitive match + return message.Id == messageId; + } + } +}
http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/ByLookupIdMessageReader.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/ByLookupIdMessageReader.cs b/src/main/csharp/Readers/ByLookupIdMessageReader.cs index 421c52b..423c3a7 100644 --- a/src/main/csharp/Readers/ByLookupIdMessageReader.cs +++ b/src/main/csharp/Readers/ByLookupIdMessageReader.cs @@ -1,145 +1,215 @@ -using System; -using System.Messaging; -using Apache.NMS.MSMQ; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// MSMQ message reader, returning messages matching the specified - /// lookup identifier. - /// </summary> - public class ByLookupIdMessageReader : AbstractMessageReader - { - private Int64 lookupId; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="messageQueue">The MSMQ message queue from which - /// messages will be read.</param> - /// <param name="messageConverter">A message converter for mapping - /// MSMQ messages to NMS messages.</param> - /// <param name="lookupId">The lookup identifier of the message - /// to be read.</param> - public ByLookupIdMessageReader(MessageQueue messageQueue, - IMessageConverter messageConverter, Int64 lookupId) - : base(messageQueue, messageConverter) - { - this.lookupId = lookupId; - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available. - /// </summary> - /// <returns>Peeked message.</returns> - public override IMessage Peek() - { - return Convert(messageQueue.PeekByLookupId(lookupId)); - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available or the specified time-out occurs. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Peeked message.</returns> - public override IMessage Peek(TimeSpan timeSpan) - { - // No time-out option for receiving messages by lookup identifiers: - // either the message is present in the queue, or the method throws - // an exception immediately if the message is not in the queue. - return Convert(messageQueue.PeekByLookupId(lookupId)); - } - - /// <summary> - /// Receives the first message available in the queue referenced by - /// the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <returns>Received message.</returns> - public override IMessage Receive() - { - return Convert(messageQueue.ReceiveByLookupId(lookupId)); - } - - /// <summary> - /// Receives the first message available in the queue referenced by the - /// MessageQueue matching the selection criteria, and waits until either - /// a message is available in the queue, or the time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan) - { - // No time-out option for receiving messages by lookup identifiers: - // either the message is present in the queue, or the method throws - // an exception immediately if the message is not in the queue. - return Convert(messageQueue.ReceiveByLookupId(lookupId)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(MessageQueueTransaction transaction) - { - return Convert(messageQueue.ReceiveByLookupId( - MessageLookupAction.Current, lookupId, transaction)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan, - MessageQueueTransaction transaction) - { - // No time-out option for receiving messages by lookup identifiers: - // either the message is present in the queue, or the method throws - // an exception immediately if the message is not in the queue. - return Convert(messageQueue.ReceiveByLookupId( - MessageLookupAction.Current, lookupId, transaction)); - } - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. - /// </summary> - /// <param name="message">MSMQ message.</param> - /// <return>true if the message matches the selection criteria.</return> - public override bool Matches(Message message) - { - return message.LookupId == lookupId; - } - } -} +using System; +using System.Messaging; +using Apache.NMS.MSMQ; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// MSMQ message reader, returning messages matching the specified + /// lookup identifier. + /// </summary> + public class ByLookupIdMessageReader : AbstractMessageReader + { + private Int64 lookupId; + + // The MSMQ documentation for MessageQueue.PeekByLookupId(*) and + // MessageQueue.ReceiveByLookupId(*) specifies: + // InvalidOperationException: The message with the specified lookupId could not be found. + + /// <summary> + /// Constructor. + /// </summary> + /// <param name="messageQueue">The MSMQ message queue from which + /// messages will be read.</param> + /// <param name="messageConverter">A message converter for mapping + /// MSMQ messages to NMS messages.</param> + /// <param name="lookupId">The lookup identifier of the message + /// to be read.</param> + public ByLookupIdMessageReader(MessageQueue messageQueue, + IMessageConverter messageConverter, Int64 lookupId) + : base(messageQueue, messageConverter) + { + this.lookupId = lookupId; + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available. + /// </summary> + /// <returns>Peeked message.</returns> + public override IMessage Peek() + { + try + { + return Convert(messageQueue.PeekByLookupId(lookupId)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available or the specified time-out occurs. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Peeked message.</returns> + public override IMessage Peek(TimeSpan timeSpan) + { + try + { + // No time-out option for receiving messages by lookup identifiers: + // either the message is present in the queue, or the method throws + // an exception immediately if the message is not in the queue. + return Convert(messageQueue.PeekByLookupId(lookupId)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Receives the first message available in the queue referenced by + /// the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <returns>Received message.</returns> + public override IMessage Receive() + { + try + { + return Convert(messageQueue.ReceiveByLookupId(lookupId)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Receives the first message available in the queue referenced by the + /// MessageQueue matching the selection criteria, and waits until either + /// a message is available in the queue, or the time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan) + { + try + { + // No time-out option for receiving messages by lookup identifiers: + // either the message is present in the queue, or the method throws + // an exception immediately if the message is not in the queue. + return Convert(messageQueue.ReceiveByLookupId(lookupId)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(MessageQueueTransaction transaction) + { + try + { + return Convert(messageQueue.ReceiveByLookupId( + MessageLookupAction.Current, lookupId, transaction)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan, + MessageQueueTransaction transaction) + { + try + { + // No time-out option for receiving messages by lookup identifiers: + // either the message is present in the queue, or the method throws + // an exception immediately if the message is not in the queue. + return Convert(messageQueue.ReceiveByLookupId( + MessageLookupAction.Current, lookupId, transaction)); + } + catch(InvalidOperationException) + { + return null; + } + catch(Exception ex) + { + throw ex; + } + } + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. + /// </summary> + /// <param name="message">MSMQ message.</param> + /// <return>true if the message matches the selection criteria.</return> + public override bool Matches(Message message) + { + return message.LookupId == lookupId; + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/BySelectorMessageReader.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/BySelectorMessageReader.cs b/src/main/csharp/Readers/BySelectorMessageReader.cs index e7cd5c3..5617784 100644 --- a/src/main/csharp/Readers/BySelectorMessageReader.cs +++ b/src/main/csharp/Readers/BySelectorMessageReader.cs @@ -1,290 +1,286 @@ -using System; -using System.Messaging; -using Apache.NMS.MSMQ; -using Apache.NMS; -using Apache.NMS.Selector; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// MSMQ message reader, returning messages matching the specified - /// selector. - /// </summary> - public class BySelectorMessageReader : AbstractMessageReader - { - private string selector; - private MessageEvaluationContext evaluationContext; - private IBooleanExpression selectionExpression; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="messageQueue">The MSMQ message queue from which - /// messages will be read.</param> - /// <param name="messageConverter">A message converter for mapping - /// MSMQ messages to NMS messages.</param> - /// <param name="selector">The selector string.</param> - public BySelectorMessageReader(MessageQueue messageQueue, - IMessageConverter messageConverter, string selector) - : base(messageQueue, messageConverter) - { - this.selector = selector; - - SelectorParser selectorParser = new SelectorParser(); - selectionExpression = selectorParser.Parse(selector); - - evaluationContext = new MessageEvaluationContext(null); - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available. - /// </summary> - /// <returns>Peeked message.</returns> - public override IMessage Peek() - { - return InternalPeek(DateTime.MaxValue, true); - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available or the specified time-out occurs. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Peeked message.</returns> - public override IMessage Peek(TimeSpan timeSpan) - { - DateTime maxTime = DateTime.Now + timeSpan; - return InternalPeek(maxTime, true); - } - - /// <summary> - /// Receives the first message available in the queue referenced by - /// the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <returns>Received message.</returns> - public override IMessage Receive() - { - return InternalReceive(DateTime.MaxValue, null); - } - - /// <summary> - /// Receives the first message available in the queue referenced by the - /// MessageQueue matching the selection criteria, and waits until either - /// a message is available in the queue, or the time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan) - { - return InternalReceive(DateTime.Now + timeSpan, null); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(MessageQueueTransaction transaction) - { - return InternalReceive(DateTime.MaxValue, transaction); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan, - MessageQueueTransaction transaction) - { - return InternalReceive(DateTime.Now + timeSpan, transaction); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="maxTime">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public IMessage InternalReceive(DateTime maxTime, - MessageQueueTransaction transaction) - { - // In a shared connection / multi-consumer context, the message may - // have been consumed by another client, after it was peeked but - // before it was peeked by this client. Hence the loop. - // (not sure it can be shared AND transactional, though). - while(true) - { - IMessage peekedMessage = InternalPeek(maxTime, false); - - if(peekedMessage == null) - { - return null; - } - - try - { - long lookupId = peekedMessage.Properties.GetLong("LookupId"); - - Message message = (transaction == null ? - messageQueue.ReceiveByLookupId(lookupId) : - messageQueue.ReceiveByLookupId( - MessageLookupAction.Current, lookupId, transaction)); - - return Convert(message); - } - catch(InvalidOperationException exc) - { - // TODO: filter exceptions, catch only exceptions due to - // unknown lookup id. - } - } - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue, matching the selection criteria. - /// </summary> - /// <param name="maxTime">Reception time-out.</param> - /// <param name="convertBody">true if message body should be converted.</param> - /// <returns>Peeked message.</returns> - private IMessage InternalPeek(DateTime maxTime, bool convertBody) - { - TimeSpan timeSpan = maxTime - DateTime.Now; - if(timeSpan <= TimeSpan.Zero) - { - timeSpan = TimeSpan.Zero; - } - - Cursor cursor = messageQueue.CreateCursor(); - - PeekAction action = PeekAction.Current; - - while(true) - { - Message msmqMessage = null; - - try - { - msmqMessage = messageQueue.Peek(timeSpan, cursor, action); - } - catch(MessageQueueException exc) - { - if(exc.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout) - { - throw exc; - } - } - - if(msmqMessage == null) - { - return null; - } - - IMessage nmsMessage = InternalMatch(msmqMessage, convertBody); - - if(nmsMessage != null) - { - return nmsMessage; - } - - action = PeekAction.Next; - } - } - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. If matched - /// the method returns the converted NMS message. Else it returns null. - /// </summary> - /// <param name="message">The MSMQ message to check.</param> - /// <param name="convertBody">true if the message body should be - /// converted.</param> - /// <returns>The matching message converted to NMS, or null.</returns> - private IMessage InternalMatch(Message message, bool convertBody) - { - if(messageConverterEx == null) - { - IMessage nmsMessage = messageConverter.ToNmsMessage(message); - - evaluationContext.Message = nmsMessage; - - if(selectionExpression.Matches(evaluationContext)) - { - return nmsMessage; - } - } - else - { - // This version converts the message body only for those - // messages matching the selection criteria. - // Relies on MessageConverterEx for partial conversions. - IMessage nmsMessage = messageConverterEx.ToNmsMessage( - message, false); - - evaluationContext.Message = nmsMessage; - - if(selectionExpression.Matches(evaluationContext)) - { - if(convertBody) - { - messageConverterEx.ConvertMessageBodyToNMS( - message, nmsMessage); - } - - return nmsMessage; - } - } - - return null; - } - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. - /// </summary> - /// <param name="message">MSMQ message.</param> - /// <return>true if the message matches the selection criteria.</return> - public override bool Matches(Message message) - { - IMessage nmsMessage = messageConverterEx == null ? - messageConverter.ToNmsMessage(message) : - messageConverterEx.ToNmsMessage(message, false); - - evaluationContext.Message = nmsMessage; - - return selectionExpression.Matches(evaluationContext); - } - } -} +using System; +using System.Messaging; +using Apache.NMS.MSMQ; +using Apache.NMS; +using Apache.NMS.Selector; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// MSMQ message reader, returning messages matching the specified + /// selector. + /// </summary> + public class BySelectorMessageReader : AbstractMessageReader + { + private string selector; + private MessageEvaluationContext evaluationContext; + private IBooleanExpression selectionExpression; + + /// <summary> + /// Constructor. + /// </summary> + /// <param name="messageQueue">The MSMQ message queue from which + /// messages will be read.</param> + /// <param name="messageConverter">A message converter for mapping + /// MSMQ messages to NMS messages.</param> + /// <param name="selector">The selector string.</param> + public BySelectorMessageReader(MessageQueue messageQueue, + IMessageConverter messageConverter, string selector) + : base(messageQueue, messageConverter) + { + this.selector = selector; + + SelectorParser selectorParser = new SelectorParser(); + selectionExpression = selectorParser.Parse(selector); + + evaluationContext = new MessageEvaluationContext(null); + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available. + /// </summary> + /// <returns>Peeked message.</returns> + public override IMessage Peek() + { + return InternalPeek(DateTime.MaxValue, true); + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available or the specified time-out occurs. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Peeked message.</returns> + public override IMessage Peek(TimeSpan timeSpan) + { + DateTime maxTime = DateTime.Now + timeSpan; + return InternalPeek(maxTime, true); + } + + /// <summary> + /// Receives the first message available in the queue referenced by + /// the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <returns>Received message.</returns> + public override IMessage Receive() + { + return InternalReceive(DateTime.MaxValue, null); + } + + /// <summary> + /// Receives the first message available in the queue referenced by the + /// MessageQueue matching the selection criteria, and waits until either + /// a message is available in the queue, or the time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan) + { + return InternalReceive(DateTime.Now + timeSpan, null); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(MessageQueueTransaction transaction) + { + return InternalReceive(DateTime.MaxValue, transaction); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan, + MessageQueueTransaction transaction) + { + return InternalReceive(DateTime.Now + timeSpan, transaction); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="maxTime">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public IMessage InternalReceive(DateTime maxTime, + MessageQueueTransaction transaction) + { + // In a shared connection / multi-consumer context, the message may + // have been consumed by another client, after it was peeked but + // before it was peeked by this client. Hence the loop. + // (not sure it can be shared AND transactional, though). + while(true) + { + IMessage peekedMessage = InternalPeek(maxTime, false); + + if(peekedMessage == null) + { + return null; + } + + try + { + long lookupId = peekedMessage.Properties.GetLong("LookupId"); + + Message message = (transaction == null ? + messageQueue.ReceiveByLookupId(lookupId) : + messageQueue.ReceiveByLookupId( + MessageLookupAction.Current, lookupId, transaction)); + + return Convert(message); + } + catch(InvalidOperationException) + { + // TODO: filter exceptions, catch only exceptions due to + // unknown lookup id. + } + } + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue, matching the selection criteria. + /// </summary> + /// <param name="maxTime">Reception time-out.</param> + /// <param name="convertBody">true if message body should be converted.</param> + /// <returns>Peeked message.</returns> + private IMessage InternalPeek(DateTime maxTime, bool convertBody) + { + TimeSpan timeSpan = maxTime - DateTime.Now; + if(timeSpan <= TimeSpan.Zero) + { + timeSpan = TimeSpan.Zero; + } + + using(Cursor cursor = messageQueue.CreateCursor()) + { + PeekAction action = PeekAction.Current; + while(true) + { + Message msmqMessage = null; + + try + { + msmqMessage = messageQueue.Peek(timeSpan, cursor, action); + } + catch(MessageQueueException exc) + { + if(exc.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) + { + return null; + } + throw exc; + } + + IMessage nmsMessage = InternalMatch(msmqMessage, convertBody); + + if(nmsMessage != null) + { + return nmsMessage; + } + + action = PeekAction.Next; + } + } + } + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. If matched + /// the method returns the converted NMS message. Else it returns null. + /// </summary> + /// <param name="message">The MSMQ message to check.</param> + /// <param name="convertBody">true if the message body should be + /// converted.</param> + /// <returns>The matching message converted to NMS, or null.</returns> + private IMessage InternalMatch(Message message, bool convertBody) + { + if(messageConverterEx == null) + { + IMessage nmsMessage = messageConverter.ToNmsMessage(message); + + evaluationContext.Message = nmsMessage; + + if(selectionExpression.Matches(evaluationContext)) + { + return nmsMessage; + } + } + else + { + // This version converts the message body only for those + // messages matching the selection criteria. + // Relies on MessageConverterEx for partial conversions. + IMessage nmsMessage = messageConverterEx.ToNmsMessage( + message, false); + + evaluationContext.Message = nmsMessage; + + if(selectionExpression.Matches(evaluationContext)) + { + if(convertBody) + { + messageConverterEx.ConvertMessageBodyToNMS( + message, nmsMessage); + } + + return nmsMessage; + } + } + + return null; + } + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. + /// </summary> + /// <param name="message">MSMQ message.</param> + /// <return>true if the message matches the selection criteria.</return> + public override bool Matches(Message message) + { + IMessage nmsMessage = messageConverterEx == null ? + messageConverter.ToNmsMessage(message) : + messageConverterEx.ToNmsMessage(message, false); + + evaluationContext.Message = nmsMessage; + + return selectionExpression.Matches(evaluationContext); + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/IMessageReader.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/IMessageReader.cs b/src/main/csharp/Readers/IMessageReader.cs index 8168664..c36323f 100644 --- a/src/main/csharp/Readers/IMessageReader.cs +++ b/src/main/csharp/Readers/IMessageReader.cs @@ -1,93 +1,93 @@ -using System; -using System.Messaging; -using Apache.NMS.MSMQ; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// MSMQ message reader. - /// </summary> - public interface IMessageReader - { - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available. - /// </summary> - /// <returns>Peeked message.</returns> - IMessage Peek(); - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available or the specified time-out occurs. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Peeked message.</returns> - IMessage Peek(TimeSpan timeSpan); - - /// <summary> - /// Receives the first message available in the queue referenced by - /// the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <returns>Received message.</returns> - IMessage Receive(); - - /// <summary> - /// Receives the first message available in the queue referenced by the - /// MessageQueue matching the selection criteria, and waits until either - /// a message is available in the queue, or the time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Received message.</returns> - IMessage Receive(TimeSpan timeSpan); - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - IMessage Receive(MessageQueueTransaction transaction); - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - IMessage Receive(TimeSpan timeSpan, MessageQueueTransaction transaction); - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. - /// </summary> - /// <param name="message">MSMQ message.</param> - /// <return>true if the message matches the selection criteria.</return> - bool Matches(Message message); - } -} +using System; +using System.Messaging; +using Apache.NMS.MSMQ; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// MSMQ message reader. + /// </summary> + public interface IMessageReader + { + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available. + /// </summary> + /// <returns>Peeked message.</returns> + IMessage Peek(); + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available or the specified time-out occurs. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Peeked message.</returns> + IMessage Peek(TimeSpan timeSpan); + + /// <summary> + /// Receives the first message available in the queue referenced by + /// the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <returns>Received message.</returns> + IMessage Receive(); + + /// <summary> + /// Receives the first message available in the queue referenced by the + /// MessageQueue matching the selection criteria, and waits until either + /// a message is available in the queue, or the time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Received message.</returns> + IMessage Receive(TimeSpan timeSpan); + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + IMessage Receive(MessageQueueTransaction transaction); + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + IMessage Receive(TimeSpan timeSpan, MessageQueueTransaction transaction); + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. + /// </summary> + /// <param name="message">MSMQ message.</param> + /// <return>true if the message matches the selection criteria.</return> + bool Matches(Message message); + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/MessageReaderUtil.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/MessageReaderUtil.cs b/src/main/csharp/Readers/MessageReaderUtil.cs index c303965..97d62c3 100644 --- a/src/main/csharp/Readers/MessageReaderUtil.cs +++ b/src/main/csharp/Readers/MessageReaderUtil.cs @@ -1,91 +1,91 @@ -using System; -using System.Messaging; -using System.Globalization; -using System.Text.RegularExpressions; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// Utility routines for creating MSMQ message readers. - /// </summary> - public static class MessageReaderUtil - { - private static Regex basicSelectorRegex = - new Regex(@"^\s*" + - @"(NMSMessageId)\s*=\s*'([^']*)'|" + - @"(NMSCorrelationId)\s*=\s*'([^']*)'|" + - @"(LookupId)\s*=\s*([-+]{0,1}\d+)" + - @"\s*$", - RegexOptions.IgnoreCase | RegexOptions.Compiled); - - /// <summary> - /// Creates a message reader for the specified message selector. - /// </summary> - /// <param name="messageQueue">The MSMQ message queue from which - /// messages will be read.</param> - /// <param name="messageConverter">A message converter for mapping - /// MSMQ messages to NMS messages.</param> - /// <param name="selector">The message selector.</param> - /// <return>A reader for the specified selector.</return> - public static IMessageReader CreateMessageReader( - MessageQueue messageQueue, IMessageConverter messageConverter, - string selector) - { - IMessageReader reader; - - if(string.IsNullOrEmpty(selector)) - { - reader = new NonFilteringMessageReader(messageQueue, - messageConverter); - } - else - { - Match match = basicSelectorRegex.Match(selector); - if(match.Success) - { - if(!string.IsNullOrEmpty(match.Groups[1].Value)) - { - reader = new ByIdMessageReader(messageQueue, - messageConverter, match.Groups[2].Value); - } - else if(!string.IsNullOrEmpty(match.Groups[3].Value)) - { - reader = new ByCorrelationIdMessageReader(messageQueue, - messageConverter, match.Groups[4].Value); - } - else - { - Int64 lookupId = Int64.Parse(match.Groups[6].Value, - CultureInfo.InvariantCulture); - - reader = new ByLookupIdMessageReader(messageQueue, - messageConverter, lookupId); - } - } - else - { - reader = new BySelectorMessageReader(messageQueue, - messageConverter, selector); - } - } - - return reader; - } - } -} +using System; +using System.Messaging; +using System.Globalization; +using System.Text.RegularExpressions; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// Utility routines for creating MSMQ message readers. + /// </summary> + public static class MessageReaderUtil + { + private static Regex basicSelectorRegex = + new Regex(@"^\s*" + + @"(NMSMessageId)\s*=\s*'([^']*)'|" + + @"(NMSCorrelationId)\s*=\s*'([^']*)'|" + + @"(LookupId)\s*=\s*([-+]{0,1}\d+)" + + @"\s*$", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + /// <summary> + /// Creates a message reader for the specified message selector. + /// </summary> + /// <param name="messageQueue">The MSMQ message queue from which + /// messages will be read.</param> + /// <param name="messageConverter">A message converter for mapping + /// MSMQ messages to NMS messages.</param> + /// <param name="selector">The message selector.</param> + /// <return>A reader for the specified selector.</return> + public static IMessageReader CreateMessageReader( + MessageQueue messageQueue, IMessageConverter messageConverter, + string selector) + { + IMessageReader reader; + + if(string.IsNullOrEmpty(selector)) + { + reader = new NonFilteringMessageReader(messageQueue, + messageConverter); + } + else + { + Match match = basicSelectorRegex.Match(selector); + if(match.Success) + { + if(!string.IsNullOrEmpty(match.Groups[1].Value)) + { + reader = new ByIdMessageReader(messageQueue, + messageConverter, match.Groups[2].Value); + } + else if(!string.IsNullOrEmpty(match.Groups[3].Value)) + { + reader = new ByCorrelationIdMessageReader(messageQueue, + messageConverter, match.Groups[4].Value); + } + else + { + Int64 lookupId = Int64.Parse(match.Groups[6].Value, + CultureInfo.InvariantCulture); + + reader = new ByLookupIdMessageReader(messageQueue, + messageConverter, lookupId); + } + } + else + { + reader = new BySelectorMessageReader(messageQueue, + messageConverter, selector); + } + } + + return reader; + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Readers/NonFilteringMessageReader.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Readers/NonFilteringMessageReader.cs b/src/main/csharp/Readers/NonFilteringMessageReader.cs index ea98baf..0b9ff7b 100644 --- a/src/main/csharp/Readers/NonFilteringMessageReader.cs +++ b/src/main/csharp/Readers/NonFilteringMessageReader.cs @@ -1,128 +1,128 @@ -using System; -using System.Messaging; -using Apache.NMS.MSMQ; -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.MSMQ.Readers -{ - /// <summary> - /// MSMQ message reader, returning all messages, without filtering. - /// </summary> - public class NonFilteringMessageReader : AbstractMessageReader - { - /// <summary> - /// Constructor. - /// </summary> - /// <param name="messageQueue">The MSMQ message queue from which - /// messages will be read.</param> - /// <param name="messageConverter">A message converter for mapping - /// MSMQ messages to NMS messages.</param> - public NonFilteringMessageReader(MessageQueue messageQueue, - IMessageConverter messageConverter) - : base(messageQueue, messageConverter) - { - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available. - /// </summary> - /// <returns>Peeked message.</returns> - public override IMessage Peek() - { - return Convert(messageQueue.Peek()); - } - - /// <summary> - /// Returns without removing (peeks) the first message in the queue - /// referenced by this MessageQueue matching the selection criteria. - /// The Peek method is synchronous, so it blocks the current thread - /// until a message becomes available or the specified time-out occurs. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Peeked message.</returns> - public override IMessage Peek(TimeSpan timeSpan) - { - return Convert(messageQueue.Peek(timeSpan)); - } - - /// <summary> - /// Receives the first message available in the queue referenced by - /// the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <returns>Received message.</returns> - public override IMessage Receive() - { - return Convert(messageQueue.Receive()); - } - - /// <summary> - /// Receives the first message available in the queue referenced by the - /// MessageQueue matching the selection criteria, and waits until either - /// a message is available in the queue, or the time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan) - { - return Convert(messageQueue.Receive(timeSpan)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria. - /// This call is synchronous, and blocks the current thread of execution - /// until a message is available. - /// </summary> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(MessageQueueTransaction transaction) - { - return Convert(messageQueue.Receive(transaction)); - } - - /// <summary> - /// Receives the first message available in the transactional queue - /// referenced by the MessageQueue matching the selection criteria, - /// and waits until either a message is available in the queue, or the - /// time-out expires. - /// </summary> - /// <param name="timeSpan">Reception time-out.</param> - /// <param name="transaction">Transaction.</param> - /// <returns>Received message.</returns> - public override IMessage Receive(TimeSpan timeSpan, - MessageQueueTransaction transaction) - { - return Convert(messageQueue.Receive(timeSpan, transaction)); - } - - /// <summary> - /// Checks if an MSMQ message matches the selection criteria. - /// </summary> - /// <param name="message">MSMQ message.</param> - /// <return>true if the message matches the selection criteria.</return> - public override bool Matches(Message message) - { - return true; - } - } -} +using System; +using System.Messaging; +using Apache.NMS.MSMQ; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Apache.NMS.MSMQ.Readers +{ + /// <summary> + /// MSMQ message reader, returning all messages, without filtering. + /// </summary> + public class NonFilteringMessageReader : AbstractMessageReader + { + /// <summary> + /// Constructor. + /// </summary> + /// <param name="messageQueue">The MSMQ message queue from which + /// messages will be read.</param> + /// <param name="messageConverter">A message converter for mapping + /// MSMQ messages to NMS messages.</param> + public NonFilteringMessageReader(MessageQueue messageQueue, + IMessageConverter messageConverter) + : base(messageQueue, messageConverter) + { + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available. + /// </summary> + /// <returns>Peeked message.</returns> + public override IMessage Peek() + { + return Convert(messageQueue.Peek()); + } + + /// <summary> + /// Returns without removing (peeks) the first message in the queue + /// referenced by this MessageQueue matching the selection criteria. + /// The Peek method is synchronous, so it blocks the current thread + /// until a message becomes available or the specified time-out occurs. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Peeked message.</returns> + public override IMessage Peek(TimeSpan timeSpan) + { + return Convert(messageQueue.Peek(timeSpan)); + } + + /// <summary> + /// Receives the first message available in the queue referenced by + /// the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <returns>Received message.</returns> + public override IMessage Receive() + { + return Convert(messageQueue.Receive()); + } + + /// <summary> + /// Receives the first message available in the queue referenced by the + /// MessageQueue matching the selection criteria, and waits until either + /// a message is available in the queue, or the time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan) + { + return Convert(messageQueue.Receive(timeSpan)); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria. + /// This call is synchronous, and blocks the current thread of execution + /// until a message is available. + /// </summary> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(MessageQueueTransaction transaction) + { + return Convert(messageQueue.Receive(transaction)); + } + + /// <summary> + /// Receives the first message available in the transactional queue + /// referenced by the MessageQueue matching the selection criteria, + /// and waits until either a message is available in the queue, or the + /// time-out expires. + /// </summary> + /// <param name="timeSpan">Reception time-out.</param> + /// <param name="transaction">Transaction.</param> + /// <returns>Received message.</returns> + public override IMessage Receive(TimeSpan timeSpan, + MessageQueueTransaction transaction) + { + return Convert(messageQueue.Receive(timeSpan, transaction)); + } + + /// <summary> + /// Checks if an MSMQ message matches the selection criteria. + /// </summary> + /// <param name="message">MSMQ message.</param> + /// <return>true if the message matches the selection criteria.</return> + public override bool Matches(Message message) + { + return true; + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/7274a80a/src/main/csharp/Selector/ANDExpression.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Selector/ANDExpression.cs b/src/main/csharp/Selector/ANDExpression.cs index 285efe3..976eacc 100644 --- a/src/main/csharp/Selector/ANDExpression.cs +++ b/src/main/csharp/Selector/ANDExpression.cs @@ -1,47 +1,46 @@ -using System; -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.NMS.Selector -{ - /// <summary> - /// A filter performing a logical AND combination of two expressions. - /// </summary> - public class ANDExpression : LogicExpression - { - protected override string ExpressionSymbol - { - get { return "AND"; } - } - - public ANDExpression(IBooleanExpression left, IBooleanExpression right) - : base(left, right) - { - } - - public override object Evaluate(MessageEvaluationContext message) - { - object lvalue = Left.Evaluate(message); - if(lvalue == null) return null; - if(!(bool)lvalue) return false; - - object rvalue = Right.Evaluate(message); - return rvalue == null ? null : rvalue; - } - } -} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System; + +namespace Apache.NMS.Selector +{ + /// <summary> + /// A filter performing a logical AND combination of two expressions. + /// </summary> + public class ANDExpression : LogicExpression + { + protected override string ExpressionSymbol + { + get { return "AND"; } + } + + public ANDExpression(IBooleanExpression left, IBooleanExpression right) + : base(left, right) + { + } + + public override object Evaluate(MessageEvaluationContext message) + { + object lvalue = Left.Evaluate(message); + if(lvalue == null) return null; + if(!(bool)lvalue) return false; + + object rvalue = Right.Evaluate(message); + return rvalue == null ? null : rvalue; + } + } +}
