예제 #1
0
        public OutboundMessage(IOperationData data)
        {
            this.data = data;

            var sizes        = data.Select(elem => elem.Count).ToArray();
            var segmentCount = sizes.Length;

            this.headerBuffer = new byte[sizeof(Int32) + segmentCount * sizeof(Int32)];
            var ms = new MemoryStream(this.headerBuffer);

            ms.Write(BitConverter.GetBytes(segmentCount), 0, sizeof(Int32));
            foreach (var i in sizes)
            {
                ms.Write(BitConverter.GetBytes(i), 0, sizeof(Int32));
            }
        }
        public unsafe NativeRuntime.IFabricOperationData CreateOperationData(IOperationData data)
        {
            if (data == null)
            {
                return(null);
            }

            uint[] sizes = data.Select(element => (uint)element.Count).ToArray();

            if (sizes.Length == 0)
            {
                return(null);
            }

            return(CreateNativeOperationData(data, sizes));
        }
예제 #3
0
        /// <summary>
        /// Receive and record the message (used for verification)
        /// </summary>
        /// <returns></returns>
        private bool ReceiveAndRecordMessages()
        {
            bool sessionClosed  = false;
            bool sessionAborted = false;

            int messageSequence = 0;
            int messageNumber;

            LogHelper.Log("SessionId: {0}; Entering ReceiveAndRecordMessages", this.SessionId);

            while (!sessionClosed && !sessionAborted)
            {
                try
                {
                    byte[][] dataReceived;

                    Task <IOperationData> receiveTask = this.InboundSession.ReceiveAsync(new CancellationToken());
                    receiveTask.Wait();
                    IOperationData receivedMessageData = receiveTask.Result;
                    dataReceived = receivedMessageData.Select(element => element.Array).ToArray();

                    byte[] flatReceivedMessage   = Flatten(dataReceived);
                    int[]  parsedReceivedMessage = ParseMessage(flatReceivedMessage);

                    messageNumber = parsedReceivedMessage[0];

                    // ordered delivery check
                    Assert.AreEqual(messageNumber, messageSequence, "Message# {0} received out of order", messageNumber);

                    Assert.IsNull(this.flatMessagesReceived[messageNumber],
                                  "flatMessagesReceived[{0}] non-null while being initialized", messageNumber);
                    this.flatMessagesReceived[messageNumber]   = flatReceivedMessage;
                    this.actualMessagesReceived[messageNumber] = dataReceived;

                    int messageLength = this.flatMessagesReceived[messageNumber].Length;
                    this.totalBytesReceived += messageLength;

                    LogHelper.Log("SessionId: {0}; received message# {1} size {2}", this.SessionId, messageNumber, messageLength);
                }
                catch (AggregateException e)
                {
                    Exception inner = e.InnerException.InnerException;
                    Assert.AreEqual(inner.GetType(), typeof(COMException),
                                    "Unexpected AggregateException {0} from ReceiveAsync", inner.GetType().ToString());
                    COMException realException = (COMException)inner;
                    uint         hresult       = (uint)realException.ErrorCode;
                    // Normal close scenario
                    uint expectedCloseError = (uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_OBJECT_CLOSED;
                    // If a session abort happened after DequeueOperation was started but before it completed
                    uint expectedCancelError = (uint)NativeTypes.FABRIC_ERROR_CODE.E_ABORT;
                    Assert.IsTrue(expectedCloseError == hresult || expectedCancelError == hresult,
                                  "Unexpected error HRESULT code {0} from ReceiveAsync", hresult);
                    sessionClosed = true;
                }
                catch (System.Fabric.FabricObjectClosedException e)
                {
                    LogHelper.Log("SessionId: {0}; standard exception {1} from ReceiveAsync", this.SessionId, e.GetType());
                    sessionAborted = true;
                }
                catch (Exception e)
                {
                    Assert.AreEqual(e.GetType(), typeof(InvalidOperationException),
                                    "Unexpected standard exception {0} from ReceiveAsync", e.GetType().ToString());
                    sessionAborted = true;
                }

                messageSequence++;
            }

            LogHelper.Log("SessionId: {0}; Exiting ReceiveAndRecordMessages", this.SessionId);

            return(sessionAborted);
        }