1
resposta

Kafka: Batches, correlation ids e dead letters: Problemas no meu batch send message

Pessoal eu estou tendo um problema, basicamente meu batch está apresentando um problema dizendo que o id da mensagem é nula:

AVISO.: Encontrei um novo registro agora: 15/10/2024 - 11:44:58

.:PROCESSANDO BATCH NOVA:.


Tópico: ECOMMERCE_SEND_MESSAGE_TO_ALL_USERS java.lang.NullPointerException: Cannot invoke "br.com.alura.ecommerce.CorrelationId.continueWith(String)" because the return value of "br.com.alura.ecommerce.Message.getId()" is null at br.com.alura.ecommerce.BatchSendMessageService.parse(BatchSendMessageService.java:65) at br.com.alura.ecommerce.KafkaService.run(KafkaService.java:48) at br.com.alura.ecommerce.BatchSendMessageService.main(BatchSendMessageService.java:44)


Processando ordem, checando por novo usuário.

mas eu não sei bem o que fazer para verificar isso

aqui está todo o código que fui desenvolvendo junto do curso, basicamente fiz até o fim do módulo 3, mas acho que falta alguma coisa. Mesmo pegando o projeto do curso não consegui encontrar.

link do repositório

1 resposta

Olá, João. Tudo bem?

Esse erro que você reportou NullPointerException, está relacionado ao retorno nulo do método getId() da classe Message. A exceção ocorre quando você tenta chamar o método continueWith sobre um ID que é nulo. Faz o seguinte:

  • Verifique se o ID não é nulo no momento da criação da mensagem no KafkaDispatcher. Adicione uma verificação simples no método sendAsync:

    if (id == null) {
        throw new IllegalArgumentException("ID da mensagem não pode ser nulo!");
    }
    
    var value = new Message<>(id, payload);
    

    Isso ajudará a capturar o problema mais cedo, no envio, evitando a propagação do erro até o batch.

  • Se o ID da mensagem não foi definido corretamente, você pode definir um ID padrão na inicialização. Por exemplo, ao enviar uma mensagem para todos os usuários, você pode garantir que o CorrelationId seja passado corretamente.

    CorrelationId correlationId = message.getId() != null ? 
                                  message.getId() : 
                                  new CorrelationId("BatchSendMessageService");
    

    Então, use este correlationId no envio:

    userDispatcher.sendAsync(
        message.getPayload(),
        u.getUuid(),
        correlationId.continueWith(BatchSendMessageService.class.getSimpleName()), 
        u
    );
    

    Com essas alterações, você deverá evitar o erro de NullPointerException.

Espero ter ajudado.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!