AMHandler.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using Base;
  3. namespace Model
  4. {
  5. public abstract class AMHandler<Message>: IMHandler where Message: AMessage
  6. {
  7. protected abstract void Run(Session session, Message message);
  8. public void Handle(Session session, MessageInfo messageInfo)
  9. {
  10. Message message;
  11. try
  12. {
  13. message = MongoHelper.FromBson<Message>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count);
  14. }
  15. catch (Exception e)
  16. {
  17. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  18. }
  19. this.Run(session, message);
  20. }
  21. public Type GetMessageType()
  22. {
  23. return typeof (Message);
  24. }
  25. }
  26. public abstract class AMRpcHandler<Request, Response> : IMHandler
  27. where Request : ARequest
  28. where Response: AResponse
  29. {
  30. protected static void ReplyError(Response response, Exception e, Action<Response> reply)
  31. {
  32. Log.Error(e.ToString());
  33. response.Error = ErrorCode.ERR_RpcFail;
  34. response.Message = e.ToString();
  35. reply(response);
  36. }
  37. protected abstract void Run(Session session, Request message, Action<Response> reply);
  38. public void Handle(Session session, MessageInfo messageInfo)
  39. {
  40. try
  41. {
  42. Request request = MongoHelper.FromBson<Request>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count);
  43. this.Run(session, request, response =>
  44. {
  45. // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
  46. if (session.Id == 0)
  47. {
  48. return;
  49. }
  50. session.Reply(messageInfo.RpcId, response);
  51. }
  52. );
  53. }
  54. catch (Exception e)
  55. {
  56. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  57. }
  58. }
  59. public Type GetMessageType()
  60. {
  61. return typeof(Request);
  62. }
  63. }
  64. }