Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions src/PythonWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "CCommon.h"
#include "CMessage.h"
#include "CMessageExt.h"
#include "CBatchMessage.h"
#include "CSendResult.h"
#include "CProducer.h"
#include "CPushConsumer.h"
Expand Down Expand Up @@ -94,6 +95,20 @@ int PySetMessageProperty(void *msg, const char *key, const char *value) {
int PySetMessageDelayTimeLevel(void *msg, int level) {
return SetDelayTimeLevel((CMessage *) msg, level);
}

//batch message
void *PyCreateBatchMessage() {
return (void *) CreateBatchMessage();
}

int PyAddMessage(void *batchMsg, void *msg) {
return AddMessage((CBatchMessage *) batchMsg, (CMessage *) msg);
}

int PyDestroyBatchMessage(void *batchMsg) {
return DestroyBatchMessage((CBatchMessage *) batchMsg);
}

//messageExt
const char *PyGetMessageTopic(PyMessageExt msgExt) {
return GetMessageTopic((CMessageExt *) msgExt.pMessageExt);
Expand Down Expand Up @@ -200,6 +215,16 @@ int PySendMessageAsync(void *producer, void *msg, PyObject *sendSuccessCallback,
return SendAsync((CProducer *) producer, (CMessage *) msg, &PySendSuccessCallback, &PySendExceptionCallback, (void *)pyCallback);
}

PySendResult PySendBatchMessage(void *producer, void *batchMessage) {
PySendResult ret;
CSendResult result;
SendBatchMessage((CProducer *) producer, (CBatchMessage *) batchMessage, &result);
ret.sendStatus = result.sendStatus;
ret.offset = result.offset;
strncpy(ret.msgId, result.msgId, MAX_MESSAGE_ID_LENGTH - 1);
ret.msgId[MAX_MESSAGE_ID_LENGTH - 1] = 0;
return ret;
}


PySendResult PySendMessageOrderly(void *producer, void *msg, int autoRetryTimes, void *args, PyObject *queueSelector) {
Expand Down Expand Up @@ -272,6 +297,12 @@ int PyRegisterMessageCallback(void *consumer, PyObject *pCallback, object args)
return RegisterMessageCallback(consumerInner, &PythonMessageCallBackInner);
}

int PyRegisterMessageCallbackOrderly(void *consumer, PyObject *pCallback, object args){
CPushConsumer *consumerInner = (CPushConsumer *) consumer;
g_CallBackMap[consumerInner] = make_pair(pCallback, std::move(args));
return RegisterMessageCallbackOrderly(consumerInner, &PythonMessageCallBackInner);
}

int PythonMessageCallBackInner(CPushConsumer *consumer, CMessageExt *msg) {
PyThreadStateLock PyThreadLock; // ensure hold GIL, before call python callback
PyMessageExt message = { .pMessageExt = msg };
Expand Down Expand Up @@ -302,6 +333,9 @@ int PySetPushConsumerSessionCredentials(void *consumer, const char *accessKey, c
const char *channel){
return SetPushConsumerSessionCredentials((CPushConsumer *)consumer, accessKey, secretKey, channel);
}
int PySetPushConsumerMessageModel(void *consumer, CMessageModel messageModel) {
return SetPushConsumerMessageModel((CPushConsumer *) consumer, messageModel);
}

//push consumer
int PySetPullConsumerNameServerDomain(void *consumer, const char *domain) {
Expand Down Expand Up @@ -348,6 +382,10 @@ BOOST_PYTHON_MODULE (librocketmqclientpython) {
.def("GetFile", &PyMQException::GetFile)
.def("GetMsg", &PyMQException::GetMsg)
.def("GetType", &PyMQException::GetType);
enum_<CMessageModel>("CMessageModel")
.value("BROADCASTING", BROADCASTING)
.value("CLUSTERING", CLUSTERING);


//For Message
def("CreateMessage", PyCreateMessage, return_value_policy<return_opaque_pointer>());
Expand All @@ -360,6 +398,11 @@ BOOST_PYTHON_MODULE (librocketmqclientpython) {
def("SetMessageProperty", PySetMessageProperty);
def("SetDelayTimeLevel", PySetMessageDelayTimeLevel);

//For batch message
def("CreateBatchMessage", PyCreateBatchMessage, return_value_policy<return_opaque_pointer>());
def("AddMessage", PyAddMessage);
def("DestroyBatchMessage", PyDestroyBatchMessage);

//For MessageExt
def("GetMessageTopic", PyGetMessageTopic);
def("GetMessageTags", PyGetMessageTags);
Expand All @@ -382,6 +425,7 @@ BOOST_PYTHON_MODULE (librocketmqclientpython) {

def("SendMessageSync", PySendMessageSync);
def("SendMessageAsync", PySendMessageAsync);
def("SendBatchMessage", PySendBatchMessage);

def("SendMessageOneway", PySendMessageOneway);
def("SendMessageOrderly", PySendMessageOrderly);
Expand All @@ -400,9 +444,11 @@ BOOST_PYTHON_MODULE (librocketmqclientpython) {
def("SetPushConsumerSessionCredentials", PySetPushConsumerSessionCredentials);
def("Subscribe", PySubscribe);
def("RegisterMessageCallback", PyRegisterMessageCallback);
def("RegisterMessageCallbackOrderly", PyRegisterMessageCallbackOrderly);

//pull consumer
def("SetPullConsumerNameServerDomain", PySetPullConsumerNameServerDomain);
def("SetPushConsumerMessageModel", PySetPushConsumerMessageModel);

//For Version
def("GetVersion", PyGetVersion);
Expand Down
14 changes: 12 additions & 2 deletions src/PythonWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "CCommon.h"
#include "CMessage.h"
#include "CMessageExt.h"
#include "CBatchMessage.h"
#include "CSendResult.h"
#include "CProducer.h"
#include "CPushConsumer.h"
Expand Down Expand Up @@ -47,9 +48,11 @@ typedef struct _PyMQException_ {
const char *GetFile() {
return (const char *) file;
}

const char *GetMsg() {
return (const char *) msg;
}

const char *GetType() {
return (const char *) type;
}
Expand Down Expand Up @@ -88,6 +91,11 @@ int PySetByteMessageBody(void *msg, const char *body, int len);
int PySetMessageProperty(void *msg, const char *key, const char *value);
int PySetMessageDelayTimeLevel(void *msg, int level);

//batch message
void *PyCreateBatchMessage();
int PyAddMessage(void *batchMsg, void *msg);
int PyDestroyBatchMessage(void *batchMsg);

//messageExt
const char *PyGetMessageTopic(PyMessageExt msgExt);
const char *PyGetMessageTags(PyMessageExt msgExt);
Expand Down Expand Up @@ -115,7 +123,7 @@ void PySendSuccessCallback(CSendResult result, CMessage *msg, void *pyCallback);
void PySendExceptionCallback(CMQException e, CMessage *msg, void *pyCallback);
int PySendMessageAsync(void *producer, void *msg, PyObject *sendSuccessCallback, PyObject *sendExceptionCallback);


PySendResult PySendBatchMessage(void *producer, void *msg);
PySendResult PySendMessageOrderly(void *producer, void *msg, int autoRetryTimes, void *args, PyObject *queueSelector);
PySendResult PySendMessageOrderlyByShardingKey(void *producer, void *msg, const char *shardingKey);

Expand All @@ -133,12 +141,14 @@ int PySetPushConsumerNameServerAddress(void *consumer, const char *namesrv);
int PySetPushConsumerNameServerDomain(void *consumer, const char *domain);
int PySubscribe(void *consumer, const char *topic, const char *expression);
int PyRegisterMessageCallback(void *consumer, PyObject *pCallback, object args);
int PyRegisterMessageCallbackOrderly(void *consumer, PyObject *pCallback, object args);
int PythonMessageCallBackInner(CPushConsumer *consumer, CMessageExt *msg);
int PySetPushConsumerThreadCount(void *consumer, int threadCount);
int PySetPushConsumerMessageBatchMaxSize(void *consumer, int batchSize);
int PySetPushConsumerInstanceName(void *consumer, const char *instanceName);
int PySetPushConsumerSessionCredentials(void *consumer, const char *accessKey, const char *secretKey,
const char *channel);
const char *channel);
int PySetPushConsumerMessageModel(void *consumer, CMessageModel messageModel);

//push consumer
int PySetPullConsumerNameServerDomain(void *consumer, const char *domain);
Expand Down
4 changes: 2 additions & 2 deletions test/TestConsumeMessages.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ def consumer_message(msg, args):

print 'map.name %s' % GetMessageProperty(msg, 'name')
print 'map.id %s' % GetMessageProperty(msg, 'id')
return 0

return CConsumeStatus.E_CONSUME_SUCCESS

def init_consumer(_group, _topic, _tag):
consumer = CreatePushConsumer(_group)
SetPushConsumerNameServerAddress(consumer, name_srv)
SetPushConsumerThreadCount(consumer, 1)
SetPushConsumerMessageModel(consumer, CMessageModel.CLUSTERING)
Subscribe(consumer, _topic, _tag)
RegisterMessageCallback(consumer, consumer_message, None)
StartPushConsumer(consumer)
Expand Down
21 changes: 20 additions & 1 deletion test/TestSendMessages.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,5 +256,24 @@ def send_message_async_fail(msg, exception):
print 'send message failed'
print 'error msg: ' + exception.GetMsg()

def send_batch_message(batch_count):
key = 'rmq-key'
print 'start send batch message'
tag = 'test'
batchMsg = CreateBatchMessage()

for n in range(count):
body = 'hi rmq message, now is' + str(n)
msg = CreateMessage(topic)
SetMessageBody(msg, body)
SetMessageKeys(msg, key)
SetMessageTags(msg, tag)
AddMessage(batchMsg, msg)
DestroyMessage(msg)

SendBatchMessage(producer, batchMsg)
DestroyBatchMessage(batchMsg)
print 'send batch message done'

if __name__ == '__main__':
send_message_orderly(10)
send_message_async(10)