1
.NET AQを使用して、.NET 4.7でアプリケーションのキューイング・システムを構築しようとしています。Oracleアドバンスト・キュー - コミット/ロールバックのデキュー
私たちの問題は、他の命令を含む上位レベルのトランザクションでデキュープロセスを包み込み、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();
}
}
デキューは常にトランザクションをコミットし、キューからメッセージを完全に削除し、ロールバックを実行する場合でも、代わりにコミットします。だれかがデキューするとうまくいかない理由を知っていますか?
にそれを渡します。また、検査の機会がなくてもエラーを投げ捨てる例外ハンドラは使用しないでください。 –
私は、メッセージがロールバックを実行した後でも、キューからデキューした後にキューから永久に削除されてしまうことを意味します。 –