REBUS在队列中发送消息,并在另一个应用程序中接收

时间:2015-10-15 05:17:31

标签: servicebus rebus

我想使用rebus实现以下场景。我正在创建发件人应用程序和一个接收应用程序。会有一个类假设

   public class GetPersonRequest
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class GetPersonResponse
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

我将使用值将此类对象发送到队列中。并希望在接收器中显示这些值。怎么做到这一点?

SENDER代码如下:

  static void Main(string[] args)
       {
            GetPersonRequest objGetPersonRequest = new GetPersonRequest();
            objGetPersonRequest.Id = 12;
            objGetPersonRequest.Name = "Kumar";

        using (var activator = new BuiltinHandlerActivator())
        {
            activator.Register(() => new PrintName());

            var bus = Configure.With(activator)
  .Logging(l => l.None())
  .Transport(t => t.UseMsmq("rebus-application.input"))
  .Routing(r => r.TypeBased().Map<GetPersonRequest>("rebus.application.output"))
  .Start();

            bus.Send(objGetPersonRequest);

            Console.WriteLine("Press enter to quit");
            Console.ReadLine();
        }

RECEIVER在另一个控制台应用程序中的代码如下:

   static void Main(string[] args)
        {
            using (var activator = new BuiltinHandlerActivator())
            {
            activator.Register(() => new PrintName());

            var bus = Configure.With(activator)
      .Logging(l => l.None())
      .Transport(t => t.UseMsmq("rebus-application.output"))
      .Routing(r => r.TypeBased().Map<GetPersonResponse>("rebus-application.input"))
      .Start();


            Console.WriteLine("Press enter to quit");
            Console.ReadLine();
        }
    }

 class PrintName : IHandleMessages<GetPersonResponse>
    {
        public async Task Handle(GetPersonResponse objGetPersonResponse)
        {
            Console.WriteLine("RebusDetails Name is {0}", objGetPersonResponse.Name);
        }
    }

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

我建议您查看the request/reply sample中的RebusSamples repository - 它会显示所需的配置,以便做出正确的请求/回复。

通过快速浏览代码,我可以看到以下问题/误解:

  • Rebus方法是异步的,因此bus.Send(objGetPersonRequest)将在另一个线程上执行,你不知道它是否失败 - 总是await bus.Send(...)bus.Send(...).Wait()
  • 在许多情况下,只有“clients”(*)应该有端点映射 - 在您的情况下,您应该将GetPersonRequest(或者可能包含它的整个程序集?)映射到rebus.application.output,然后在处理程序中执行await bus.Reply(new GetPersonResponse(...)) - 这样,“服务器”(*)将不具有任何依赖性

此外 - 这可能是一个细节,但我认为这会带来更好的理解和更容易的沟通:

  • 没有“输出队列”这样的东西 - 所有队列都是端点的输入队列,将其作为输入队列 - 因此,我认为名称rebus-application.output具有误导性
  • 我建议您将队列名称更改为更好地标识每个端点的内容,例如由于您的服务器似乎能够返回某个人的详细信息,因此您可以将其称为masterdatacrm等,如果您是例如.input,则可能会后缀masterdata.input。希望每个端点都有一个错误队列(例如masterdata.errorawait bus.Reply(...))。

我希望这是有道理的:)

(*)根据我的经验,对端点的客户端和服务器角色进行非常明确的区分是有益的,其中客户端是没有(或很少)afferent couplings的端点,这使得它们可以轻松实现添加/删除/更改,服务器是具有更多传入耦合的端点。

当您从服务器#include <stdio.h> #include <stdlib.h> void main() { FILE *file; int size=0,len,i=0; char *str,str2,filename[20]; printf("enter the filename :"); scanf("%s",filename); //------------------For Write data in File------------------// file = fopen(filename,"w"); //fseek(file,0L,2); printf("input data:"); while((str2=getchar())!= 27) { putc(str2,file); } fclose(file); //------------------For Read data in File------------------// file = fopen(filename,"r"); fseek(file,0L,2); len = ftell(file); size=len; fseek(file,0L,0); str=(char *)malloc(len *sizeof(char)); while((str2=getc(file))!= EOF) { str[i]=str2;i++; } printf("\nFile Data:-\n"); for(i=0;i<size;i++) { printf("%c",str[i]); } fclose(file); printf("\n"); } 时,它允许发件人保留客户端,而不是在其自己的配置中配置其端点地址。