Normal messages are messages that have no special features in Message Queue for Apache RocketMQ. They are different from featured messages, such as scheduled messages, delayed messages, ordered messages, and transactional messages. This topic provides sample code to show how to use the HTTP client SDK for Python to send and subscribe to normal messages.

Prerequisites

The following operations are performed:

  • Install the SDK for Python. For more information, see Prepare the environment.
  • Create resources that you want to specify in the code. For example, you must create the instance, topic, and group that you want to specify in the code in the Message Queue for Apache RocketMQ console in advance. For more information, see Create resources.

Send normal messages

The following sample code provides an example on how to send normal messages:

import sys

from mq_http_sdk.mq_exception import MQExceptionBase
from mq_http_sdk.mq_producer import *
from mq_http_sdk.mq_client import *
import time

# Initialize a client. 
mq_client = MQClient(
    # The HTTP endpoint of your instance. To obtain the HTTP endpoint, log on to the Message Queue for Apache RocketMQ console. In the left-side navigation pane, click Instances. On the Instances page, click the name of your instance. On the Instance Details page, scroll to the Basic Information section and view the endpoint on the Endpoints tab. 
     "${HTTP_ENDPOINT}",
    # The AccessKey ID that you created in the Resource Access Management (RAM) console for identity verification. 
     "${ACCESS_KEY}",
    # The AccessKey secret that you created in the RAM console for identity verification. 
    "${SECRET_KEY}"
    )
# The topic of the messages. The topic must have been created in the Message Queue for Apache RocketMQ console. 
topic_name = "${TOPIC}"
# The ID of the instance to which the topic belongs. The instance must have been created in the Message Queue for Apache RocketMQ console. 
# If the instance has a namespace, the instance ID must be specified. If the instance does not have a namespace, set the instance ID to an empty string. You can check whether your instance has a namespace on the Instance Details page in the Message Queue for Apache RocketMQ console. 
instance_id = "${INSTANCE_ID}"

producer = mq_client.get_producer(instance_id, topic_name)

# Cyclically send four messages. 
msg_count = 4
print("%sPublish Message To %s\nTopicName:%s\nMessageCount:%s\n" % (10 * "=", 10 * "=", topic_name, msg_count))

try:
    for i in range(msg_count):
            msg = TopicMessage(
                    # The content of the message. 
                    "I am test message %s.hello" % i,
                    # The tag of the message. 
                    "tag %s" % i
                        )
            # The custom attribute of the message. 
            msg.put_property("a", i)
            # The key of the message. 
            msg.set_message_key("MessageKey")
            re_msg = producer.publish_message(msg)
            print("Publish Message Succeed. MessageID:%s, BodyMD5:%s" % (re_msg.message_id, re_msg.message_body_md5))

except MQExceptionBase as e:
    if e.type == "TopicNotExist":
         print("Topic not exist, please create it.")
         sys.exit(1)
    print("Publish Message Fail. Exception:%s" % e)

Subscribe to normal messages

The following sample code provides an example on how to subscribe to normal messages:

from mq_http_sdk.mq_exception import MQExceptionBase
from mq_http_sdk.mq_consumer import *
from mq_http_sdk.mq_client import *

# Initialize a client. 
mq_client = MQClient(
    # The HTTP endpoint of your instance. To obtain the HTTP endpoint, log on to the Message Queue for Apache RocketMQ console. In the left-side navigation pane, click Instances. On the Instances page, click the name of your instance. On the Instance Details page, scroll to the Basic Information section and view the endpoint on the Endpoints tab. 
    "${HTTP_ENDPOINT}",
    # The AccessKey ID that you created in the RAM console for identity verification. 
    "${ACCESS_KEY}",
    # The AccessKey secret that you created in the RAM console for identity verification. 
    "${SECRET_KEY}"
     )
# The topic of the messages. The topic must have been created in the Message Queue for Apache RocketMQ console. 
topic_name = "${TOPIC}"
# The ID of the group that you created in the Message Queue for Apache RocketMQ console. 
group_id = "${GROUP_ID}"
# The ID of the instance to which the topic belongs. The instance must have been created in the Message Queue for Apache RocketMQ console. 
# If the instance has a namespace, the instance ID must be specified. If the instance does not have a namespace, set the instance ID to an empty string. You can check whether your instance has a namespace on the Instance Details page in the Message Queue for Apache RocketMQ console. 
instance_id = "${INSTANCE_ID}"

consumer = mq_client.get_consumer(instance_id, topic_name, group_id)

# In long polling mode, if no message in the topic is available for consumption, the request is suspended on the broker for a specified time period. If a message becomes available for consumption within the specified time period, a response is immediately sent to the consumer. In this example, the time period is 3 seconds. 
# The long polling period. Unit: seconds. In this example, the value is set to 3. The maximum value that you can specify is 30. 
wait_seconds = 3
# The maximum number of messages that can be consumed at a time. In this example, the value is set to 3. The maximum value that you can specify is 16. 
batch = 3
print(("%sConsume And Ak Message From Topic%s\nTopicName:%s\nMQConsumer:%s\nWaitSeconds:%s\n" \
        % (10 * "=", 10 * "=", topic_name, group_id, wait_seconds)))
while True:
    try:
        # Consume messages in long polling mode. 
        recv_msgs = consumer.consume_message(batch, wait_seconds)
        for msg in recv_msgs:
            print(("Receive, MessageId: %s\nMessageBodyMD5: %s \
                              \nMessageTag: %s\nConsumedTimes: %s \
                              \nPublishTime: %s\nBody: %s \
                              \nNextConsumeTime: %s \
                              \nReceiptHandle: %s \
                              \nProperties: %s\n" % \
                  (msg.message_id, msg.message_body_md5,
                   msg.message_tag, msg.consumed_times,
                   msg.publish_time, msg.message_body,
                   msg.next_consume_time, msg.receipt_handle, msg.properties)))
    except MQExceptionBase as e:
        # No messages in the topic are available for consumption. 
        if e.type == "MessageNotExist":
            print(("No new message! RequestId: %s" % e.req_id))
            continue

        print(("Consume Message Fail! Exception:%s\n" % e))
        time.sleep(2)
        continue

    # If the broker fails to receive an acknowledgment for a message from the consumer before the period of time specified by the msg.next_consume_time parameter elapses, the broker delivers the message for consumption again. 
    # A unique timestamp is specified for the handle of a message each time the message is consumed. 
    try:
        receipt_handle_list = [msg.receipt_handle for msg in recv_msgs]
        consumer.ack_message(receipt_handle_list)
        print(("Ak %s Message Succeed.\n\n" % len(receipt_handle_list)))
    except MQExceptionBase as e:
        print(("\nAk Message Fail! Exception:%s" % e))
        # The broker fails to receive an acknowledgment for a message from the consumer if the handle of the message times out. 
        if e.sub_errors:
            for sub_error in e.sub_errors:
                print(("\tErrorHandle:%s,ErrorCode:%s,ErrorMsg:%s" % \
                      (sub_error["ReceiptHandle"], sub_error["ErrorCode"], sub_error["ErrorMessage"])))