TH1/Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageSenderSystem.cs
2025-07-17 18:26:28 +08:00

76 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace ET.Server
{
[FriendOf(typeof(MessageSender))]
public static partial class MessageSenderSystem
{
public static void Send(this MessageSender self, ActorId actorId, IMessage message)
{
Fiber fiber = self.Fiber();
// 如果发向同一个进程,则扔到消息队列中
if (actorId.Process == fiber.Process)
{
fiber.Root.GetComponent<ProcessInnerSender>().Send(actorId, message);
return;
}
// 发给NetInner纤程
A2NetInner_Message a2NetInnerMessage = A2NetInner_Message.Create();
a2NetInnerMessage.FromAddress = fiber.Address;
a2NetInnerMessage.ActorId = actorId;
a2NetInnerMessage.MessageObject = message;
MessageQueue.Instance.Send(new ActorId(fiber.Process, ConstFiberId.NetInner), a2NetInnerMessage);
}
private static int GetRpcId(this MessageSender self)
{
return ++self.RpcId;
}
public static async ETTask<IResponse> Call(
this MessageSender self,
ActorId actorId,
IRequest request,
bool needException = true
)
{
if (actorId == default)
{
throw new Exception($"actor id is 0: {request}");
}
Fiber fiber = self.Fiber();
IResponse response;
if (fiber.Process == actorId.Process)
{
response = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, request, needException: needException);
}
else
{
// 发给NetInner纤程
A2NetInner_Request a2NetInner_Request = A2NetInner_Request.Create();
a2NetInner_Request.ActorId = actorId;
a2NetInner_Request.MessageObject = request;
using A2NetInner_Response a2NetInnerResponse = await fiber.Root.GetComponent<ProcessInnerSender>().Call(
new ActorId(fiber.Process, ConstFiberId.NetInner), a2NetInner_Request) as A2NetInner_Response;
response = a2NetInnerResponse.MessageObject;
}
if (response.Error == ErrorCore.ERR_MessageTimeout)
{
throw new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时请注意查看是否死锁或者没有reply: actorId: {actorId} {request}, response: {response}");
}
if (needException && ErrorCore.IsRpcNeedThrowException(response.Error))
{
throw new RpcException(response.Error, $"Rpc error: actorId: {actorId} {request}, response: {response}");
}
return response;
}
}
}