我想使用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);
}
}
如何实现这一目标?
答案 0 :(得分:1)
我建议您查看the request/reply sample中的RebusSamples repository - 它会显示所需的配置,以便做出正确的请求/回复。
通过快速浏览代码,我可以看到以下问题/误解:
bus.Send(objGetPersonRequest)
将在另一个线程上执行,你不知道它是否失败 - 总是await bus.Send(...)
或bus.Send(...).Wait()
GetPersonRequest
(或者可能包含它的整个程序集?)映射到rebus.application.output
,然后在处理程序中执行await bus.Reply(new GetPersonResponse(...))
- 这样,“服务器”(*)将不具有任何依赖性此外 - 这可能是一个细节,但我认为这会带来更好的理解和更容易的沟通:
rebus-application.output
具有误导性masterdata
,crm
等,如果您是例如.input
,则可能会后缀masterdata.input
。希望每个端点都有一个错误队列(例如masterdata.error
和await 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");
}
时,它允许发件人保留客户端,而不是在其自己的配置中配置其端点地址。