【发布时间】:2013-05-18 01:36:00
【问题描述】:
我有一个如下所示的处理程序:
public class CreateNewUserHandler :
Saga<UncorroboratedCreateNewUser>,
IAmStartedByMessages<CreateNewUser>,
IHandleMessages<FoundUser>
{
[Dependency]
public IBus Bus { get; set; }
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<CreateNewUser>(saga => saga.CorrelationId, req => req.CorrelationId);
ConfigureMapping<FoundUser>(saga => saga.CorrelationId, foundUser => foundUser.CorrelationId); //CorrelationId is of type Guid here
}
public void Handle(CreateNewUser message)
{
Mapper.DynamicMap(message, Data, typeof(CreateNewUser), typeof(UncorroboratedCreateNewUser));
Data.CorrelationId = message.CorrelationId;
Bus.Send(new FindUserByUserName { CorrelationId = Data.CorrelationId, UserName = message.UserName });
}
public void Handle(FoundUser message)
{
//**THIS BLOCK WAS NEVER HIT**
}
}
现在应该回复FoundUser 的其他处理程序是这样的:
public class FindUserByUserNameHandler : IMessageHandler<FindUserByUserName>
{
private readonly UserRepository _userRepository;
public IBus Bus { get; set; }
public FindUserByUserNameHandler(UserRepository userRepository)
{
_userRepository = userRepository;
}
public void Handle(FindUserByUserName message)
{
var foundUser = _userRepository.FindByUserName(message.UserName);
FoundUser result = Bus.CreateInstance<FoundUser>( _ => _.CorrelationId = message.CorrelationId);
if (foundUser != null)
{
result = Mapper.DynamicMap<FoundUser>(foundUser);
result.IsUserFound = true;
}
else
{
result.
AuthenticationUserName = message.UserName;
result.IsUserFound = false;
}
Bus.Reply(result);
}
}
在调试中,我已经能够跟踪进入 CreateNewUser => FindUserByName => 回复的消息,并且观察跟踪日志,它甚至看起来消息返回到原始队列。
然而,void Handle(FoundUser message) 方法从未被调用过!我已经失去了一个晚上的睡眠,破坏了我的大脑并在互联网上寻找关于我可能在哪里丢球的线索。如果要将 CreateNewUserHandler 转换为常规处理程序(非 saga),则会调用上面的方法!
这些是我必须继续下去的唯一线索(而且并不多 - 我真的希望这个错误更有意义)
2013-05-17 14:30:29,682 [Worker.18] 警告 MyProject.Unicast.Transport.Transactional.TransactionalTransport [(null)] - 未能引发“收到传输消息”事件 对于 ID=377f1e49-06e2-465f-877a-9443828e8866 的消息 System.NullReferenceException:对象引用未设置为实例 的一个对象。在 NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder,TransportMessage 消息)在 c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1331 在 NServiceBus.Unicast.UnicastBus.TransportMessageReceived(对象 发件人,TransportMessageReceivedEventArgs e) 在 c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1248 在 System.EventHandler`1.Invoke(对象发送者,TEventArgs e)在 NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage 味精)在 c:\TeamCity\buildAgent\work\nsb.master_7\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 480
还有
2013-05-17 14:30:29,591 [Worker.18] 信息 NServiceBus.Sagas.Impl.SagaDispatcherFactory [(null)] - 可以 找不到消息类型 MyProject.Messages.FoundUser 的传奇 编号 377f1e49-06e2-465f-877a-9443828e8866。要去调用 SagaNotFoundHandlers。
并且以防万一需要配置:
NServiceBus.Configure.With(busAssemblies)
.Log4Net()
.License(Config.Default.NServiceBus_License)
.DefineEndpointName(endPointName)
.UnityBuilder(serviceBusDiConfiguration.Container)
.DontUseTransactions() //I don't know why this is needed, but doesn't seem to get very far otherwise.
.AzureConfigurationSource()
.AzureSagaPersister()
.AzureSubcriptionStorage()
.AzureDataBus()
.JsonSerializer()
.AzureServiceBusMessageQueue()
.UnicastBus()
.LoadMessageHandlers()
.CreateBus()
.Start();
BusConfiguration.Configurer.ConfigureComponent(uoWImplementer, DependencyLifecycle.InstancePerUnitOfWork); //For the custom unitOfWork
请帮忙!
=====================下面的消息 DTO======================= ===
public class CreateNewUser : ICommand
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public Guid CorrelationId { get; set; }
}
public class FindUserByUserName : IMessage
{
public Guid CorrelationId { get; set; }
public string UserName { get; set; }
}
public class FoundUser: IMessage
{
public bool IsUserFound { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string AuthenticationUserName { get; set; }
public Guid CorrelationId { get; set; }
}
还有 saga 类本身:
public class UncorroboratedCreateNewUser : IContainSagaData
{
public virtual Guid Id { get; set; }
public virtual string Originator { get; set; }
public virtual string OriginalMessageId { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual Guid CorrelationId { get; set; }
}
【问题讨论】:
-
你能告诉我们你的消息的定义吗?
-
以上更新,谢谢
标签: c# .net azure soa nservicebus