1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Bwar-Nebula

Клонировать/Скачать
actor.md 8.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 22:21 646366b

Actor класс предоставляет компоненты и фреймворк с взаимодействующими функциями-членами.

С помощью этих функций-членов можно выполнить все необходимые функции для бизнес-логики. Другими словами, для разработки бизнеса на основе Nebula Framework достаточно понять более 30 функций-членов Actor класса.

Такая конструкция, с одной стороны, предназначена для максимально возможного снижения порога изучения и использования Nebula, а с другой стороны, она может очень изящно предоставить некоторые удивительные и мощные функции.

Actor класс является базовым классом всех Actor компонентов, но Actor класс не является абстрактным классом, он больше похож на класс инструментов. Классы инструментов обычно встраиваются в другие классы с использованием композиции, в то время как Actor наследуется из-за дизайна Nebula: все компоненты имеют общую логику Actor, это отношение is, а не has, наследование. Более важно то, что наследование в Nebula может легко реализовать некоторые мощные функции, которые трудно реализовать с помощью композиции.

Классы, непосредственно производные от Actor, являются типами ACT_UNDEFINE. Nebula framework не управляет этими классами, поэтому не следует напрямую наследовать от Actor, если только нет веских и разумных причин для прямого наследования от Actor и управления собственным Actor базовым классом.


Класс Actor наследует std::enable_shared_from_this, чтобы облегчить производным классам Actor получение shared_ptr через this указатель. Разработчикам не нужно заботиться о std::enable_shared_from_this.

Перечисление ACTOR_TYPE в классе Actor определяет все типы Actor компонентов, поддерживаемые Nebula Framework. Компоненты Cmd, Module, Step, Session и т. д. автоматически заполняют ACTOR_TYPE. Производным от этих компонентов бизнес-классам не нужно беспокоиться об ACTOR_TYPE, который в основном используется для управления компонентами Nebula.

Функция шаблона Logger() используется для записи журналов, но разработчикам не нужно вызывать Logger() напрямую для записи журналов. Вместо этого они могут использовать связанные макросы, такие как LOG4_INFO()/LOG4_ERROR(), для записи журналов, фактически эти макросы вызывают функцию Logger() для записи журналов и автоматически заполняют параметры, такие как имена файлов и имена функций. Реализация функции Logger() также не требует внимания разработчиков.

Nebula предоставляет разработчикам возможность отслеживать логи без дополнительной работы. Принцип этой функции заключается в реализации функции Logger(). Это также одна из удивительных и мощных функций.

Шаблонные функции, такие как MakeSharedStep()/MakeSharedSession(), используются для динамического создания конкретных классов бизнес-логиков через отражение имён классов. При динамическом создании конкретных экземпляров Actor они также инициализируются и регистрируются в фреймворке. Некоторые контекстные информации также передаются в процессе динамического создания. Функции GetActorName(), GetTraceId(), GetSequence() и GetContext() удобны в использовании. Они выполняют множество сложных задач за кулисами, оставляя простоту пользователям. Поэтому разработчики должны помнить, что не следует создавать различные производные классы Actor с помощью new, вместо этого следует вызывать шаблонные функции MakeSharedStep/MakeSharedSession().

Что касается производных классов, отличных от Actor, и пользовательских структур данных, шаблонные функции MakeShared не поддерживают их, и в этом нет необходимости. GetOperator(const std::string& strOperatorName);

std::shared_ptr GetContext();

void SetContext(std::shared_ptr pContext);

void AddAssemblyLine(std::shared_ptr pSession);

protected:

**bool SendTo(std::shared_ptr<SocketChannel> pChannel);**

**bool SendTo(std::shared_ptr<SocketChannel> pChannel, int32 iCmd, uint32 uiSeq, const MsgBody& oMsgBody);**

**bool SendTo(std::shared_ptr<SocketChannel> pChannel, const HttpMsg& oHttpMsg);**

**bool SendTo(const std::string& strIdentify, int32 iCmd, uint32 uiSeq, const MsgBody& oMsgBody);**

**bool SendTo(const std::string& strHost, int iPort, const std::string& strUrlPath, const HttpMsg& oHttpMsg);**

**bool SendTo(std::shared_ptr<RedisChannel> pChannel);**

**bool SendTo(const std::string& strIdentify);**

**bool SendTo(const std::string& strHost, int iPort);**

**bool SendRoundRobin(const std::string& strNodeType, int32 iCmd, uint32 uiSeq, const MsgBody& oMsgBody);**

**bool SendOriented(const std::string& strNodeType, uint32 uiFactor, int32 iCmd, uint32 uiSeq, const MsgBody& oMsgBody);**

**bool SendOriented(const std::string& strNodeType, int32 iCmd, uint32 uiSeq, const MsgBody& oMsgBody);**

protected:

virtual **void SetActiveTime(ev_tstamp dActiveTime)**
{
    m_dActiveTime = dActiveTime;
}

ev_tstamp **GetActiveTime() const**
{
    return(m_dActiveTime);
}

ev_tstamp **GetTimeout() const**
{
    return(m_dTimeout);
}

private:

void **SetWorker(Worker* pWorker);**

ev_timer* **MutableTimerWatcher();**

void **SetActorName(const std::string& strActorName);**

void **SetTraceId(const std::string& strTraceId);**

private: ACTOR_TYPE m_eActorType; uint32 m_uiSequence; ev_tstamp m_dActiveTime; ev_tstamp m_dTimeout; Worker* m_pWorker; ev_timer* m_pTimerWatcher; std::string m_strActorName; std::string m_strTraceId; // for log trace std::shared_ptr** m_pContext;**

friend class WorkerImpl;
friend class WorkerFriend;
friend class Chain;

};

  GetActorName()获取的是带名字空间的类名,熟悉Java的开发者都知道.class用起来很方便,GetActorName()就是Nebula框架的.class。

  GetSequence()可以随时随地获取进程内唯一的一个32位无符号整数。

  GetNowTime()比较近似地获取当前时间,在高并发的服务里频繁调用time()、gettimeofday()等函数对性能是有影响的,频繁调用GetNowTime()则不会有这样的问题。如果需要获取非常精确的时间,GetNowTime()是不适用的。

  GetNodeId()/GetNodeType()/GetCustomConf()等用于获取当前节点、当前进程的一些重要信息,获取用户自定义配置信息。这些函数都非常有用,不用刻意去记,当需要用的时候再到Actor类里找,通常都有,毕竟Nebula是个久经多种业务生产环境使用的框架,功能比较全。再小提示一下,这些函数使得snowflake算法分布式生成唯一ID非常方便。

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Bwar-Nebula.git
git@api.gitlife.ru:oschina-mirror/Bwar-Nebula.git
oschina-mirror
Bwar-Nebula
Bwar-Nebula
master