2016-10-19 2 views
1

NServiceBus를 지난 주 출시 된 최신 버전 (새 구현 포함)으로 업데이트 한 후 클라이언트에서 json을 보낼 때 이상한 오류가 표시됩니다.NServiceBus 처리기에서 메타 데이터 오류 발생

나는 클라이언트와 수신기의 디스플레이에서이 메시지 메시지를 보내드립니다 :

2016년 10월 18일 22 : 16 : ID로 33.612 정보 MFG.Receiver.DeviceHandler있어 메시지 : a222b136-6a4e-를 474e-8012-cc1c24e5e539

아래의 처리기에 중단 점이 있으며 메시지 개체가 구워지고 아무런 문제가 없어야 함을 보여줍니다. 16 :

2016년 10월 18일 22

이 : 33.666 정보 NServiceBus.RecoverabilityExecutor 즉시 재시도 메시지를 다시 시도 할 것입니다이 말에 응답 방법 안타

public class DeviceHandler : IHandleMessages<DeviceRequest> 
{ 
    private readonly IDeviceProvider _provider = new DeviceProvider(); 
    private static readonly ILog Log = LogManager.GetLogger<DeviceHandler>(); 

    public Task Handle(DeviceRequest message, IMessageHandlerContext context) 
    { 
     Log.Info($"Got message with id: {context.MessageId}"); 
     ... 
     return context.SendLocal($"Message with Id {context.MessageId} received."); 
    } 
} 

, 그것은 아래의 오류가 발생합니다 'a222b136-6a4e-474e-8012-cc1c24e5e539'예외로 인해 : System.Exception : 'System.String'에 대한 메타 데이터를 찾을 수 없습니다. 다음을 확인하십시오. 1. 'System.String'은 초기 스캐닝에 포함됩니다. 2. 'System.String'은 'IMessage', 'IEvent'또는 'ICommand'중 하나를 구현하거나 인터페이스를 구현하지 않으려는 경우 '눈에 거슬리지 않는 모드'를 사용할 수 있습니다. C에서 NServiceBus.Unicast.Messages.MessageMetadataRegistry.GetMessageMetadata (타입은 messageType)에서 : \ 빌드 \ SRC \ NServiceBus.Core \ 유니 캐스트 \ 메시지 \ MessageMetadataRegistry.cs : 라인 39

나는 이유를 모르겠어요

을 보낸 JSON ... 이미 핸들러에서 메시지를받은 후 System.String 오류가 발생 것이고 속성이 채워집니다 것은 다음과 같습니다

{ 
    "$type": "DeviceRequest, MFG.Domain", 
    "Id": "devices-65", 
    "DeviceId": 1, 
    "Location": "Orlando", 
    "DeviceType": "test" 
} 

내 보낸 사람을 (클라이언트)는 다음과 같습니다

static void Main() 
{ 
    ... 
     using (var channel = connection.CreateModel()) 
     { 
      var messageId = Guid.NewGuid().ToString(); 
      var properties = channel.CreateBasicProperties(); 
      properties.MessageId = messageId; 

      var payload = GenerateJsonPayload(); 

      channel.BasicPublish(string.Empty, ServerEndpointName, false, properties, Encoding.UTF8.GetBytes(payload)); 
      Console.WriteLine($"Message with id {messageId} sent to queue."); 
     } 
    ... 
} 

public static string GenerateJsonPayload() 
{ 
    var obj = new DeviceRequest 
    { 
     DeviceId = 1, 
     DeviceType = "test", 
     Location = "Orlando" 
    }; 

    var settings = new JsonSerializerSettings 
    { 
     TypeNameHandling = TypeNameHandling.All 
    }; 

    var result = JsonConvert.SerializeObject(obj, Formatting.Indented, settings); 

    return result; 
} 

나는 전에 "메타 데이터를 찾을 수 없습니다"문제를 했어, 그것은 잘못된 JSON으로 인해 또는 유형을 가지고하지 않았다. 나는 JsonSerializerSettings을 제거, 단지 직렬화 된 객체를 통과하면, 내가 대신 오류를 얻을 :

2016년 10월 18일 22 : 31 : 27.698 ERROR NServiceBus.RecoverabilityExecutor 이동 메시지 '6405179d-ea36-4264-af2a-704da19af120을 '예외로 인해 처리가 실패했기 때문에'오류 큐 '오류가 발생했습니다 : NServiceBus.MessageDeserializationException : 전송 메시지에서 논리 메시지를 추출하는 동안 오류가 발생했습니다. 6405179d-ea36-4264-af2a-704da19af120 ---> System.Exception : 'Newtonsoft.Json.Linq.JObject'에 대한 메타 데이터를 찾을 수 없습니다.

여기에 누락 된 내용이 없습니다. 이전 버전에서는 문제가되지 않았습니다. 이거 버그 야 ...?

답변

3

SendLocal 작업에 구체적인 메시지 유형을 사용하십시오.

메시지 처리 중 일환으로 return context.SendLocal($"Message with Id {context.MessageId} received.");.이렇게하면 "string"유형의 메시지를 로컬 큐에 보냅니다. NServiceBus는 메시지 유형 "string"에 대한 메시지 메타 데이터가 등록되지 않았 음을 알려줍니다. 따라서 메시지를 생성 할 수없고 예외가 발생합니다.

+0

그래, 내가 질문을 게시 한 후 아침에 이것을 알아 챘다. 당신은 100 % 문제였습니다. 나는 한 지점에서 문자열을 전달할 수 있었다고 맹세 할 수있었습니다. 그래도 고마워. 잘하면 누군가 다른 사람을 도울 것입니다. – ragerory