2014-12-18 1 views
0

나는 Azure Service Bus에서 작동하는 NimbusAPI을 사용하고 있습니다. Nimbus를 사용하여 요청/응답 작업에서 응답을받는 데 문제가 있습니다. 아래는 단위 테스트의 결과입니다. 나는 요청을 성공적으로 얻을 수 있고, 중단 점에서 단계를 밟아 응답을 반환하는 것을 볼 수있다. 클라이언트는 단위 테스트, MVC 응용 프로그램 또는 다른 어떤 것이 든 항상 시간 초과됩니다. 아래 출력의 두 번째 행부터 마지막 ​​행까지는 실제로 응답이 수신되었음을 나타내지 만 마지막 행에는 응답이 없다고 나와 시간이 초과되었습니다. 내가 확인 할 필요가 누락 무언가는 제외NimbusAPI 응답이 수신되었다고 알려졌지만 시간 초과되었습니다.

12/17/2014 9:42:07 PM -05:00: Constructing bus... 12/17/2014 9:42:08 
PM -05:00: Creating message pumps and subscriptions. 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.RequestResponse.ResponseMessagePumpFactory 
(Nimbus.Infrastructure.RequestResponse.ResponseMessagePumpFactory) 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.MessageSendersAndReceivers.NimbusQueueMessageReceiver 
(inputqueue.myapp.mypc) Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.MessagePump (Nimbus.Infrastructure.MessagePump) 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.NimbusMessagingFactory 
(Nimbus.Infrastructure.NimbusMessagingFactory) Nimbus.GarbageMan: 
Tracking Nimbus.Infrastructure.Commands.CommandMessagePumpsFactory 
(Nimbus.Infrastructure.Commands.CommandMessagePumpsFactory) 12/17/2014 
9:42:08 PM -05:00: Creating command message pumps Nimbus.GarbageMan: 
Tracking 
Nimbus.Infrastructure.RequestResponse.RequestMessagePumpsFactory 
(Nimbus.Infrastructure.RequestResponse.RequestMessagePumpsFactory) 
12/17/2014 9:42:08 PM -05:00: Creating request message pumps 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.RequestResponse.MulticastRequestMessagePumpsFactory 
(Nimbus.Infrastructure.RequestResponse.MulticastRequestMessagePumpsFactory) 
12/17/2014 9:42:08 PM -05:00: Creating multicast request message pumps 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.Events.MulticastEventMessagePumpsFactory 
(Nimbus.Infrastructure.Events.MulticastEventMessagePumpsFactory) 
12/17/2014 9:42:08 PM -05:00: Creating multicast event message pumps 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.Events.CompetingEventMessagePumpsFactory 
(Nimbus.Infrastructure.Events.CompetingEventMessagePumpsFactory) 
12/17/2014 9:42:08 PM -05:00: Creating competing event message pumps 
12/17/2014 9:42:08 PM -05:00: Message pumps and subscriptions are all 
created. 12/17/2014 9:42:08 PM -05:00: Bus built. Job done! 
Nimbus.GarbageMan: Tracking 
Nimbus.Infrastructure.MessageSendersAndReceivers.NimbusQueueMessageSender 
(Nimbus.Infrastructure.MessageSendersAndReceivers.NimbusQueueMessageSender) 
12/17/2014 9:42:08 PM -05:00: Sending request 
Myapp.Messages.DoItRequest to 
q.myapp.messages.doitrequest 
[MessageId:bc1c79cc1965489c84703f5898bd6fd8, 
CorrelationId:bc1c79cc1965489c84703f5898bd6fd8] 12/17/2014 9:42:08 PM 
-05:00: Sent request Myapp.Messages.DoItRequest to q.myapp.messages.doitrequest 
[MessageId:bc1c79cc1965489c84703f5898bd6fd8, 
CorrelationId:bc1c79cc1965489c84703f5898bd6fd8] 12/17/2014 9:42:08 PM 
-05:00: Waiting for response to Myapp.Messages.DoItRequest from 
q.myapp.messages.doitrequest 
[MessageId:bc1c79cc1965489c84703f5898bd6fd8, 
CorrelationId:bc1c79cc1965489c84703f5898bd6fd8] 12/17/2014 9:42:08 PM 
-05:00: Flushing outbound message queue q.myapp.messages.doitrequest (1 messages) 12/17/2014 
9:42:08 PM -05:00: Received response to 
Myapp.Messages.DoItRequest from 
q.myapp.messages.doitrequest 
[MessageId:bc1c79cc1965489c84703f5898bd6fd8, 
CorrelationId:bc1c79cc1965489c84703f5898bd6fd8] in the form of 
System.Threading.Tasks.Task`1[[Myapp.Messages.DoItResponse, 
Myapp.Messages, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null]] 12/17/2014 9:42:08 PM -05:00: Fetching existing 
queues... System.TimeoutException : No response was received from the 
bus within the configured timeout. Expected a 
'Myapp.Messages.DoItResponse'. 

그것은 내가 응답을 가지고 말한다 ...

9:42:08 PM -05:00: **Received response to 
    Myapp.Messages.DoItRequest from 
    q.myapp.messages.doitrequest** 
    [MessageId:bc1c79cc1965489c84703f5898bd6fd8, 
    CorrelationId:bc1c79cc1965489c84703f5898bd6fd8] **in the form of 
    System.Threading.Tasks.Task`1[[Myapp.Messages.DoItResponse**, 
    Myapp.Messages, Version=1.0.0.0, Culture=neutral, 
    PublicKeyToken=null]] 12/17/2014 

