static void Main(string[] mainArgs) { Options opts = new Options(); opts.Parse(mainArgs); QueueChannelFactory.SetBroker(opts.broker, opts.port); QueueChannelFactory.SetSecurity(opts.ssl, opts.username, opts.password); WarmUpTransactionSubsystem(opts); if (opts.type == ClientType.Publisher) { PublishThread pub = new PublishThread(opts.baseName + "0", "", opts); Thread pubThread = new Thread(pub.Run); pubThread.Start(); pubThread.Join(); } else if (opts.type == ClientType.Subscriber) { SubscribeThread sub = new SubscribeThread(opts.baseName + "0", opts); Thread subThread = new Thread(sub.Run); subThread.Start(); subThread.Join(); } else { InteropDemo(opts); } if (System.Diagnostics.Debugger.IsAttached) { Console.WriteLine("Hit return to continue..."); Console.ReadLine(); } }
static void WarmUpTransactionSubsystem(Options opts) { // see if any use of transactions is expected if ((opts.type == ClientType.Publisher) && (opts.pubTxSize == 0)) { return; } if ((opts.type == ClientType.Subscriber) && (opts.subTxSize == 0)) { return; } if (opts.type == ClientType.InteropDemo) { if ((opts.subTxSize == 0) && (opts.pubTxSize == 0)) { return; } } Console.WriteLine("Initializing transactions"); IRawBodyUtility bodyUtil = new RawEncoderUtility(); // Send a transacted message to nowhere to force the initial registration with MSDTC. // MSDTC insists on verifying it can contact the resource in the manner expected for // recovery. This requires setting up and finishing a separate connection to the // broker by a thread owned by the DTC. Excluding this time allows the existing // reporting mechanisms to better reflect the cost per transaction without requiring // long test runs. IOutputChannel channel = QueueChannelFactory.CreateWriterChannel("amq.direct", Guid.NewGuid().ToString()); Message msg = bodyUtil.CreateMessage("sacrificial transacted message from WcfPerftest"); using (TransactionScope ts = new TransactionScope()) { channel.Send(msg); // abort/rollback ts.Dispose(); } channel.Close(); Console.WriteLine("transaction resource manager ready"); }
public void Run() { IRawBodyUtility bodyUtil = new RawEncoderUtility(); IOutputChannel readyQueue = null; IOutputChannel doneQueue = null; UInt64 batchSize = (UInt64)opts.subTxSize; bool txPending = false; byte[] data = null; try { this.subscribeQueue = QueueChannelFactory.CreateReaderChannel(this.queue); readyQueue = QueueChannelFactory.CreateWriterChannel("", this.Fqn("sub_ready")); doneQueue = QueueChannelFactory.CreateWriterChannel("", this.Fqn("sub_done")); Message msg = bodyUtil.CreateMessage("ready"); readyQueue.Send(msg, TimeSpan.MaxValue); msg.Close(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); Console.WriteLine("receiving {0}", this.msgCount); UInt64 expect = 0; if (batchSize > 0) { Transaction.Current = new CommittableTransaction(); } for (UInt64 i = 0; i < this.msgCount; i++) { msg = subscribeQueue.Receive(TimeSpan.MaxValue); data = bodyUtil.GetBytes(msg, data); msg.Close(); if (data.Length != this.msgSize) { throw new Exception("subscribe message size mismatch"); } UInt64 n = GetSequenceNumber(data); if (n != expect) { throw new Exception(String.Format("message sequence error. expected {0} got {1}", expect, n)); } expect = n + 1; if (batchSize > 0) { txPending = true; if (((i + 1) % batchSize) == 0) { ((CommittableTransaction)Transaction.Current).Commit(); txPending = false; Transaction.Current = new CommittableTransaction(); } } } if (txPending) { ((CommittableTransaction)Transaction.Current).Commit(); } Transaction.Current = null; stopwatch.Stop(); double mps = (msgCount / stopwatch.Elapsed.TotalSeconds); msg = bodyUtil.CreateMessage(String.Format("{0:0.##}", mps)); doneQueue.Send(msg, TimeSpan.MaxValue); msg.Close(); subscribeQueue.Close(); } finally { Close((IChannel)doneQueue); Close((IChannel)this.subscribeQueue); Close(readyQueue); } }
public void Run() { IRawBodyUtility bodyUtil = new RawEncoderUtility(); IInputChannel startQueue = null; IOutputChannel doneQueue = null; UInt64 batchSize = (UInt64)opts.pubTxSize; bool txPending = false; AmqpProperties amqpProperties = null; if (opts.durable) { amqpProperties = new AmqpProperties(); amqpProperties.Durable = true; } try { publishQueue = QueueChannelFactory.CreateWriterChannel(this.destination, this.routingKey); doneQueue = QueueChannelFactory.CreateWriterChannel("", this.Fqn("pub_done")); startQueue = QueueChannelFactory.CreateReaderChannel(this.Fqn("pub_start")); // wait for our start signal Message msg; msg = startQueue.Receive(TimeSpan.MaxValue); Expect(bodyUtil.GetText(msg), "start"); msg.Close(); Stopwatch stopwatch = new Stopwatch(); AsyncCallback sendCallback = new AsyncCallback(this.AsyncSendCB); byte[] data = new byte[this.msgSize]; IAsyncResult sendResult = null; Console.WriteLine("sending {0}", this.msgCount); stopwatch.Start(); if (batchSize > 0) { Transaction.Current = new CommittableTransaction(); } for (UInt64 i = 0; i < this.msgCount; i++) { StampSequenceNo(data, i); msg = bodyUtil.CreateMessage(data); if (amqpProperties != null) { msg.Properties.Add("AmqpProperties", amqpProperties); } sendResult = publishQueue.BeginSend(msg, TimeSpan.MaxValue, sendCallback, msg); if (batchSize > 0) { txPending = true; if (((i + 1) % batchSize) == 0) { ((CommittableTransaction)Transaction.Current).Commit(); txPending = false; Transaction.Current = new CommittableTransaction(); } } } if (txPending) { ((CommittableTransaction)Transaction.Current).Commit(); } Transaction.Current = null; sendResult.AsyncWaitHandle.WaitOne(); stopwatch.Stop(); double mps = (msgCount / stopwatch.Elapsed.TotalSeconds); msg = bodyUtil.CreateMessage(String.Format("{0:0.##}", mps)); doneQueue.Send(msg, TimeSpan.MaxValue); msg.Close(); } finally { Close((IChannel)doneQueue); Close((IChannel)publishQueue); Close(startQueue); } }