This is an automated email from the ASF dual-hosted git repository. kpvdr pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git
commit 67f55822e83a72472a90fc4981ce0d436b2a687c Author: QIT Development Team <[email protected]> AuthorDate: Fri Jul 17 20:25:47 2026 -0400 Fix: Use symbol key and byte value for JMS annotations Root Cause: - Python→JMS tests failing (0/5 messages received) - Used plain string "x-opt-jms-msg-type" instead of symbol() - Used ubyte(5) instead of byte(5) - Qpid JMS Client expects: {symbol("x-opt-jms-msg-type"): byte(5)} Fix (from QIT v1 working code): - Sender: msg.annotations = {symbol("x-opt-jms-msg-type"): byte(jms_type)} - Receiver: annotation_key = symbol("x-opt-jms-msg-type") - Import: from proton import byte, symbol (not ubyte) Why This Matters: - AMQP annotations have typed keys (symbol vs string are different) - AMQP types matter: byte vs ubyte are encoded differently - Qpid JMS Client strictly matches this wire format Reference: QIT v1 qit_jms_types.py create_annotation() Expected Build #68 Results: - Python→JMS: 5/5 passing (was 0/5) - JMS→Python: 5/5 passing (unchanged) - Python roundtrip: 5/5 passing (unchanged) - Total: 15/15 (100%) Co-Authored-By: Claude Sonnet 4.5 <[email protected]> --- debug_message_encoding.py | 36 ++++++++++++++++++++++++++++++++++++ shims/python-proton/shim.py | 14 ++++++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/debug_message_encoding.py b/debug_message_encoding.py new file mode 100644 index 0000000..44001ed --- /dev/null +++ b/debug_message_encoding.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +""" +Debug script to see how Python Proton actually encodes messages. +This will help us understand why JMS receiver isn't getting messages. +""" + +from proton import Message, byte, symbol + +# Create a message the CORRECT way (matching QIT v1) +msg = Message() +msg.id = 0 +msg.body = "Hello, world" # String value +msg.annotations = {symbol("x-opt-jms-msg-type"): byte(5)} # Key MUST be symbol, value MUST be byte + +print("Message created:") +print(f" ID: {msg.id}") +print(f" Body: {repr(msg.body)}") +print(f" Body type: {type(msg.body)}") +print(f" Annotations: {msg.annotations}") +print(f" Content type: {msg.content_type}") +print(f" Subject: {msg.subject}") +print() + +# Check the encoded format +print("Proton internal representation:") +print(f" msg.body (raw): {msg.body}") +print(f" Python type: {type(msg.body).__name__}") +print() + +# What happens with empty string? +msg2 = Message() +msg2.body = "" +msg2.annotations = {symbol("x-opt-jms-msg-type"): byte(5)} +print("Empty string message:") +print(f" Body: {repr(msg2.body)}") +print(f" Body type: {type(msg2.body)}") diff --git a/shims/python-proton/shim.py b/shims/python-proton/shim.py index 3fa38eb..b978cf5 100755 --- a/shims/python-proton/shim.py +++ b/shims/python-proton/shim.py @@ -50,12 +50,14 @@ class SenderHandler(MessagingHandler): # Add JMS annotations if in JMS mode if self.jms_mode: - from proton import ubyte + from proton import byte, symbol # Map type to JMS message type jms_type = self._get_jms_message_type(msg_data["type"]) if jms_type is not None: - msg.annotations = {"x-opt-jms-msg-type": ubyte(jms_type)} + # NOTE: Key MUST be symbol, value MUST be byte (not ubyte) + # This matches Qpid JMS Client wire format + msg.annotations = {symbol("x-opt-jms-msg-type"): byte(jms_type)} event.sender.send(msg) self.sent_count += 1 @@ -212,9 +214,13 @@ class ReceiverHandler(MessagingHandler): msg = event.message # Check for JMS message type annotation + # NOTE: Qpid JMS Client uses symbol as key + from proton import symbol + jms_msg_type = None - if msg.annotations and "x-opt-jms-msg-type" in msg.annotations: - jms_msg_type = int(msg.annotations["x-opt-jms-msg-type"]) + annotation_key = symbol("x-opt-jms-msg-type") + if msg.annotations and annotation_key in msg.annotations: + jms_msg_type = int(msg.annotations[annotation_key]) # Extract message data if jms_msg_type is not None: --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
