Beispiel #1
0
        public override async Task Send(HttpClientImpl client, Stream redirectionStream)
        {
            if (_initialised == false)
            {
                await _initTask;
            }

            if (redirectionStream == null)
            {
                redirectionStream = client.Context.Response.OutputStream;
            }

            try
            {
                List <Task>             sendTasks     = new List <Task>();
                List <Task>             continueTasks = new List <Task>();
                CancellationTokenSource source        = new CancellationTokenSource();

                try
                {
                    for (int i = 0; i < _chunks.Count; i++)
                    {
                        var chunk = _chunks[i];

                        MemoryStream outputTo = new MemoryStream();
                        Task         sendTask = chunk.Send(client, outputTo);

                        if (sendTask.Status == TaskStatus.Faulted)
                        {
                            Debug.Assert(chunk.GetType().Name.Contains("CsvChunk"));
                        }

                        sendTasks.Add(sendTask);

                        var continueTask = sendTask.ContinueWith(
                            (previousTask) =>
                        {
                            try
                            {
                                if (source.IsCancellationRequested == false)
                                {
                                    using (outputTo)
                                    {
                                        if (previousTask.Status == TaskStatus.RanToCompletion)
                                        {
                                            outputTo.Position = 0;

                                            lock (redirectionStream)
                                            {
                                                outputTo.CopyTo(redirectionStream);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    Debug.WriteLine("Cancelled");
                                }
                            }
                            catch (Exception ex)
                            {
                                source.Cancel(true);
                            }
                        },
                            source.Token,
                            TaskContinuationOptions.None,
                            TaskScheduler.Current
                            );

                        continueTasks.Add(continueTask);
                    }

                    foreach (var task in sendTasks)
                    {
                        await task;
                    }

                    foreach (var task in continueTasks)
                    {
                        await task;
                    }

                    TracingChunksSource.TraceEvent(TraceEventType.Verbose, TRACEEVENT_OK, "ParallelChunk");

                    //bool allCompleted = Task.WaitAll(tasks.ToArray(), 60000, source.Token);

                    //if(allCompleted == false)
                    //{
                    //  TracingChunksSource.TraceEvent(TraceEventType.Warning, TRACEEVENT_TIMEOUT, client.Context.Request.Url);
                    //}
                }
                catch (AggregateException aex)
                {
                    source.Cancel(true);

                    foreach (var ex in aex.InnerExceptions)
                    {
                        Debug.WriteLine(ex.Message);
                    }
                }
                catch (OperationCanceledException opcex)
                {
                    Debug.WriteLine(opcex.Message);
                }
                catch (Exception ex)
                {
                    source.Cancel(true);
                    Debug.WriteLine(ex.Message);
                }
            }
            finally
            {
            }
        }
Beispiel #2
0
        protected override async Task InternalSend(HttpClientImpl client, Stream outputStream)
        {
            try
            {
                var sendCount = Interlocked.Increment(ref _sendCount);
                TracingChunksSource.TraceInformation("SendCount: {0}", sendCount);

                CsvProcessor.Payload payload = new App.Messaging.CsvProcessor.Payload()
                {
                    IsRequest = true,
                    Sql       = _sql
                };

                var payloadData = CsvProcessor.Payload.Serialize(payload);
                var peerInfo    = Root.ServiceBusInstance.GetLocalService <IPeerManager>().FindRandomPeerForAddress("csvHandler");

                if (peerInfo == null)
                {
                    throw new Exception("No peer was found.");
                }

                ServiceBusMessage message = new ServiceBusMessage("csvHandler", payloadData, DataFormatEnum.BinaryNet, peerInfo.Name);
                var replyReference        = new Reference <ReplyTask <App.Messaging.CsvProcessor.Payload> >();

                TimeSpan started = Watch.Elapsed;
                Root.ServiceBusInstance.SendAsync(message, replyReference);

                await outputStream.WriteAsync(TextAreaStart, 0, TextAreaStart.Length);

                byte[] timeData = System.Text.Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString());
                await outputStream.WriteAsync(timeData, 0, timeData.Length);

                await outputStream.WriteAsync(NewLine, 0, NewLine.Length);

                try
                {
                    var      csvResult = await replyReference.Item;
                    var      ended     = Watch.Elapsed;
                    TimeSpan duration  = (ended - started);

                    if (duration.TotalSeconds > 1)
                    {
                        TracingChunksSource.TraceInformation(duration.TotalSeconds.ToString("0.000"), "CsvChunk.WaitReplyTime");
                    }

                    byte[] data = System.Text.Encoding.UTF8.GetBytes(replyReference.Item.ReplyMessage.Originator);
                    await outputStream.WriteAsync(data, 0, data.Length);

                    await outputStream.WriteAsync(NewLine, 0, NewLine.Length);

                    foreach (var line in csvResult.Result)
                    {
                        data = System.Text.Encoding.UTF8.GetBytes(line);
                        await outputStream.WriteAsync(data, 0, data.Length);

                        await outputStream.WriteAsync(NewLine, 0, NewLine.Length);
                    }
                }
                catch (OperationCanceledException ex)
                {
                    var data = System.Text.Encoding.UTF8.GetBytes(ex.Message);
                    outputStream.Write(data, 0, data.Length);
                }

                await outputStream.WriteAsync(TextAreaEnd, 0, TextAreaEnd.Length);
            }
            catch (Exception ex)
            {
                TracingChunksSource.TraceData(TraceEventType.Error, TRACEEVENT_ERROR, ex);
            }
        }