コード例 #1
0
        private static async Task <long> ProcessNextMessagesWithSessionStateAsync(SubscriptionClient client, IMessageSession session, SessionStateManager session_state, ConsoleColor color)
        {
            int x = session_state.LastProcessedCount + 1;

            long seq2 = 0;

            while (true)
            {
                if (!session_state.DeferredList.TryGetValue(x, out seq2))
                {
                    break;
                }

                //-------------------------------
                var deferredMessage = await session.ReceiveDeferredMessageAsync(seq2);

                if (ProcessMessages(deferredMessage, color))
                {
                    await session.CompleteAsync(deferredMessage.SystemProperties.LockToken);

                    if (deferredMessage.UserProperties["IsLast"].ToString().ToLower() == "true")
                    {
                        //end of the session
                        await session.SetStateAsync(null);

                        await session.CloseAsync();
                    }
                    else
                    {
                        session_state.LastProcessedCount = ((int)deferredMessage.UserProperties["Order"]);
                        session_state.DeferredList.Remove(x);
                        await session.SetStateAsync(Serialize <SessionStateManager>(session_state));
                    }
                }
                else
                {
                    await client.DeadLetterAsync(deferredMessage.SystemProperties.LockToken, "Message is of the wrong type or could not be processed", "Cannot deserialize this message as the type is unknown.");

                    session_state.DeferredList.Remove(x);
                    await session.SetStateAsync(Serialize <SessionStateManager>(session_state));
                }

                //------------------------------

                x++;
            }

            return(seq2);
        }
コード例 #2
0
        private static async Task <long> ProcessNextMessagesWithSessionStateAsync(SubscriptionClient client, IMessageSession session, SessionStateManager session_state, int EndOfSessionCount, ConsoleColor color)
        {
            int x = session_state.LastProcessedCount + 1;

            long seq2 = 0;

            if (session_state.DeferredList.TryGetValue(x, out long seq1))
            {
                while (true)
                {
                    if (!session_state.DeferredList.TryGetValue(x, out seq2))
                    {
                        break;
                    }

                    //-------------------------------
                    var deferredMessage = await session.ReceiveDeferredMessageAsync(seq2);

                    if (ProcessMessages(deferredMessage, Color.White))
                    {
                        await session.CompleteAsync(deferredMessage.SystemProperties.LockToken);

                        session_state.LastProcessedCount = ((int)deferredMessage.UserProperties["Count"]);
                        session_state.DeferredList.Remove(x);
                        await session.SetStateAsync(Utils.Serialize <SessionStateManager>(session_state));
                    }
                    else
                    {
                        await client.DeadLetterAsync(deferredMessage.SystemProperties.LockToken, "Message is of the wrong type", "Cannot deserialize this message as the type in the Label prop is unknown.");

                        session_state.DeferredList.Remove(x);
                        await session.SetStateAsync(Utils.Serialize <SessionStateManager>(session_state));
                    }

                    //------------------------------

                    x++;
                }
            }

            return(seq2);
        }
        /// <inheritdoc/>
        public async Task SetWorkflowStateAsync(IMessageSession session, SessionWorkflowState state)
        {
            byte[] bytes = null;
            if (state != null)
            {
                var json = JsonConvert.SerializeObject(state);
                bytes = Encoding.UTF8.GetBytes(json);
            }

            await session.SetStateAsync(bytes);
        }
        async Task OperationsOnMessageSessionAfterCloseShouldThrowObjectDisposedExceptionTest()
        {
            var             sender          = new MessageSender(TestUtility.NamespaceConnectionString, TestConstants.SessionNonPartitionedQueueName);
            var             sessionClient   = new SessionClient(TestUtility.NamespaceConnectionString, TestConstants.SessionNonPartitionedQueueName);
            IMessageSession sessionReceiver = null;

            try
            {
                var messageId = "test-message1";
                var sessionId = Guid.NewGuid().ToString();
                await sender.SendAsync(new Message { MessageId = messageId, SessionId = sessionId });

                TestUtility.Log($"Sent Message: {messageId} to Session: {sessionId}");

                sessionReceiver = await sessionClient.AcceptMessageSessionAsync(sessionId);

                Assert.NotNull(sessionReceiver);
                TestUtility.Log($"Received Session: SessionId: {sessionReceiver.SessionId}: LockedUntilUtc: {sessionReceiver.LockedUntilUtc}");

                await sessionReceiver.CloseAsync();

                await Assert.ThrowsAsync <ObjectDisposedException>(async() => await sessionReceiver.ReceiveAsync());

                await Assert.ThrowsAsync <ObjectDisposedException>(async() => await sessionReceiver.GetStateAsync());

                await Assert.ThrowsAsync <ObjectDisposedException>(async() => await sessionReceiver.SetStateAsync(null));

                sessionReceiver = await sessionClient.AcceptMessageSessionAsync(sessionId);

                Assert.NotNull(sessionReceiver);
                TestUtility.Log($"Reaccept Session: SessionId: {sessionReceiver.SessionId}: LockedUntilUtc: {sessionReceiver.LockedUntilUtc}");

                var message = await sessionReceiver.ReceiveAsync();

                Assert.True(message.MessageId == messageId);
                TestUtility.Log($"Received Message: MessageId: {message.MessageId}");
                await sessionReceiver.CompleteAsync(message.SystemProperties.LockToken);

                await sessionReceiver.CloseAsync();
            }
            finally
            {
                await sender.CloseAsync();

                await sessionClient.CloseAsync();
            }
        }
コード例 #5
0
 public Task SetStateAsync(byte[] sessionState)
 {
     return _session.SetStateAsync(sessionState);
 }
        /// <inheritdoc/>
        public async Task <SessionWorkflowState> ResetWorkflowStateAsync(IMessageSession session)
        {
            await session.SetStateAsync(null);

            return(new SessionWorkflowState());
        }