我使用IBM XMS.NET创建了一个应用程序。一切都很好,我能够从队列中读取消息。 我想只阅读那些从现在起2分钟以前的那些消息。 在这种情况下如何使用选择器。以下是我创建的代码。
var time = 120000; // 2 mins in miliseconds
var currentTime = (DateTime.Now - DateTime.MinValue).TotalMilliseconds; // current time in milliseconds
long finaltime = Convert.ToInt64(currentTime - time); // Time in milliseconds after substracting 2 minutes
var dtt = Convert.ToInt64(((new DateTime(1970, 01, 01, 01, 00, 00)) - DateTime.MinValue).TotalMilliseconds); // Time in miliseconds till 1970
finaltime = finaltime - dtt; // substracting milliseconds till 1976 as JMSTimestamp shows time after 1970
string selector = "JMSTimestamp <=" + finaltime.ToString();
此处选择器被设置为固定值,例如1454322340382。 我如何设置选择器以选择最新的DateTime.Now然后查找更早的消息DateTime.Now - 2分钟。
答案 0 :(得分:1)
选择那些超过2分钟的邮件可能是查看这些邮件的最低效方式。你不会说你为什么要这样做。如果您只是想丢弃它们,那么我建议您让消息的制作者在这些消息上添加到期时间。
如果您想查看它们,那么浏览所有消息并仅对那些年龄合适的消息进行操作会比选择它们更有效。我很有信心。
答案 1 :(得分:0)
因为选择器在创建使用者时作为参数传递,所以可以在不关闭和重新创建消费者的情况下更改它。
MessageConsumer receiver;
receiver = session.createConsumer(stockQueue, selector);
<强>更新强>
在创建消费者期间会对选择器表达式进行评估。该 DateTime.Now - 2表达式求值为固定值且不会更改。例如“JMSTimestamp&lt; = 1454322340382”。因此,当使用该选择字符串创建使用者时,使用者将仅获得符合上述条件的消息。
虽然上述情况很好。但是当消费者收到消息时,新消息可以进入队列。消费者试图获取消息时,这些消息可能会超过2分钟。消费者即使超过两分钟也不会收到这些消息,因为他们的JMSTimestamp
更高,例如1454666666666.要删除此类消息,您必须关闭消费者并使用更新的选择器条件再次创建消息。
希望我很清楚。
对于您的用例,我会选择MQ Base .NET API而不是XMS .NET。首先浏览消息,如果消息超过2分钟,则将其删除。
queueBrowse = queueManager.AccessQueue(strQueueName, MQC.MQOO_BROWSE + MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
try
{
MQMessage msgBrowse = new MQMessage();
MQGetMessageOptions mqgmoBrowse = new MQGetMessageOptions();
mqgmoBrowse.Options = MQC.MQGMO_BROWSE_NEXT;
queueBrowse.Get(msgBrowse, mqgmoBrowse);
TimeSpan ts = DateTime.Now.ToUniversalTime().Subtract(msgBrowse.PutDateTime);
if (ts.TotalMinutes > 2)
{
MQMessage msgDelete = new MQMessage();
msgDelete.MessageId = msgBrowse.MessageId;
MQGetMessageOptions mqgmo = new MQGetMessageOptions();
mqgmo.MatchOptions = MQC.MQMO_MATCH_MSG_ID;
queueBrowse.Get(msgDelete, mqgmo);
Console.WriteLine("Message older than 2 minutes deleted");
}
else
{
Console.WriteLine("Message not older than 2 minutes");
}
}
catch (MQException ex)
{
}