[client]    - proton-c: tags\0.12.2
[broker]  - ActiveMQ 5.16.4 / Java SE 1.8.0_281-b09
[HD/OS]  - SPARC-M8 sun4v/Solaris 10

Issue
================================
Proton-C AMQP 1.0 client consumes messages from ActiveMQ 5.16.4 broker, but
broker does not remove message from the queue and does not increment
'Dequeue#' count.


================================
Summary
================================
Compiled Proton-C 0.12.2 on Solaris 10/cmake 2.8.0/gcc 4.2 with minor change
to src/posix/io.c [see footnote 1]. Tested simple message exchange using
provided send/recv and send-async/recv-async clients as-is, no code changes.
Sender produces successfully, no errors. Receiver gets message, prints body;
no errors. But broker never remove message from the queue, nor does broker
increment JMX "Dequeue" stat. My experience with ActiveMQ and JMS are
extensive, but very limited with AMQP protocol, so I don't know if this
issue is caused by not using appropriate delivery and/or settlement modes -
or not accepting or acknowledging messages correctly in the client, or if
the issue resides in the broker.     

Why not build a more recent version of Proton? 
Of course we would like to, but current hardware/software constraints beyond
our control prohibit us from using cmake above version 2.8.0 in Solaris. and
the most recent version of the source Proton-C 0.12.2 is the latest source
we can build as later versions of the code require cmake 3.0+.


================================
TEST PROCEDURE
================================
Test queue: q13

[Start Receiver]
------------------------------------------------
>  recv amqp://0.0.0.0:5672/q13
[28a98]:  -> AMQP
[28a98]:0 -> @open(16) [container-id="B01C2C42-962E-4C6C-9A05-2841AF174F49",
hostname="0.0.0.0", channel-max=32767]
[28a98]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=2147483647,
outgoing-window=2147483647]
[28a98]:0 -> @attach(18) [name="q13", handle=0, role=true,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13",
durable=0, timeout=0, dynamic=false], target=@target(41) [address="q13",
durable=0, timeout=0, dynamic=false], initial-delivery-count=0]
[28a98]:0 -> @flow(19) [incoming-window=2147483647, next-outgoing-id=0,
outgoing-window=2147483647, handle=0, delivery-count=0, link-credit=1024,
drain=false]
[28a98]:  <- AMQP
[28a98]:0 <- @open(16) [container-id="localhost", max-frame-size=131072,
channel-max=32767, offered-capabilities=@PN_SYMBOL[:"ANONYMOUS-RELAY",
:"DELAYED_DELIVERY"], properties={:product="ActiveMQ",
:"topic-prefix"="topic://", :"queue-prefix"="queue://", :version="5.16.4",
:platform="Java/1.8.0_281"}]
[28a98]:0 <- @begin(17) [remote-channel=0, next-outgoing-id=1,
incoming-window=16383, outgoing-window=2147483647, handle-max=65535]
[28a98]:0 <- @attach(18) [name="q13", handle=0, role=false,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13"],
target=@target(41) [address="q13"], incomplete-unsettled=false,
initial-delivery-count=0]


bin/activemq dstat queue (looks ok)
------------------------------------
Name         Queue Size  Producer #  Consumer #   Enqueue #   Dequeue#  
q13              0                    0                  1
0                   0    

[Start sender]
---------------------------------------------------------------
>  send -a amqp://0.0.0.0:5672/q13 burninhell
[28ca0]:  -> AMQP
[28ca0]:0 -> @open(16) [container-id="BA01C342-C97D-4C74-A835-0D59F962B608",
hostname="0.0.0.0", channel-max=32767]
[28ca0]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=2147483647,
outgoing-window=2147483647]
[28ca0]:0 -> @attach(18) [name="sender-xxx", handle=0, role=false,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13",
durable=0, timeout=0, dynamic=false], target=@target(41) [address="q13",
durable=0, timeout=0, dynamic=false], initial-delivery-count=0]
[28ca0]:  <- AMQP
[28ca0]:0 <- @open(16) [container-id="localhost", max-frame-size=131072,
channel-max=32767, offered-capabilities=@PN_SYMBOL[:"ANONYMOUS-RELAY",
:"DELAYED_DELIVERY"], properties={:product="ActiveMQ",
:"topic-prefix"="topic://", :"queue-prefix"="queue://", :version="5.16.4",
:platform="Java/1.8.0_281"}]
[28ca0]:0 <- @begin(17) [remote-channel=0, next-outgoing-id=1,
incoming-window=16383, outgoing-window=2147483647, handle-max=65535]
[28ca0]:0 <- @attach(18) [name="sender-xxx", handle=0, role=true,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13"],
target=@target(41) [address="q13"]]
[28ca0]:0 <- @flow(19) [next-incoming-id=0, incoming-window=16383,
next-outgoing-id=1, outgoing-window=2147483647, handle=0, delivery-count=0,
link-credit=1000]
[28ca0]:0 -> @transfer(20) [handle=0, delivery-id=0,
delivery-tag=b"\x00\x00\x00\x00\x00\x00\x00\x00", message-format=0,
settled=true, more=false] (100)
"\x00Sp\xd0\x00\x00\x00\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x
00:\x00\x00\x00\x0d@@\xa1\x17amqp://0.0.0.0:5672/q13@@@@@\x83\x00\x00\x00\x0
0\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x0abu
rninhell"
[28ca0]:0 -> @detach(22) [handle=0, closed=true]
[28ca0]:0 -> @close(24) []
[28ca0]:  -> EOS
[28ca0]:0 <- @detach(22) [handle=0, closed=true]
[28ca0]:0 <- @close(24) []
[28ca0]:  <- EOS


