You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@qpid.apache.org by Tony Ercolano <to...@microsoft.com> on 2015/02/04 02:58:28 UTC

non-blocking mode in proton-c

I'm new to proton-c, and I'm having a bit of trouble with using a messenger that has been set to non-blocking.

The following code (adjusted slightly to remove password info) attempts to send 10 messages non-blocking.
It appears that if I want to PUSH all the messages out on the wire I have to make an indeterminate number
of pn_messenger_send calls.

That is, the loop at the bottom that tests the status via a tracker will never complete unless I keep invoking
pn_messenger_send after sweeping through the array of trackers.  As this seems odd, my only thought is
that I'm doing it wrong.

I've also included a trace done with PN_TRACE_FRM=1.

Any thoughts would be appreciated.

Thank you,
Tony

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
#include "proton/message.h"
#include "proton/messenger.h"
#include "pncompat/misc_funcs.inc"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <Windows.h>
#define check(messenger)                                                     \
                                                                                                                                                                                                                                                                {                                                                          \
    if(pn_messenger_errno(messenger))                                        \
                                {                                                                        \
      die(__FILE__, __LINE__, pn_error_text(pn_messenger_error(messenger))); \
                                }                                                                        \
                                                                                                                                                                                                                                                                }                                                                          \
void die(const char *file, int line, const char *message)
{
    fprintf(stderr, "%s:%i: %s\n", file, line, message);
    exit(1);
}
void usage(void)
{
    printf("Usage: send [-a addr] [message]\n");
    printf("-a     \tThe target address [amqp[s]://domain[/name]]\n");
    printf("message\tA text string to send.\n");
    exit(0);
}
const char* message_tracker_status(pn_status_t stat)
{
    switch (stat)
    {
        case PN_STATUS_UNKNOWN:
            return "PN_STATUS_UNKNOWN";
        case PN_STATUS_PENDING:
            return "PN_STATUS_PENDING";
        case PN_STATUS_ACCEPTED:
            return "PN_STATUS_ACCEPTED";
        case PN_STATUS_REJECTED:
            return "PN_STATUS_REJECTED";
        case PN_STATUS_RELEASED:
            return "PN_STATUS_RELEASED";
        case PN_STATUS_MODIFIED:
            return "PN_STATUS_MODIFIED";
        case PN_STATUS_ABORTED:
            return "PN_STATUS_ABORTED";
        case PN_STATUS_SETTLED:
            return "PN_STATUS_SETTLED";
        default:
            break;
    }
    return "BIZZARO STATUS";
}
#define ACTUAL_MESSAGES_TO_SEND (10)
#define OUTGOING_WINDOW_SIZE (10)
int main(int argc, char** argv)
{
    // Setup connection
    char  address[] = "amqps://RootManageSharedAccessKey:xxxxxxxxxx=@toercola-ns.servicebus.windows.net/toercola";
    char messageBodies[ACTUAL_MESSAGES_TO_SEND][50];
    pn_message_t * message[ACTUAL_MESSAGES_TO_SEND];
    pn_messenger_t * messenger;
    pn_tracker_t tracker[ACTUAL_MESSAGES_TO_SEND];
    pn_data_t * body;
    int result;
    size_t i;
    // Build up proton messages
    for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
    {
        message[i] = pn_message();
        if (message[i] == NULL)
        {
            printf("Could not allocate message: %d\r\n", i);
        }
        else
        {
            if ((result = pn_message_set_address(message[i], address)) != 0)
            {
                printf("Could not set message address: %d\r\n", result);
            }
            else
            {
                body = pn_message_body(message[i]);
                sprintf(&messageBodies[i][0], "Glorious exhausted warriors %d!!", i);
                pn_data_put_string(body, pn_bytes(strlen(&messageBodies[i][0]), &messageBodies[i][0]));
            }
        }
    }
    // Create proton messenger and setup: Non-Blocking, Outgoing window size
    messenger = pn_messenger("NOT BLOCKING MESSENGER");
    if ((result = pn_messenger_set_blocking(messenger, false)) != 0)
    {
        printf("pn_messenger_set_blocking result: %d\r\n", result);
        check(messenger);
    }
    if ((result = pn_messenger_set_outgoing_window(messenger, OUTGOING_WINDOW_SIZE)) != 0)
    {
        printf("pn_messenger_set_outgoing_window result: %d\r\n", result);
        check(messenger);
    }
    // Load up messages into messenger queue
    for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
    {
        if ((result = pn_messenger_put(messenger, message[i])) != 0)
        {
            printf("Couldn't do the put for message %d, result: %d\r\n", i, result);
        }
        else
        {
            check(messenger);
            //Create a tracker for each message
            tracker[i] = pn_messenger_outgoing_tracker(messenger);
        }
    }
    int j = 0;
    // Monitor status of messages via trackers
    while (1)
    {
        size_t outstandingSends = ACTUAL_MESSAGES_TO_SEND;
        for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
        {
            pn_state_t currentMessageStatus = pn_messenger_status(messenger, tracker[i]);
            printf("%d pass - The actual status of message %d is %s\r\n", j, i, message_tracker_status(currentMessageStatus));
            if (currentMessageStatus != PN_STATUS_PENDING)
            {
                outstandingSends--;
            }
        }
        j++;
        if (outstandingSends)
        {
            pn_messenger_send(messenger,outstandingSends);
            Sleep(100);
        }
        else
        {
            for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
            {
                // Remove trackers for messages that are no longer pending
                result = pn_messenger_settle(messenger, tracker[i],0);
                if (result != 0)
                {
                    printf("error on settling tracker %d\r\n",i);
                }
            }
            break;
        }
    }
    // Cleanup code:
    // Stop messenger
    if (pn_messenger_stop(messenger) == PN_INPROGRESS)
    {
        j = 0;
        while (pn_messenger_stopped(messenger) == false)
        {
            printf("not stopped messenger after: %d\r\n", j);
            j++;
            Sleep(100);
            // For some "bizzar" reason if the messenger is INPROGRESS, need to keep trying to stop it (hitting it over the head with a hammer:)
            pn_messenger_stop(messenger);
        }
    }
    // Free messenger
    pn_messenger_free(messenger);
    for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
    {
        // Free messages
        pn_message_free(message[i]);
    }
    printf("hit enter to exit:");
    getchar();
    return 0;
}

