Alw*_*wyn 3 .net c# soa nservicebus azure
我有一个看起来像这样的处理程序:
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**
}
}
Run Code Online (Sandbox Code Playgroud)
现在应该回复的另一个处理程序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);
}
}
Run Code Online (Sandbox Code Playgroud)
在调试中,我已经能够跟踪消息进入CreateNewUser => FindUserByName => Reply,并且眼睛跟踪记录它甚至看起来消息使它返回到原始队列.
但是这个方法void Handle(FoundUser message)从未被调用过!我已经失去了一夜的睡眠,破坏了我的大脑,并在互联网上搜寻我可能丢球的线索.另外一件事,如果将CreateNewUserHandler变成常规处理程序(非传奇),上面的方法就会被调用!
这些是我必须继续的唯一线索(而且它并不多 - 我真的希望这个错误更有意义)
2013-05-17 14:30:29,682 [Worker.18] WARN MyProject.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - 针对ID = 377f1e49的消息提出"收到传输消息"事件失败-06e2-465f-877a-9443828e8866 System.NullReferenceException:未将对象引用设置为对象的实例.在NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder,TransportMessage msg)中,位于NServiceBus.Unicast.UnicastBus的c:\ TeamCity\buildAgent\work \nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:第1331行. TransportMessageReceived(Object sender,TransportMessageReceivedEventArgs e)位于c:\ TeamCity\buildAgent\work \nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:第1248行,位于System.EventHandler`1.Invoke(对象发送者,TEventArgs e) )位于c:\ TeamCity\buildAgent\work \nsb.master_7\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs中的NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg) :第480行
并且
2013-05-17 14:30:29,591 [Worker.18] INFO NServiceBus.Sagas.Impl.SagaDispatcherFactory [(null)] <(null)> - 无法找到带有id的消息类型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
Run Code Online (Sandbox Code Playgroud)
请帮忙!
=====================消息DTOs下面==========================
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; }
}
Run Code Online (Sandbox Code Playgroud)
传奇类是自己的:
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; }
}
Run Code Online (Sandbox Code Playgroud)
有几件事情在我身上跳了出来.
首先,尝试在Configure.With()之后和.CreateBus()之前调用初始化代码中的.Sagas().
另外,删除对saga的Bus依赖 - NServiceBus已经在saga类上定义了.
删除对CreateNewUser的ConfigureMapping调用(除非您希望每个saga接收此消息的多个实例).
最后,[Unique]在saga数据的CorrelationID属性上放置一个属性(以保证如果并行处理消息,那么最终不会有多个saga).
| 归档时间: |
|
| 查看次数: |
1988 次 |
| 最近记录: |