[Receiver output - gets message!]
-----------------------------------------
[28a98]:0 <- @transfer(20) [handle=0, delivery-id=0, delivery-tag=b"\x00",
message-format=0, settled=false] (100)
"\x00Sp\xd0\x00\x00\x00\x0b\x00\x00\x00\x05BP\x04@BR\x00\x00Ss\xd0\x00\x00\x
00:\x00\x00\x00\x0d@@\xa1\x17amqp://0.0.0.0:5672/q13@@@@@\x83\x00\x00\x00\x0
0\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00@R\x00@\x00Sw\xa1\x0abu
rninhell"
Address: amqp://0.0.0.0:5672/q13
Subject: (no subject)
Content: "burninhell"
[28a98]:0 -> @disposition(21) [role=true, first=0, last=0, settled=true]



bin/activemq dstat queue
(not looking good, Queue Size should be 0, Dequeue should be 1)
------------------------------------------
Name         Queue Size  Producer #  Consumer #   Enqueue #   Dequeue#  
q13              1                    0                  1
1                   0    



bin/activemq browse q13
-------------------------------------------
JMS_CUSTOM_FIELD:JMS_AMQP_FirstAcquirer = false
JMS_HEADER_FIELD:JMSDestination = q13 JMS_HEADER_FIELD:JMSDeliveryMode =
non-persistent JMS_HEADER_FIELD:JMSMessageID =
ID:gp-das3-44354-1647892116902-3:24:0:0:1
JMS_CUSTOM_FIELD:JMS_AMQP_NATIVE = true
JMS_CUSTOM_FIELD:JMS_AMQP_HEADER = true
JMS_BODY_FIELD:JMSBytes:1 =
JMS_HEADER_FIELD:JMSExpiration = 0
JMS_HEADER_FIELD:JMSPriority = 4
JMS_HEADER_FIELD:JMSRedelivered = false
JMS_CUSTOM_FIELD:JMS_AMQP_PROPERTIES = true JMS_HEADER_FIELD:JMSTimestamp =
0


[Terminate receiver]
[Start new receiver]
 Picks up same message...
------------------------------------------------
>  recv amqp://0.0.0.0:5672/q13
[28a98]:  -> AMQP
[28a98]:0 -> @open(16) [container-id="0A110962-EF33-444C-8509-370551288375",
hostname="0.0.0.0", channel-max=32767]
[28a98]:0 -> @begin(17) [next-outgoing-id=0, incoming-window=2147483647,
outgoing-window=2147483647]
[28a98]:0 -> @attach(18) [name="q13", handle=0, role=true,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13",
durable=0, timeout=0, dynamic=false], target=@target(41) [address="q13",
durable=0, timeout=0, dynamic=false], initial-delivery-count=0]
[28a98]:0 -> @flow(19) [incoming-window=2147483647, next-outgoing-id=0,
outgoing-window=2147483647, handle=0, delivery-count=0, link-credit=1024,
drain=false]
[28a98]:  <- AMQP
[28a98]:0 <- @open(16) [container-id="localhost", max-frame-size=131072,
channel-max=32767, offered-capabilities=@PN_SYMBOL[:"ANONYMOUS-RELAY",
:"DELAYED_DELIVERY"], properties={:product="ActiveMQ",
:"topic-prefix"="topic://", :"queue-prefix"="queue://", :version="5.16.4",
:platform="Java/1.8.0_281"}]
[28a98]:0 <- @begin(17) [remote-channel=0, next-outgoing-id=1,
incoming-window=16383, outgoing-window=2147483647, handle-max=65535]
[28a98]:0 <- @attach(18) [name="q13", handle=0, role=false,
snd-settle-mode=2, rcv-settle-mode=0, source=@source(40) [address="q13"],
target=@target(41) [address="q13"], incomplete-unsettled=false,
initial-delivery-count=0]
[28a98]:0 <- @transfer(20) [handle=0, delivery-id=0, delivery-tag=b"\x00",
message-format=0, settled=false] (92)
"\x00Sp\xc0\x08\x05BP\x04@BR\x01\x00Ss\xd0\x00\x00\x008\x00\x00\x00\x0c@@\xa
1\x17amqp://0.0.0.0:5672/q13@@@@@\x83\x00\x00\x00\x00\x00\x00\x00\x00\x83\x0
0\x00\x00\x00\x00\x00\x00\x00@C\x00Sw\xa1\x0aburninhell"
Address: amqp://0.0.0.0:5672/q13
Subject: (no subject)
Content: "burninhell"
[28a98]:0 -> @disposition(21) [role=true, first=0, last=0, settled=true]