The trace follows:
0 pass - The actual status of message 0 is PN_STATUS_PENDING
0 pass - The actual status of message 1 is PN_STATUS_PENDING
0 pass - The actual status of message 2 is PN_STATUS_PENDING
0 pass - The actual status of message 3 is PN_STATUS_PENDING
0 pass - The actual status of message 4 is PN_STATUS_PENDING
0 pass - The actual status of message 5 is PN_STATUS_PENDING
0 pass - The actual status of message 6 is PN_STATUS_PENDING
0 pass - The actual status of message 7 is PN_STATUS_PENDING
0 pass - The actual status of message 8 is PN_STATUS_PENDING
0 pass - The actual status of message 9 is PN_STATUS_PENDING
1 pass - The actual status of message 0 is PN_STATUS_PENDING
1 pass - The actual status of message 1 is PN_STATUS_PENDING
1 pass - The actual status of message 2 is PN_STATUS_PENDING
1 pass - The actual status of message 3 is PN_STATUS_PENDING
1 pass - The actual status of message 4 is PN_STATUS_PENDING
1 pass - The actual status of message 5 is PN_STATUS_PENDING
1 pass - The actual status of message 6 is PN_STATUS_PENDING
1 pass - The actual status of message 7 is PN_STATUS_PENDING
1 pass - The actual status of message 8 is PN_STATUS_PENDING
1 pass - The actual status of message 9 is PN_STATUS_PENDING
2 pass - The actual status of message 0 is PN_STATUS_PENDING
2 pass - The actual status of message 1 is PN_STATUS_PENDING
2 pass - The actual status of message 2 is PN_STATUS_PENDING
2 pass - The actual status of message 3 is PN_STATUS_PENDING
2 pass - The actual status of message 4 is PN_STATUS_PENDING
2 pass - The actual status of message 5 is PN_STATUS_PENDING
2 pass - The actual status of message 6 is PN_STATUS_PENDING
2 pass - The actual status of message 7 is PN_STATUS_PENDING
2 pass - The actual status of message 8 is PN_STATUS_PENDING
2 pass - The actual status of message 9 is PN_STATUS_PENDING
3 pass - The actual status of message 0 is PN_STATUS_PENDING
3 pass - The actual status of message 1 is PN_STATUS_PENDING
3 pass - The actual status of message 2 is PN_STATUS_PENDING
3 pass - The actual status of message 3 is PN_STATUS_PENDING
3 pass - The actual status of message 4 is PN_STATUS_PENDING
3 pass - The actual status of message 5 is PN_STATUS_PENDING
3 pass - The actual status of message 6 is PN_STATUS_PENDING
3 pass - The actual status of message 7 is PN_STATUS_PENDING
3 pass - The actual status of message 8 is PN_STATUS_PENDING
3 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:  -> SASL
[00929FA0]:0 -> @sasl-init(65) [mechanism=:PLAIN, initial-response=b"\x00RootManageSharedAccessKey\x0xxxxxxxxxxxxxx="]
4 pass - The actual status of message 0 is PN_STATUS_PENDING
4 pass - The actual status of message 1 is PN_STATUS_PENDING
4 pass - The actual status of message 2 is PN_STATUS_PENDING
4 pass - The actual status of message 3 is PN_STATUS_PENDING
4 pass - The actual status of message 4 is PN_STATUS_PENDING
4 pass - The actual status of message 5 is PN_STATUS_PENDING
4 pass - The actual status of message 6 is PN_STATUS_PENDING
4 pass - The actual status of message 7 is PN_STATUS_PENDING
4 pass - The actual status of message 8 is PN_STATUS_PENDING
4 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:  <- SASL
[00929FA0]:0 <- @sasl-mechanisms(64) [sasl-server-mechanisms=@PN_SYMBOL[:PLAIN, :EXTERNAL]]
5 pass - The actual status of message 0 is PN_STATUS_PENDING
5 pass - The actual status of message 1 is PN_STATUS_PENDING
5 pass - The actual status of message 2 is PN_STATUS_PENDING
5 pass - The actual status of message 3 is PN_STATUS_PENDING
5 pass - The actual status of message 4 is PN_STATUS_PENDING
5 pass - The actual status of message 5 is PN_STATUS_PENDING
5 pass - The actual status of message 6 is PN_STATUS_PENDING
5 pass - The actual status of message 7 is PN_STATUS_PENDING
5 pass - The actual status of message 8 is PN_STATUS_PENDING
5 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:0 <- @sasl-outcome(68) [code=0, additional-data=b"Welcome!"]
[00929FA0]:  -> AMQP
[00929FA0]:0 -> @open(16) [container-id="NOT BLOCKING MESSENGER", hostname="toercola-ns.servicebus.windows.net"]
[00929FA0]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=2147483647, outgoing-window=10]
[00929FA0]:0 -> @attach(18) [name="sender-xxx", handle=0, role=false, snd-settle-mode=1, rcv-settle-mode=0, source=@source(40) [address="toercola", durable=0, timeout=0, dynamic=fa
lse], target=@target(41) [address="toercola", durable=0, timeout=0, dynamic=false], initial-delivery-count=0]
6 pass - The actual status of message 0 is PN_STATUS_PENDING
6 pass - The actual status of message 1 is PN_STATUS_PENDING
6 pass - The actual status of message 2 is PN_STATUS_PENDING
6 pass - The actual status of message 3 is PN_STATUS_PENDING
6 pass - The actual status of message 4 is PN_STATUS_PENDING
6 pass - The actual status of message 5 is PN_STATUS_PENDING
6 pass - The actual status of message 6 is PN_STATUS_PENDING
6 pass - The actual status of message 7 is PN_STATUS_PENDING
6 pass - The actual status of message 8 is PN_STATUS_PENDING
6 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:  <- AMQP
[00929FA0]:0 <- @open(16) [container-id="5c816d4ad3a342fbb1fe27f80b7eeb10_G39", max-frame-size=65536, channel-max=4999, idle-time-out=240000]
[00929FA0]:0 <- @begin(17) [remote-channel=0, next-outgoing-id=1, incoming-window=10, outgoing-window=5000, handle-max=255]
[00929FA0]:0 <- @attach(18) [name="sender-xxx", handle=0, role=true, snd-settle-mode=1, rcv-settle-mode=0, source=@source(40) [address="toercola", durable=0, timeout=0, dynamic=fal
se], target=@target(41) [address="toercola", durable=0, timeout=0, dynamic=false], max-message-size=262144, properties={:"com.microsoft:tracking-id"="5c816d4ad3a342fbb1fe27f80b7eeb
10_G39"}]
[00929FA0]:0 <- @flow(19) [next-incoming-id=0, incoming-window=10, next-outgoing-id=1, outgoing-window=5000, handle=0, delivery-count=0, link-credit=300, available=0, echo=false]
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=0, delivery-tag=b"\x00\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 0!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=1, delivery-tag=b"\x01\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 1!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=2, delivery-tag=b"\x02\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 2!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=3, delivery-tag=b"\x03\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 3!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=4, delivery-tag=b"\x04\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 4!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=5, delivery-tag=b"\x05\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 5!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=6, delivery-tag=b"\x06\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 6!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=7, delivery-tag=b"\x07\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 7!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=8, delivery-tag=b"\x08\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 8!!"
[00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=9, delivery-tag=b"\x09\x00\x00\x00\x00\x00\x00\x00", message-format=0, settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@@\xa13amqps://toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted warriors 9!!"
7 pass - The actual status of message 0 is PN_STATUS_PENDING
7 pass - The actual status of message 1 is PN_STATUS_PENDING
7 pass - The actual status of message 2 is PN_STATUS_PENDING
7 pass - The actual status of message 3 is PN_STATUS_PENDING
7 pass - The actual status of message 4 is PN_STATUS_PENDING
7 pass - The actual status of message 5 is PN_STATUS_PENDING
7 pass - The actual status of message 6 is PN_STATUS_PENDING
7 pass - The actual status of message 7 is PN_STATUS_PENDING
7 pass - The actual status of message 8 is PN_STATUS_PENDING
7 pass - The actual status of message 9 is PN_STATUS_PENDING
8 pass - The actual status of message 0 is PN_STATUS_PENDING
8 pass - The actual status of message 1 is PN_STATUS_PENDING
8 pass - The actual status of message 2 is PN_STATUS_PENDING
8 pass - The actual status of message 3 is PN_STATUS_PENDING
8 pass - The actual status of message 4 is PN_STATUS_PENDING
8 pass - The actual status of message 5 is PN_STATUS_PENDING
8 pass - The actual status of message 6 is PN_STATUS_PENDING
8 pass - The actual status of message 7 is PN_STATUS_PENDING
8 pass - The actual status of message 8 is PN_STATUS_PENDING
8 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:0 <- @disposition(21) [role=true, first=0, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @disposition(21) [role=true, first=1, settled=true, state=@accepted(36) []]
9 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
9 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
9 pass - The actual status of message 2 is PN_STATUS_PENDING
9 pass - The actual status of message 3 is PN_STATUS_PENDING
9 pass - The actual status of message 4 is PN_STATUS_PENDING
9 pass - The actual status of message 5 is PN_STATUS_PENDING
9 pass - The actual status of message 6 is PN_STATUS_PENDING
9 pass - The actual status of message 7 is PN_STATUS_PENDING
9 pass - The actual status of message 8 is PN_STATUS_PENDING
9 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:0 <- @disposition(21) [role=true, first=4, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @disposition(21) [role=true, first=2, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @disposition(21) [role=true, first=3, settled=true, state=@accepted(36) []]
10 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
10 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
10 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
10 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
10 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
10 pass - The actual status of message 5 is PN_STATUS_PENDING
10 pass - The actual status of message 6 is PN_STATUS_PENDING
10 pass - The actual status of message 7 is PN_STATUS_PENDING
10 pass - The actual status of message 8 is PN_STATUS_PENDING
10 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:0 <- @disposition(21) [role=true, first=6, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @flow(19) [next-incoming-id=10, incoming-window=6, next-outgoing-id=1, outgoing-window=5000]
[00929FA0]:0 <- @disposition(21) [role=true, first=5, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @disposition(21) [role=true, first=7, settled=true, state=@accepted(36) []]
11 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 5 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 6 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 7 is PN_STATUS_ACCEPTED
11 pass - The actual status of message 8 is PN_STATUS_PENDING
11 pass - The actual status of message 9 is PN_STATUS_PENDING
[00929FA0]:0 <- @disposition(21) [role=true, first=9, settled=true, state=@accepted(36) []]
[00929FA0]:0 <- @disposition(21) [role=true, first=8, settled=true, state=@accepted(36) []]
12 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 5 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 6 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 7 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 8 is PN_STATUS_ACCEPTED
12 pass - The actual status of message 9 is PN_STATUS_ACCEPTED
[00929FA0]:0 -> @detach(22) [handle=0, closed=true]
[00929FA0]:0 -> @close(24) []
not stopped messenger after: 0
[00929FA0]:0 <- @detach(22) [handle=0, closed=true]
[00929FA0]:0 <- @close(24) []
[00929FA0]:  <- EOS
[00929FA0]:  -> EOS
[00929FA0]:  -> EOS
[00929FA0]:  -> EOS
[00929FA0]:  -> EOS
hit enter to exit:

Re: non-blocking mode in proton-c

Posted by Rafael Schloming <rh...@alum.mit.edu>.
This is as expected. When you turn on non blocking mode then operations
will return PN_INPROGRESS instead of blocking. Judging from a quick glance
at the way your code is written, it seems like you actually want to turn
blocking on and then the API will behave more as you expect it to.

--Rafael

On Tue, Feb 3, 2015 at 8:58 PM, Tony Ercolano <to...@microsoft.com>
wrote:

> I'm new to proton-c, and I'm having a bit of trouble with using a
> messenger that has been set to non-blocking.
>
> The following code (adjusted slightly to remove password info) attempts to
> send 10 messages non-blocking.
> It appears that if I want to PUSH all the messages out on the wire I have
> to make an indeterminate number
> of pn_messenger_send calls.
>
> That is, the loop at the bottom that tests the status via a tracker will
> never complete unless I keep invoking
> pn_messenger_send after sweeping through the array of trackers.  As this
> seems odd, my only thought is
> that I'm doing it wrong.
>
> I've also included a trace done with PN_TRACE_FRM=1.
>
> Any thoughts would be appreciated.
>
> Thank you,
> Tony
>
> /*
>  * Licensed to the Apache Software Foundation (ASF) under one
>  * or more contributor license agreements.  See the NOTICE file
>  * distributed with this work for additional information
>  * regarding copyright ownership.  The ASF licenses this file
>  * to you under the Apache License, Version 2.0 (the
>  * "License"); you may not use this file except in compliance
>  * with the License.  You may obtain a copy of the License at
>  *
>  *   http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing,
>  * software distributed under the License is distributed on an
>  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>  * KIND, either express or implied.  See the License for the
>  * specific language governing permissions and limitations
>  * under the License.
>  *
>  */
> #include "proton/message.h"
> #include "proton/messenger.h"
> #include "pncompat/misc_funcs.inc"
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <ctype.h>
> #include <Windows.h>
> #define check(messenger)
>    \
>
>
>
>                               {
>                               \
>     if(pn_messenger_errno(messenger))
>   \
>                                 {
>                               \
>       die(__FILE__, __LINE__,
> pn_error_text(pn_messenger_error(messenger))); \
>                                 }
>                               \
>
>
>
>                               }
>                               \
> void die(const char *file, int line, const char *message)
> {
>     fprintf(stderr, "%s:%i: %s\n", file, line, message);
>     exit(1);
> }
> void usage(void)
> {
>     printf("Usage: send [-a addr] [message]\n");
>     printf("-a     \tThe target address [amqp[s]://domain[/name]]\n");
>     printf("message\tA text string to send.\n");
>     exit(0);
> }
> const char* message_tracker_status(pn_status_t stat)
> {
>     switch (stat)
>     {
>         case PN_STATUS_UNKNOWN:
>             return "PN_STATUS_UNKNOWN";
>         case PN_STATUS_PENDING:
>             return "PN_STATUS_PENDING";
>         case PN_STATUS_ACCEPTED:
>             return "PN_STATUS_ACCEPTED";
>         case PN_STATUS_REJECTED:
>             return "PN_STATUS_REJECTED";
>         case PN_STATUS_RELEASED:
>             return "PN_STATUS_RELEASED";
>         case PN_STATUS_MODIFIED:
>             return "PN_STATUS_MODIFIED";
>         case PN_STATUS_ABORTED:
>             return "PN_STATUS_ABORTED";
>         case PN_STATUS_SETTLED:
>             return "PN_STATUS_SETTLED";
>         default:
>             break;
>     }
>     return "BIZZARO STATUS";
> }
> #define ACTUAL_MESSAGES_TO_SEND (10)
> #define OUTGOING_WINDOW_SIZE (10)
> int main(int argc, char** argv)
> {
>     // Setup connection
>     char  address[] = "amqps://RootManageSharedAccessKey:xxxxxxxxxx=@
> toercola-ns.servicebus.windows.net/toercola";
>     char messageBodies[ACTUAL_MESSAGES_TO_SEND][50];
>     pn_message_t * message[ACTUAL_MESSAGES_TO_SEND];
>     pn_messenger_t * messenger;
>     pn_tracker_t tracker[ACTUAL_MESSAGES_TO_SEND];
>     pn_data_t * body;
>     int result;
>     size_t i;
>     // Build up proton messages
>     for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
>     {
>         message[i] = pn_message();
>         if (message[i] == NULL)
>         {
>             printf("Could not allocate message: %d\r\n", i);
>         }
>         else
>         {
>             if ((result = pn_message_set_address(message[i], address)) !=
> 0)
>             {
>                 printf("Could not set message address: %d\r\n", result);
>             }
>             else
>             {
>                 body = pn_message_body(message[i]);
>                 sprintf(&messageBodies[i][0], "Glorious exhausted warriors
> %d!!", i);
>                 pn_data_put_string(body,
> pn_bytes(strlen(&messageBodies[i][0]), &messageBodies[i][0]));
>             }
>         }
>     }
>     // Create proton messenger and setup: Non-Blocking, Outgoing window
> size
>     messenger = pn_messenger("NOT BLOCKING MESSENGER");
>     if ((result = pn_messenger_set_blocking(messenger, false)) != 0)
>     {
>         printf("pn_messenger_set_blocking result: %d\r\n", result);
>         check(messenger);
>     }
>     if ((result = pn_messenger_set_outgoing_window(messenger,
> OUTGOING_WINDOW_SIZE)) != 0)
>     {
>         printf("pn_messenger_set_outgoing_window result: %d\r\n", result);
>         check(messenger);
>     }
>     // Load up messages into messenger queue
>     for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
>     {
>         if ((result = pn_messenger_put(messenger, message[i])) != 0)
>         {
>             printf("Couldn't do the put for message %d, result: %d\r\n",
> i, result);
>         }
>         else
>         {
>             check(messenger);
>             //Create a tracker for each message
>             tracker[i] = pn_messenger_outgoing_tracker(messenger);
>         }
>     }
>     int j = 0;
>     // Monitor status of messages via trackers
>     while (1)
>     {
>         size_t outstandingSends = ACTUAL_MESSAGES_TO_SEND;
>         for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
>         {
>             pn_state_t currentMessageStatus =
> pn_messenger_status(messenger, tracker[i]);
>             printf("%d pass - The actual status of message %d is %s\r\n",
> j, i, message_tracker_status(currentMessageStatus));
>             if (currentMessageStatus != PN_STATUS_PENDING)
>             {
>                 outstandingSends--;
>             }
>         }
>         j++;
>         if (outstandingSends)
>         {
>             pn_messenger_send(messenger,outstandingSends);
>             Sleep(100);
>         }
>         else
>         {
>             for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
>             {
>                 // Remove trackers for messages that are no longer pending
>                 result = pn_messenger_settle(messenger, tracker[i],0);
>                 if (result != 0)
>                 {
>                     printf("error on settling tracker %d\r\n",i);
>                 }
>             }
>             break;
>         }
>     }
>     // Cleanup code:
>     // Stop messenger
>     if (pn_messenger_stop(messenger) == PN_INPROGRESS)
>     {
>         j = 0;
>         while (pn_messenger_stopped(messenger) == false)
>         {
>             printf("not stopped messenger after: %d\r\n", j);
>             j++;
>             Sleep(100);
>             // For some "bizzar" reason if the messenger is INPROGRESS,
> need to keep trying to stop it (hitting it over the head with a hammer:)
>             pn_messenger_stop(messenger);
>         }
>     }
>     // Free messenger
>     pn_messenger_free(messenger);
>     for (i = 0; i < ACTUAL_MESSAGES_TO_SEND; i++)
>     {
>         // Free messages
>         pn_message_free(message[i]);
>     }
>     printf("hit enter to exit:");
>     getchar();
>     return 0;
> }
>
> The trace follows:
> 0 pass - The actual status of message 0 is PN_STATUS_PENDING
> 0 pass - The actual status of message 1 is PN_STATUS_PENDING
> 0 pass - The actual status of message 2 is PN_STATUS_PENDING
> 0 pass - The actual status of message 3 is PN_STATUS_PENDING
> 0 pass - The actual status of message 4 is PN_STATUS_PENDING
> 0 pass - The actual status of message 5 is PN_STATUS_PENDING
> 0 pass - The actual status of message 6 is PN_STATUS_PENDING
> 0 pass - The actual status of message 7 is PN_STATUS_PENDING
> 0 pass - The actual status of message 8 is PN_STATUS_PENDING
> 0 pass - The actual status of message 9 is PN_STATUS_PENDING
> 1 pass - The actual status of message 0 is PN_STATUS_PENDING
> 1 pass - The actual status of message 1 is PN_STATUS_PENDING
> 1 pass - The actual status of message 2 is PN_STATUS_PENDING
> 1 pass - The actual status of message 3 is PN_STATUS_PENDING
> 1 pass - The actual status of message 4 is PN_STATUS_PENDING
> 1 pass - The actual status of message 5 is PN_STATUS_PENDING
> 1 pass - The actual status of message 6 is PN_STATUS_PENDING
> 1 pass - The actual status of message 7 is PN_STATUS_PENDING
> 1 pass - The actual status of message 8 is PN_STATUS_PENDING
> 1 pass - The actual status of message 9 is PN_STATUS_PENDING
> 2 pass - The actual status of message 0 is PN_STATUS_PENDING
> 2 pass - The actual status of message 1 is PN_STATUS_PENDING
> 2 pass - The actual status of message 2 is PN_STATUS_PENDING
> 2 pass - The actual status of message 3 is PN_STATUS_PENDING
> 2 pass - The actual status of message 4 is PN_STATUS_PENDING
> 2 pass - The actual status of message 5 is PN_STATUS_PENDING
> 2 pass - The actual status of message 6 is PN_STATUS_PENDING
> 2 pass - The actual status of message 7 is PN_STATUS_PENDING
> 2 pass - The actual status of message 8 is PN_STATUS_PENDING
> 2 pass - The actual status of message 9 is PN_STATUS_PENDING
> 3 pass - The actual status of message 0 is PN_STATUS_PENDING
> 3 pass - The actual status of message 1 is PN_STATUS_PENDING
> 3 pass - The actual status of message 2 is PN_STATUS_PENDING
> 3 pass - The actual status of message 3 is PN_STATUS_PENDING
> 3 pass - The actual status of message 4 is PN_STATUS_PENDING
> 3 pass - The actual status of message 5 is PN_STATUS_PENDING
> 3 pass - The actual status of message 6 is PN_STATUS_PENDING
> 3 pass - The actual status of message 7 is PN_STATUS_PENDING
> 3 pass - The actual status of message 8 is PN_STATUS_PENDING
> 3 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:  -> SASL
> [00929FA0]:0 -> @sasl-init(65) [mechanism=:PLAIN,
> initial-response=b"\x00RootManageSharedAccessKey\x0xxxxxxxxxxxxxx="]
> 4 pass - The actual status of message 0 is PN_STATUS_PENDING
> 4 pass - The actual status of message 1 is PN_STATUS_PENDING
> 4 pass - The actual status of message 2 is PN_STATUS_PENDING
> 4 pass - The actual status of message 3 is PN_STATUS_PENDING
> 4 pass - The actual status of message 4 is PN_STATUS_PENDING
> 4 pass - The actual status of message 5 is PN_STATUS_PENDING
> 4 pass - The actual status of message 6 is PN_STATUS_PENDING
> 4 pass - The actual status of message 7 is PN_STATUS_PENDING
> 4 pass - The actual status of message 8 is PN_STATUS_PENDING
> 4 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:  <- SASL
> [00929FA0]:0 <- @sasl-mechanisms(64)
> [sasl-server-mechanisms=@PN_SYMBOL[:PLAIN, :EXTERNAL]]
> 5 pass - The actual status of message 0 is PN_STATUS_PENDING
> 5 pass - The actual status of message 1 is PN_STATUS_PENDING
> 5 pass - The actual status of message 2 is PN_STATUS_PENDING
> 5 pass - The actual status of message 3 is PN_STATUS_PENDING
> 5 pass - The actual status of message 4 is PN_STATUS_PENDING
> 5 pass - The actual status of message 5 is PN_STATUS_PENDING
> 5 pass - The actual status of message 6 is PN_STATUS_PENDING
> 5 pass - The actual status of message 7 is PN_STATUS_PENDING
> 5 pass - The actual status of message 8 is PN_STATUS_PENDING
> 5 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:0 <- @sasl-outcome(68) [code=0, additional-data=b"Welcome!"]
> [00929FA0]:  -> AMQP
> [00929FA0]:0 -> @open(16) [container-id="NOT BLOCKING MESSENGER",
> hostname="toercola-ns.servicebus.windows.net"]
> [00929FA0]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=2147483647,
> outgoing-window=10]
> [00929FA0]:0 -> @attach(18) [name="sender-xxx", handle=0, role=false,
> snd-settle-mode=1, rcv-settle-mode=0, source=@source(40)
> [address="toercola", durable=0, timeout=0, dynamic=fa
> lse], target=@target(41) [address="toercola", durable=0, timeout=0,
> dynamic=false], initial-delivery-count=0]
> 6 pass - The actual status of message 0 is PN_STATUS_PENDING
> 6 pass - The actual status of message 1 is PN_STATUS_PENDING
> 6 pass - The actual status of message 2 is PN_STATUS_PENDING
> 6 pass - The actual status of message 3 is PN_STATUS_PENDING
> 6 pass - The actual status of message 4 is PN_STATUS_PENDING
> 6 pass - The actual status of message 5 is PN_STATUS_PENDING
> 6 pass - The actual status of message 6 is PN_STATUS_PENDING
> 6 pass - The actual status of message 7 is PN_STATUS_PENDING
> 6 pass - The actual status of message 8 is PN_STATUS_PENDING
> 6 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:  <- AMQP
> [00929FA0]:0 <- @open(16)
> [container-id="5c816d4ad3a342fbb1fe27f80b7eeb10_G39", max-frame-size=65536,
> channel-max=4999, idle-time-out=240000]
> [00929FA0]:0 <- @begin(17) [remote-channel=0, next-outgoing-id=1,
> incoming-window=10, outgoing-window=5000, handle-max=255]
> [00929FA0]:0 <- @attach(18) [name="sender-xxx", handle=0, role=true,
> snd-settle-mode=1, rcv-settle-mode=0, source=@source(40)
> [address="toercola", durable=0, timeout=0, dynamic=fal
> se], target=@target(41) [address="toercola", durable=0, timeout=0,
> dynamic=false], max-message-size=262144,
> properties={:"com.microsoft:tracking-id"="5c816d4ad3a342fbb1fe27f80b7eeb
> 10_G39"}]
> [00929FA0]:0 <- @flow(19) [next-incoming-id=0, incoming-window=10,
> next-outgoing-id=1, outgoing-window=5000, handle=0, delivery-count=0,
> link-credit=300, available=0, echo=false]
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=0,
> delivery-tag=b"\x00\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 0!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=1,
> delivery-tag=b"\x01\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 1!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=2,
> delivery-tag=b"\x02\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 2!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=3,
> delivery-tag=b"\x03\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 3!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=4,
> delivery-tag=b"\x04\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 4!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=5,
> delivery-tag=b"\x05\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 5!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=6,
> delivery-tag=b"\x06\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 6!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=7,
> delivery-tag=b"\x07\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 7!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=8,
> delivery-tag=b"\x08\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 8!!"
> [00929FA0]:0 -> @transfer(20) [handle=0, delivery-id=9,
> delivery-tag=b"\x09\x00\x00\x00\x00\x00\x00\x00", message-format=0,
> settled=false, more=false] (149) "\x00Sp\xd0\x00\x00\x00
> \x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x00V\x00\x00\x00\x0d@
> @\xa13amqps://
> toercola-ns.servicebus.windows.net/toercola@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\
> x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x1fGlorious exhausted
> warriors 9!!"
> 7 pass - The actual status of message 0 is PN_STATUS_PENDING
> 7 pass - The actual status of message 1 is PN_STATUS_PENDING
> 7 pass - The actual status of message 2 is PN_STATUS_PENDING
> 7 pass - The actual status of message 3 is PN_STATUS_PENDING
> 7 pass - The actual status of message 4 is PN_STATUS_PENDING
> 7 pass - The actual status of message 5 is PN_STATUS_PENDING
> 7 pass - The actual status of message 6 is PN_STATUS_PENDING
> 7 pass - The actual status of message 7 is PN_STATUS_PENDING
> 7 pass - The actual status of message 8 is PN_STATUS_PENDING
> 7 pass - The actual status of message 9 is PN_STATUS_PENDING
> 8 pass - The actual status of message 0 is PN_STATUS_PENDING
> 8 pass - The actual status of message 1 is PN_STATUS_PENDING
> 8 pass - The actual status of message 2 is PN_STATUS_PENDING
> 8 pass - The actual status of message 3 is PN_STATUS_PENDING
> 8 pass - The actual status of message 4 is PN_STATUS_PENDING
> 8 pass - The actual status of message 5 is PN_STATUS_PENDING
> 8 pass - The actual status of message 6 is PN_STATUS_PENDING
> 8 pass - The actual status of message 7 is PN_STATUS_PENDING
> 8 pass - The actual status of message 8 is PN_STATUS_PENDING
> 8 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:0 <- @disposition(21) [role=true, first=0, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @disposition(21) [role=true, first=1, settled=true,
> state=@accepted(36) []]
> 9 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
> 9 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
> 9 pass - The actual status of message 2 is PN_STATUS_PENDING
> 9 pass - The actual status of message 3 is PN_STATUS_PENDING
> 9 pass - The actual status of message 4 is PN_STATUS_PENDING
> 9 pass - The actual status of message 5 is PN_STATUS_PENDING
> 9 pass - The actual status of message 6 is PN_STATUS_PENDING
> 9 pass - The actual status of message 7 is PN_STATUS_PENDING
> 9 pass - The actual status of message 8 is PN_STATUS_PENDING
> 9 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:0 <- @disposition(21) [role=true, first=4, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @disposition(21) [role=true, first=2, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @disposition(21) [role=true, first=3, settled=true,
> state=@accepted(36) []]
> 10 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
> 10 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
> 10 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
> 10 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
> 10 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
> 10 pass - The actual status of message 5 is PN_STATUS_PENDING
> 10 pass - The actual status of message 6 is PN_STATUS_PENDING
> 10 pass - The actual status of message 7 is PN_STATUS_PENDING
> 10 pass - The actual status of message 8 is PN_STATUS_PENDING
> 10 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:0 <- @disposition(21) [role=true, first=6, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @flow(19) [next-incoming-id=10, incoming-window=6,
> next-outgoing-id=1, outgoing-window=5000]
> [00929FA0]:0 <- @disposition(21) [role=true, first=5, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @disposition(21) [role=true, first=7, settled=true,
> state=@accepted(36) []]
> 11 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 5 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 6 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 7 is PN_STATUS_ACCEPTED
> 11 pass - The actual status of message 8 is PN_STATUS_PENDING
> 11 pass - The actual status of message 9 is PN_STATUS_PENDING
> [00929FA0]:0 <- @disposition(21) [role=true, first=9, settled=true,
> state=@accepted(36) []]
> [00929FA0]:0 <- @disposition(21) [role=true, first=8, settled=true,
> state=@accepted(36) []]
> 12 pass - The actual status of message 0 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 1 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 2 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 3 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 4 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 5 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 6 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 7 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 8 is PN_STATUS_ACCEPTED
> 12 pass - The actual status of message 9 is PN_STATUS_ACCEPTED
> [00929FA0]:0 -> @detach(22) [handle=0, closed=true]
> [00929FA0]:0 -> @close(24) []
> not stopped messenger after: 0
> [00929FA0]:0 <- @detach(22) [handle=0, closed=true]
> [00929FA0]:0 <- @close(24) []
> [00929FA0]:  <- EOS
> [00929FA0]:  -> EOS
> [00929FA0]:  -> EOS
> [00929FA0]:  -> EOS
> [00929FA0]:  -> EOS
> hit enter to exit:
>