Kirim, terima, dan hapus pesan dalam antrian Simple Message Queue (formerly MNS) menggunakan SDK Python.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Menginstal SMQ SDK untuk Python. Untuk informasi selengkapnya, lihat Install SDK for Python.
Mengonfigurasi endpoint dan kredensial akses. Untuk informasi selengkapnya, lihat Configure endpoints and access credentials.
Pada contoh berikut, endpoint dimuat dari file konfigurasi sample.cfg, sedangkan pasangan Kunci Akses dan token keamanan dimuat dari variabel lingkungan. Untuk mengunduh kode contoh lengkap, lihat bagian "Sample code" di Overview.
Kelas SDK
SMQ Python SDK menggunakan tiga kelas inti untuk berinteraksi dengan sumber daya antrian:
| Class | Peran |
|---|---|
Account | Titik masuk. Mewakili koneksi terautentikasi ke SMQ menggunakan endpoint dan kredensial |
Queue | Dibuat dari Account. Menyediakan metode untuk mengirim, menerima, dan menghapus pesan |
Message | Mewakili satu pesan dengan isi pesan, ID pesan, dan receipt handle |
Inisialisasi umum:
from mns.account import Account
my_account = Account(endpoint, accid, acckey, token)
my_queue = my_account.get_queue("<queue-name>")Pilih encoding isi pesan
Jika isi pesan tidak mengandung karakter khusus, lewati encoding Base64 agar lebih mudah dibaca dan mengurangi overhead.
Kirim tanpa Base64: Panggil
message.setMessageBodyAsRawStringuntuk mengatur isi pesan sebagai string mentah.Terima tanpa Base64: Panggil
message.getMessageBodyAsRawStringuntuk mengambil isi pesan sebagai string mentah.
Secara default, SDK menggunakan encoding Base64. Untuk menonaktifkannya di sisi penerima, panggil my_queue.set_encoding(False).
Kirim pesan
Skrip send_message.py mengirim pesan ke antrian yang ditentukan.
Jalankan skrip
python send_message.py <queue-name>Ganti <queue-name> dengan nama antrian Anda. Jika tidak ditentukan, skrip akan menggunakan nilai default MySampleQueue.
Output yang diharapkan
==========Send Message To Queue==========
QueueName:MyQueue1
MessageCount:3
Send Message Succeed! MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Send Message Succeed! MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Send Message Succeed! MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002Penjelasan kode
1. Inisialisasi akun dan ambil antrian.
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)
msg_count = 3
print("%sKirim Pesan ke Antrian%s\nNamaAntrian:%s\nJumlahPesan:%s\n" % (10*"=", 10*"=", queue_name, msg_count))
for i in range(msg_count):
try:
msg_body = u"Ini adalah pesan uji %s." % i
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)
print("Pesan Berhasil Dikirim! IsiPesan:%s MessageID:%s ReceiptHandle:%s" % (msg_body, re_msg.message_id, re_msg.receipt_handle))
except MNSExceptionBase as e:
if e.type == "QueueNotExist":
print("Antrian tidak ada, harap buat antrian sebelum mengirim pesan.")
sys.exit(0)
print("Pesan Gagal Dikirim! Eksepsi:%s\n" % e)2. Buat dan kirim pesan.
msg_body = u"I am test message 0."
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)Objek re_msg yang dikembalikan berisi atribut message_id, yaitu pengenal unik yang diberikan oleh SMQ.
3. Tangani error.
except MNSExceptionBase as e:
if e.type == "QueueNotExist":
print("Queue not exist, please create queue before send message.")
sys.exit(0)
print("Send Message Fail! Exception:%s\n" % e)Jika antrian tidak ada, SDK akan memunculkan MNSExceptionBase dengan e.type bernilai QueueNotExist.
Kode inti lengkap
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)
msg_count = 3
print("%sSend Message To Queue%s\nQueueName:%s\nMessageCount:%s\n" % (10*"=", 10*"=", queue_name, msg_count))
for i in range(msg_count):
try:
msg_body = u"I am test message %s." % i
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)
print("Send Message Succeed! MessageBody:%s MessageID:%s ReceiptHandle:%s" % (msg_body, re_msg.message_id, re_msg.receipt_handle))
except MNSExceptionBase as e:
if e.type == "QueueNotExist":
print("Queue not exist, please create queue before send message.")
sys.exit(0)
print("Send Message Fail! Exception:%s\n" % e)Terima dan hapus pesan
Skrip recv_and_del_message.py menerima pesan satu per satu menggunakan long polling, lalu menghapus setiap pesan setelah diproses.
Jalankan skrip
python recv_and_del_message.py <queue-name>Ganti <queue-name> dengan nama antrian Anda. Jika tidak ditentukan, skrip akan menggunakan nilai default MySampleQueue.
Untuk menonaktifkan decoding Base64, berikan false sebagai argumen kedua:
python recv_and_del_message.py <queue-name> falseOutput yang diharapkan
==========Receive And Delete Message From Queue==========
QueueName:MyQueue1
WaitSeconds:3
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA== MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA==
Queue is empty!Penjelasan kode
1. Inisialisasi akun, ambil antrian, dan konfigurasi encoding.
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)Metode set_encoding mengontrol apakah SDK menerapkan decoding Base64 pada isi pesan. Berikan False untuk menerima isi pesan sebagai string mentah.
2. Terima pesan dengan long polling.
wait_seconds = 3
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)| Parameter | Deskripsi |
|---|---|
wait_seconds | Durasi long polling dalam detik. Permintaan akan diblokir hingga pesan tiba atau timeout berakhir |
SDK menyediakan dua metode penerimaan:
| Metode | Mengembalikan |
|---|---|
receive_message(wait_seconds) | Isi pesan sebagai byte string |
receive_message_with_str_body(wait_seconds) | Isi pesan sebagai string |
Pesan yang diterima memiliki atribut-atribut berikut:
| Atribut | Deskripsi |
|---|---|
recv_msg.receipt_handle | Handle yang diperlukan untuk menghapus pesan |
recv_msg.message_body | Konten pesan |
recv_msg.message_id | Pengenal unik pesan |
3. Hapus pesan setelah diproses.
my_queue.delete_message(recv_msg.receipt_handle)Berikan receipt_handle dari pesan yang diterima. Jika pesan tidak dihapus sebelum timeout visibilitas berakhir, pesan tersebut akan tersedia kembali untuk konsumen lain.
4. Tangani error.
except Exception as e:
if hasattr(e, 'type'):
if e.type == u"QueueNotExist":
print("Queue not exist, please create queue before receive message.")
sys.exit(0)
elif e.type == u"MessageNotExist":
print("Queue is empty!")
sys.exit(0)
print("Receive Message Fail! Exception:%s\n" % e)| Jenis error | Makna |
|---|---|
QueueNotExist | Antrian yang ditentukan tidak ada. Buat terlebih dahulu sebelum mengirim atau menerima pesan |
MessageNotExist | Tidak ada pesan yang tersedia di antrian. Waktu tunggu long polling telah habis |
Kode inti lengkap
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)
wait_seconds = 3
print("%sReceive And Delete Message From Queue%s\nQueueName:%s\nWaitSeconds:%s\n" % (10*"=", 10*"=", queue_name, wait_seconds))
while True:
try:
# receive_message returns a byte string body.
# receive_message_with_str_body returns a string body.
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)
print("Receive Message Succeed! ReceiptHandle:%s MessageBody:%s MessageID:%s" % (recv_msg.receipt_handle, recv_msg.message_body, recv_msg.message_id))
except Exception as e:
if hasattr(e, 'type'):
if e.type == u"QueueNotExist":
print("Queue not exist, please create queue before receive message.")
sys.exit(0)
elif e.type == u"MessageNotExist":
print("Queue is empty!")
sys.exit(0)
print("Receive Message Fail! Exception:%s\n" % e)
continue
try:
my_queue.delete_message(recv_msg.receipt_handle)
print("Delete Message Succeed! ReceiptHandle:%s" % recv_msg.receipt_handle)
except Exception as e:
print("Delete Message Fail! Exception:%s\n" % e)