bin/activemq dstat queue
(not looking good, Queue Size should be 0, Dequeue should be 1)
------------------------------------------
Name         Queue Size  Producer #  Consumer #   Enqueue #   Dequeue#  
q13              1                    0                  1
1                   0    

bin/activemq browse q13
(DeliveryCount showing 2, Redelivered=true, so broker interprets initial
consumption of message as a failure)
-------------------------------------------
JMS_CUSTOM_FIELD:JMS_AMQP_FirstAcquirer = false
JMS_HEADER_FIELD:JMSDestination = q13
JMS_HEADER_FIELD:JMSDeliveryMode = non-persistent
JMS_HEADER_FIELD:JMSMessageID = ID:gp-das3-44354-1647892116902-3:24:0:0:1
JMS_CUSTOM_FIELD:JMS_AMQP_NATIVE = true
JMS_CUSTOM_FIELD:JMSXDeliveryCount = 2      <<<<<<<<<
JMS_CUSTOM_FIELD:JMS_AMQP_HEADER = true
JMS_BODY_FIELD:JMSBytes:1 =
JMS_HEADER_FIELD:JMSExpiration = 0
JMS_HEADER_FIELD:JMSPriority = 4
JMS_HEADER_FIELD:JMSRedelivered = true      <<<<<<<<<<
JMS_CUSTOM_FIELD:JMS_AMQP_PROPERTIES = true
JMS_HEADER_FIELD:JMSTimestamp = 0


===================================
Observations/Questions
===================================
Default recv-settle-mode=0, or "AT_MOST_ONCE", this means "fire-and-forget"
from the sender's viewpoint, so it's my understanding there's no two-way
accept/settlement required as in the case of AT_LEAST_ONCE. Also, each time
the  receiver consumes and accepts the message the frame trace shows
'settled=true', so I don't understand why the broker is not dequeing the
message. As I said before, I'm using recv/send and recv-async/send-async
as-is without manipulating message headers or properties before sending. Do
I need to set message headers to explicitly settle messages and force the
broker to dequeue the message? . I'll admit to being spoiled with JMS and
AUTO_ACKNOWLEDGEMNTs, so perhaps my assumptions were unrealistic to expect a
similar level of ease with AMQP, lol. Any insight will be greatly
appreciated, thanks for reading.


==========================================
Additional info on Build\Make + Footnotes
==========================================

Proton-C Client
---------------
Source: tags\0.12.2  (minor edit to io.c, see footnote 1)
gcc   4.2.0
cmake 2.8.0
ld    2.7 (with BFD 2.7)
Solaris 10
SPARC-M8/sun4v

[cmake command]
../cmake-2.8.0-SunOS-sparc/bin/cmake ../qpid-proton-0.11.0
-DBUILD_PYTHON=OFF -DBUILD_RUBY=OFF -DBUILD_GO=OFF -DBUILD_PHP=OFF
-DBUILD_JAVA=OFF -DBUILD_PERL=OFF -DCMAKE_C_FLAGS="-pthread"
-DCXX_WARNING_FLAGS:STRING="-Wall -pedantic -Wno-format
-Wno-variadic-macros" -DOPENSSL_SSL_LIBRARIES:FILEPATH=/usr/lib/libssl.so
-DOPENSSL_CRYPTO_LIBRARIES:FILEPATH=/usr/lib/libcrypto.so
-DCYRUS_SASL_LIBRARY:FILEPATH=/usr/local/lib/libsasl2.so
-DCMAKE_SHARED_LINKER_FLAGS="-L/usr/lib -lsocket -lc -lsasl" -DBUILD_CPP=OFF
-DENABLE_WARNING_ERROR:BOOL=OFF

[make command]
make VERBOSE=1  (duh)

Broker
------
ActiveMQ 5.16.4
Pre-compiled binaries
Runtime: Java SE 1.8.0_281-b09


Footnotes
============================================================================
==========================
[1] Solaris does not support MSG_NOSIGNAL or SO_NOSIGPIPE, so cmake fails in
proton-c/src/posix/io.c. 
    Removed pre-processor directives and implemented minor change in io.c
according to this:
https://markmail.org/message/q436ukyazsfx55av#query:+page:1+mid:vevuwbh66264
vcdh+state:results







---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org

Reply via email to