C++ Actor库orca简介(一):消息封装及类型

项目地址:https://github.com/wlgq2/orcagit

关于orca

orca是一个基于C++11/14风格的轻量级actor库,ping-pong测试显示性能较为优异。本文主要介绍orca的消息封装及类型。
orca消息性能测试github

消息类型定义

orca经过REGISTER_MESSAGE_TYPE宏定义消息类型。orca的消息类型能够是std::string,也能够是自定义消息类型,可是须要实现相应接口。
例:网络

REGISTER_MESSAGE_TYPE(std::string);//定义string为消息传送类型。

由于orca网络消息的传输以字节流的形式,因此若是使用自定义消息类型,则须要实现如下接口函数

  1. const unsigned long size();//消息长度
  2. const char* enter();//消息入口
  3. 构造函数(char* str, int size);//消息构造函数

例: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();

}
相关文章
相关标签/搜索