내가하지

9:42:08 PM -05:00: Fetching existing 
queues... System.TimeoutException : **No response was received from the 
bus within the configured timeout. Expected a 
'Myapp.Messages.DoItResponse'.** 

했다 있습니까?

+1

SO 서식을 알아야합니다. – Raptor

+0

코드 블록 내부의 줄을 굵게 만들려고했으나 작동하지 않습니다. 그래서 그들을 분리하여 텍스트를 굵게 표시하여 더 쉽게 읽을 수있게했습니다. 죄송합니다. 편집 해 주셔서 고마워요. –

답변

2

오. 나의. 이런.

bus.Start();에 실제로 버스를 시작하는 데 실패한 것으로 보입니다. 나는 버스를 만들었거나 구성했는데, 메시지를 보내는데 충분하지만 실제로는 .Start();이 실제로 구독되어 응답을 기다리는 것이 필요합니다. 이것은 왜 내가 백엔드에서 붕괴되어 응답이 만들어지는지를 볼 수 있고 심지어 대기열에있는 메시지가 돌아 오는 것을 볼 수 있지만 실제 요청은 클라이언트에서 시간 초과됩니다.

1

이것은 호출 스레드의 동기화 컨텍스트로 인한 것 같습니다.

(아래 기사 링크 참조), 동기화 컨텍스트가 무엇인지보고 후 당신이 교착 상태를 가지고 가능성이 null이 아닌 경우

System.Threading.Thread.CurrentThread.ExecutionContext.SynchronizationContext 

에 시계를 설정합니다.

은 다음처럼 보이는 테스트 케이스가있는 경우 :

[Test] 
public async Task WhenSendingARequestWeShouldReceiveAResponse() 
{ 
    var result = await _bus.Request(new SomeRequest()); 
    result.ShouldBeOfType<SomeResponse>(); 
} 

다음이로 교체하려고 :

[Test] 
public async Task WhenSendingARequestWeShouldReceiveAResponse() 
{ 
    var result = await _bus.Request(new SomeRequest()).ConfigureAwait(false); 
    result.ShouldBeOfType<SomeResponse>(); 
} 

나이 :

[Test] 
public Task WhenSendingARequestWeShouldReceiveAResponse() 
{ 
    return Task.Run(async() => 
    { 
     var result = await _bus.Request(new SomeRequest()); 
     result.ShouldBeOfType<SomeResponse>(); 
    } 
} 

하는 것이 도움이 될 것입니다 당신은 교착 상태 또는 다른 문제를 겪고 있는지 여부를 해결합니다.

동기화 컨텍스트에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/magazine/gg598924.aspx을 참조하십시오. 제쳐두고 어디서나 호출하고 있습니다 .Wait()는 작업 또는 작업을 반환하는 메서드에서 문제를 묻습니다.

+1

Nimbus가 발신자의 행동에 대해 이러한 종류의 문제를 피하도록하기 위해 노력하고 있다고 덧붙여 야합니다. 그것은 소리가 나는 것처럼 간단하지 않다 :) – uglybugger

+0

네, 분명히 저글링이 많이 있습니다. 같은 결과로 .ConfigureAwait (false)를 추가하도록 테스트를 변경했습니다. 나는 또한 문제를 요청한 것처럼 보입니다. 핸들러는 다음을 사용하여 시작하는 Windows 서비스의 일부입니다. 작업.Run (() => MyWinService.MainAsync()). Wait(); –

+0

SynchronizationContext는 내가 보는 클라이언트 관점에서 null로 유지됩니다. 지금 핸들러를 확인 중입니다. –

관련 문제