J'ai évalué différents composants de messagerie .Net et j'ai des problèmes avec Rebus en utilisant MSMQ que je n'ai pas été en mesure de résoudre avec des documents, des échantillons ou google.Rebus Newbie Questions
Je crois que la seule chose unique à propos de mon scénario est que mon client peut envoyer ou publier des messages. On dirait que ça devrait être simple, mais j'ai les problèmes suivants. Les extraits de code suivent les problèmes.
Questions:
- MetersRequest pas être manipulé. Ils sont simplement en train de s'accumuler dans la file d'attente outgoingMetersRequests.
- Obtention d'une erreur indiquant que la file d'attente CreditAuthRequests n'existe pas ou que je n'ai pas d'autorisations. J'ai confirmé que la file d'attente n'est pas créée, mais mon hypothèse est que Rebus s'assurera qu'elle est créée au moment où la file d'attente outgoingMetersRequests est créée. (Note de côté: l'erreur disparaît si je supprime le 'await' de Bus.Send (...), mais la file d'attente n'est toujours pas créée et les messages ne sont pas là.)
= ==========
CLIENT DE
private void InitializeBus()
{
_messageActivator = new BuiltinHandlerActivator();
Configure.With(_messageActivator)
.Transport(t => t.UseMsmq("publisher"))
.Routing(r => r.TypeBased().Map<MetersRequest>("outgoingMetersRequests")
.Map<CreditAuthorizationRequest>("creditAuthRequests"))
.Start();
}
private async Task SendCreditAuthRequestAsync(int numberToSend)
{
var cardNumber = generateCardNumber();
await _messageActivator.Bus.Send(new CreditAuthorizationRequest(cardNumber));
await WriteOutputAsync($"Sent credit auth request for card {cardNumber}.");
}
private async Task SendMetersRequestAsync(int numberToSend)
{
await _messageActivator.Bus.Send(new MetersRequest());
await WriteOutputAsync("Sent meters request.");
}
FIN =========== CLIENT
========== ==
DU SERVICE
private void InitializeBus()
{
_messageActivator = new BuiltinHandlerActivator();
_messageActivator.Register<PosOnlineHandler>(() => new PosOnlineHandler(WriteOutputAsync));
_messageActivator.Register<PumpDownHandler>(() => new PumpDownHandler(WriteOutputAsync));
_messageActivator.Register<MetersRequestHandler>(() => new MetersRequestHandler(WriteOutputAsync, _messageActivator.Bus));
_messageActivator.Register<CreditAuthorizationHandler>(() => new CreditAuthorizationHandler(WriteOutputAsync, _messageActivator.Bus));
Configure.With(_messageActivator)
.Transport(t => t.UseMsmq("subscriber1"))
.Routing(r => r.TypeBased()
.Map<PumpDownEvent>("publisher")
.Map<PosOnlineEvent>("publisher")
.Map<MetersRequest>("outgoingMetersRequests")
.Map<CreditAuthorizationRequest>("creditAuthRequests"))
.Start();
_messageActivator.Bus.Subscribe<PumpDownEvent>().Wait();
_messageActivator.Bus.Subscribe<PosOnlineEvent>().Wait();
}
public class MetersRequestHandler : IHandleMessages<MetersRequest>
{
private readonly Random _randomizer = new Random();
private readonly Func<string, Task> _outputDelegate2;
private readonly IBus _messageBus;
public MetersRequestHandler(Func<string, Task> outputDelegate, IBus messageBus)
{
_outputDelegate2 = outputDelegate;
_messageBus = messageBus;
}
public async Task Handle(MetersRequest message)
{
var pump = _randomizer.Next(20);
var meters = _randomizer.Next();
decimal dollars = (decimal)_randomizer.NextDouble();
var response = new MetersResponse(pump, meters, dollars);
await _outputDelegate2($"Sending MetersResponse: (Pump={pump}) (Meters={meters}) (Dollars ={dollars}");
await _messageBus.Reply(response);
}
}
============
Cela aide, mais comment configurer plus d'une file d'attente entrante? – scottctr
Un point d'extrémité Rebus == une file d'attente d'entrée – mookid8000
OK, cela fait partie de ce qui me dégoûte. Mon modèle est que mes services peuvent nécessiter des événements et/ou des demandes de types différents et que je devrais avoir une file d'attente pour chaque type. Je ne vois pas comment créer plus d'un point de terminaison dans un service. S'il vous plaît laissez-moi savoir s'il y a quelques documents que j'ai manqués. Merci!! – scottctr