2010-04-06 Jb Evain <jbevain@novell.com>
[mcs.git] / class / Mono.Messaging.RabbitMQ / Mono.Messaging.RabbitMQ / RabbitMQMessageQueueTransaction.cs
blob52e3a93cf6c92f06ec12152222c8e1313e5e17af
1 //
2 // Mono.Messaging.RabbitMQ
3 //
4 // Authors:
5 // Michael Barker (mike@middlesoft.co.uk)
6 //
7 // (C) 2008 Michael Barker
8 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System;
32 using System.Collections;
33 using System.ComponentModel;
34 using System.IO;
35 using System.Text;
37 using Mono.Messaging;
39 using RabbitMQ.Client;
40 using RabbitMQ.Client.Content;
41 using RabbitMQ.Client.Events;
42 using RabbitMQ.Client.Exceptions;
43 using RabbitMQ.Client.MessagePatterns;
44 using RabbitMQ.Util;
46 namespace Mono.Messaging.RabbitMQ {
48 public class RabbitMQMessageQueueTransaction : IMessageQueueTransaction {
50 private readonly string txId;
51 private MessageQueueTransactionStatus status = MessageQueueTransactionStatus.Initialized;
52 private IConnection cn = null;
53 private IModel model = null;
54 private String host = null;
55 private bool isDisposed = false;
56 private Object syncObj = new Object ();
58 public RabbitMQMessageQueueTransaction (string txId)
60 this.txId = txId;
63 public MessageQueueTransactionStatus Status {
64 get {
65 lock (syncObj)
66 return status;
70 public void Abort ()
72 lock (syncObj) {
73 if (model != null)
74 model.TxRollback ();
75 status = MessageQueueTransactionStatus.Aborted;
79 public void Begin ()
81 lock (syncObj) {
82 if (status == MessageQueueTransactionStatus.Pending)
83 throw new InvalidOperationException ("Transaction already started");
84 status = MessageQueueTransactionStatus.Pending;
88 public void Commit ()
90 lock (syncObj) {
91 model.TxCommit ();
92 status = MessageQueueTransactionStatus.Committed;
96 public string Id {
97 get { return txId; }
100 public delegate void Send (ref string host, ref IConnection cn,
101 ref IModel model, IMessage msg, string txId);
103 public delegate IMessage Receive (ref string host, ref IConnection cn,
104 ref IModel model, string txId);
106 public void RunSend (Send sendDelegate, IMessage msg)
108 lock (syncObj) {
109 sendDelegate (ref host, ref cn, ref model, msg, Id);
113 public IMessage RunReceive (Receive receiveDelegate)
115 lock (syncObj) {
116 return receiveDelegate (ref host, ref cn, ref model, Id);
120 public void Dispose ()
122 Dispose (true);
123 GC.SuppressFinalize (this);
126 protected virtual void Dispose (bool disposing)
128 lock (syncObj) {
129 if (!isDisposed && disposing) {
130 if (model != null)
131 model.Dispose ();
132 if (cn != null)
133 cn.Dispose ();
134 isDisposed = true;