项目地址:https://github.com/wlgq2/orcagit
orca是一个基于C++11/14风格的轻量级actor库,ping-pong测试显示性能较为优异。本文主要介绍orca的消息封装及类型。github
orca经过REGISTER_MESSAGE_TYPE宏定义消息类型。orca的消息类型能够是std::string,也能够是自定义消息类型,可是须要实现相应接口。
例:网络
REGISTER_MESSAGE_TYPE(std::string);//定义string为消息传送类型。
由于orca网络消息的传输以字节流的形式,因此若是使用自定义消息类型,则须要实现如下接口函数
例:oop
#include <orca/orca.h> class MyMessage { public: MyMessage(char* str, int size) { if (size > Size) size = Size; std::copy(str, str+size,message); } ~MyMessage() { } const unsigned long size() { return Size; } const char* enter() { return message; } private: static const int Size = 1024; char message[Size]; }; //registet messge type.注册自定义消息类型。 REGISTER_MESSAGE_TYPE(MyMessage);
由于orca须要支持std::string或自定义消息类型,因此萃取了消息类型特性,若是string类型则调用c_str()函数,不然调用enter函数。在orca/core/MessageTraits.h文件下实现以下:性能
namespace orca { namespace core { template<typename T> struct MessageTraits { static const char* Enter(T& object) { return object.enter(); } }; template<> struct MessageTraits<std::string> { static const char* Enter(std::string& object) { return (object.c_str()); } }; } }
为了在本地消息发送实现zero-copy,orca对消息作了一层简单封装,即MessagePack类。
经过create接口建立消息,原型为:测试
template<class... _Types > std::shared_ptr<MessageType>& create(_Types&&... _Args)
creat函数会建立一个消息的引用计数指针,以达到消息通讯zero-copy目的。
完整的例子以下:spa
int main(int argc, char** args) { //actor framework. orca::Framework framework; //arctor object. orca::Actor actor1(&framework); orca::Actor actor2(&framework); //message pack. orca::MessagePack message; message.create("hello world!"); //actor1->actor2 send message. actor1.send(message,actor2.getAddress()); framework.loop(); }