2011-12-22 3 views
0

메시지 대기열에 메시지를 저장하기 위해 nServivceBus를 사용하고 있습니다. 나는 runmefirst를 달렸다. 박쥐. 메시지 큐 서비스가 성공적으로 설치되었습니다. 웹 애플리케이션을 실행할 때 개인 대기열이 성공적으로 작성됩니다.nServiceBus가 MessageQueue에 지속되지 않습니다.

메시지를 보내면 메시지 큐에 표시되지 않습니다. 오류가 발생하지 않습니다. 나는 혼란 스럽다.

설정

Configure config = Configure.WithWeb(); 
    config 
     .StructureMapBuilder(Container) 
     .MsmqSubscriptionStorage() 
     .MsmqTransport() 
      .IsTransactional(true) 
      .PurgeOnStartup(false) 
     .XmlSerializer() 
     .UnicastBus() 
      .ImpersonateSender(false) 
     .CreateBus() 
     .Start(); 

구성

<configuration> 
    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <MsmqSubscriptionStorageConfig Queue="subscribe" /> 
    <MsmqTransportConfig InputQueue="subscribe" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"/> 
    <UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="Momntz" Endpoint="subscribe"/> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

코드

private readonly IDocumentDatabase _database; 
private readonly IBus _bus; 

/// <summary> 
/// Initializes a new instance of the <see cref="HomeIndexCommandHandler"/> class. 
/// </summary> 
/// <param name="database">The database.</param> 
/// <param name="bus"></param> 
public CreateUserCommandHandler(IDatabases database, IBus bus) 
{ 
    _database = database.RavenDb; 
    _bus = bus; 
} 

/// <summary> 
/// Executes the specified command. 
/// </summary> 
/// <param name="command">The command.</param> 
public void Execute(CreateUserCommand command) 
{ 
    var user = Mapper.DynamicMap<CreateUserCommand, User>(command); 
    user.AccountStatus = UserAccountStatus.Active; 

    var foundUser = CheckForDuplicateUsername(user); 

    if(foundUser != null) 
    { 
     throw new DuplicateUsernameException(string.Format("Username '{0}' already exists.", user.Username)); 
    } 

    _database.Add(user); 

    var denormalizeMessage = Mapper.DynamicMap<User, UserDenormalizeMessage>(user); 
    _bus.Send(denormalizeMessage); 
} 

업데이트

의도는 웹 사이트가 메시지를 처리하기 위해 메시지 대기열과 서비스로 메시지를 보내는 것입니다. 매우 간단합니다. 클라이언트와 서버 간의 응답이나 통신을 찾고 있지 않습니다. 그것은 일방 통행입니다.

+0

"메시지 대기열에 메시지를 저장하기 위해 nServivceBus를 사용합니다."*라고 약간 혼란스러워합니다. MSMQ 대기열에 메시지를 저장하는 것은 최종 게임이 아닌 전송 수준 세부 정보입니다. 유용하게 쓰일 수있는 것은 당신이 실제로 달성하고자하는 것을 우리에게 말하면됩니다. –

답변

2

당신은 당신의 입력 큐에 대한 귀하의 메시지 라우팅 설정에 대해 동일한 큐 주소를 사용하고있는 것으로 나타납니다이 정확하지 않은

<MsmqTransportConfig InputQueue="subscribe" ... 

and 

<UnicastBusConfig> 
    <MessageEndpointMappings> 
    <add Messages="Momntz" Endpoint="subscribe"/> ... 

. MsmqTransportConfig 섹션은 서비스의 로컬 입력 대기열을 정의합니다. UnicastBusConfig 섹션은 메시지를 보낼 대상 주소 지정을 정의합니다.

log4net에서 기본적으로 생성되는 로그 파일을 보았습니까? 아마도 거기에 몇 가지 오류 정보가있을 것입니다.

또한 가입 큐를 정의했습니다 :

<MsmqSubscriptionStorageConfig Queue="subscribe" /> 

이것은 당신이 당신의 서비스가 게시자의 역할을 할 것을 제안합니다. 이 경우 Bus.Send()을 사용하지 않고 Bus.Publish()을 사용하지 않을 것이고이 경우 N섹션에 라우팅 정보를 추가 할 필요가 없습니다. NServiceBus의 게시/가입 기능에 의해 처리되기 때문입니다.

+0

감사합니다. 저는 nServiceBus와 메시지 기반 아키텍처가 처음입니다. 게시물에 대한 업데이트를 추가했습니다. –

관련 문제