我们正在尝试使用 Oracle AQ 在 .NET 4.7 中为我们的应用程序构建一个排队系统。
基本上,我们的问题是我们希望将出队过程包装在包含其他指令的上层事务中,并且能够在执行 queue.Dequeue() 指令后“手动”提交或回滚。
到目前为止,这只适用于入队:
using (var tr = con.BeginTransaction())
{
try
{
enqMsg.SenderId = new OracleAQAgent("SUBSCRIBER1");
enqMsg.Payload = new OracleXmlType(con, new XDocument(
new XElement("workflowexecution",
new XElement("id", i),
new XElement("workflowname", Guid.NewGuid().ToString().Substring(0, 8)),
new XElement("requestsource", Guid.NewGuid().ToString().Substring(0, 6)))).ToString());
queue.Enqueue(enqMsg);
//Other instructions here...
tr.Commit();
}
catch (Exception)
{
tr.Rollback();
}
}
使用相同的方法,我们正在尝试执行
queue.Dequeue()
然后提交或回滚,但这似乎不起作用。这是出列片段:
//Queue declaration
queue = new OracleAQQueue("QueueName", con)
{
MessageType = OracleAQMessageType.Xml,
NotificationConsumers = new[] { "SUBSCRIBER1" },
DequeueOptions =
{
ConsumerName = "SUBSCRIBER1",
DequeueMode = OracleAQDequeueMode.Remove,
Visibility = OracleAQVisibilityMode.OnCommit,
}
};
//Dequeueing process
using (var tr = con.BeginTransaction())
{
try
{
OracleAQMessage _deqMsg = queue.Dequeue();
//read the payload
var reader = _deqMsg?.Payload as XmlTextReader;
if (reader != null)
{
reader.Read();
Console.WriteLine("Received message from queue: " + reader.ReadOuterXml());
}
//Further instructions...
tr.Commit();
}
catch (Exception ex)
{
tr.Rollback();
}
}
出队总是提交事务并从队列中永久删除消息,即使在执行回滚而不是提交时也是如此。任何人都知道为什么它不能与出队一起使用?