PageRenderTime 40ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/MassTransit.Futures/Steward/Core/Consumers/DispatchMessageConsumer.cs

http://github.com/MassTransit/MassTransit
C# | 92 lines | 68 code | 24 blank | 0 comment | 3 complexity | 947de09d7797813630a4366567927922 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. namespace MassTransit.Steward.Core.Consumers
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Xml.Linq;
  10. using Contracts;
  11. using Newtonsoft.Json;
  12. using Newtonsoft.Json.Linq;
  13. using Serialization;
  14. public class DispatchMessageConsumer :
  15. IConsumer<DispatchMessage>
  16. {
  17. readonly DispatchAgent _agent;
  18. public DispatchMessageConsumer(DispatchAgent agent)
  19. {
  20. _agent = agent;
  21. }
  22. public async Task Consume(ConsumeContext<DispatchMessage> context)
  23. {
  24. string body = Encoding.UTF8.GetString(context.ReceiveContext.GetBody());
  25. var mediaType = context.ReceiveContext.ContentType?.MediaType;
  26. if (JsonMessageSerializer.JsonContentType.MediaType.Equals(mediaType, StringComparison.OrdinalIgnoreCase))
  27. body = TranslateJsonBody(body, context.Message.Destination.ToString());
  28. else if (XmlMessageSerializer.XmlContentType.MediaType.Equals(mediaType, StringComparison.OrdinalIgnoreCase))
  29. body = TranslateXmlBody(body, context.Message.Destination.ToString());
  30. else
  31. throw new InvalidOperationException("Only JSON and XML messages can be scheduled");
  32. var dispatchContext = new ConsumerDispatchContext(context, body);
  33. await _agent.Execute(dispatchContext);
  34. }
  35. static string TranslateJsonBody(string body, string destination)
  36. {
  37. JObject envelope = JObject.Parse(body);
  38. envelope["destinationAddress"] = destination;
  39. JToken message = envelope["message"];
  40. JToken payload = message["payload"];
  41. JToken payloadType = message["payloadType"];
  42. envelope["message"] = payload;
  43. envelope["messageType"] = payloadType;
  44. return JsonConvert.SerializeObject(envelope, Formatting.Indented);
  45. }
  46. static string TranslateXmlBody(string body, string destination)
  47. {
  48. using (var reader = new StringReader(body))
  49. {
  50. XDocument document = XDocument.Load(reader);
  51. XElement envelope = (from e in document.Descendants("envelope") select e).Single();
  52. XElement destinationAddress = (from a in envelope.Descendants("destinationAddress") select a).Single();
  53. XElement message = (from m in envelope.Descendants("message") select m).Single();
  54. IEnumerable<XElement> messageType = (from mt in envelope.Descendants("messageType") select mt);
  55. XElement payload = (from p in message.Descendants("payload") select p).Single();
  56. IEnumerable<XElement> payloadType = (from pt in message.Descendants("payloadType") select pt);
  57. message.Remove();
  58. messageType.Remove();
  59. destinationAddress.Value = destination;
  60. message = new XElement("message");
  61. message.Add(payload.Descendants());
  62. envelope.Add(message);
  63. envelope.Add(payloadType.Select(x => new XElement("messageType", x.Value)));
  64. return document.ToString(SaveOptions.DisableFormatting);
  65. }
  66. }
  67. }
  68. }