2017-09-11 5 views
2

J'ai vu quelques questions connexes ici, mais aucune n'a fonctionné pour moi, le lapin ne sérialisera pas mon message provenant d'une autre application.RabbitMQ pas sérialiser le message, erreur de conversion

Caused by: org.springframework.amqp.AmqpException: No method found for class [B 

Ci-dessous ma classe de configuration pour recevoir les messages.

@Configuration 
public class RabbitConfiguration implements RabbitListenerConfigurer{ 

    public final static String EXCHANGE_NAME = "wallet-accounts"; 
    public final static String QUEUE_PAYMENT = "wallet-accounts.payment"; 
    public final static String QUEUE_RECHARGE = "wallet-accounts.recharge"; 

    @Bean 
    public List<Declarable> ds() { 
     return queues(QUEUE_PAYMENT, QUEUE_RECHARGE); 
    } 

    @Autowired 
    private ConnectionFactory rabbitConnectionFactory; 

    @Bean 
    public AmqpAdmin amqpAdmin() { 
     return new RabbitAdmin(rabbitConnectionFactory); 
    } 

    @Bean 
    public TopicExchange exchange() { 
     return new TopicExchange(EXCHANGE_NAME); 
    } 

    private List<Declarable> queues(String ... names){ 
     List<Declarable> result = new ArrayList<>(); 

     for (int i = 0; i < names.length; i++) { 
      result.add(makeQueue(names[i])); 
      result.add(makeBinding(names[i])); 
     } 
     return result; 
    } 

    private static Binding makeBinding(String queueName){ 
     return new Binding(queueName, DestinationType.QUEUE, EXCHANGE_NAME, queueName, null); 
    } 

    private static Queue makeQueue(String name){ 
     return new Queue(name); 
    } 

    @Bean 
    public MappingJackson2MessageConverter jackson2Converter() { 
     MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
     return converter; 
    } 

    @Bean 
    public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() { 
     DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory(); 
     factory.setMessageConverter(jackson2Converter()); 
     return factory; 
    } 

    @Override 
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { 
     registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory()); 
    } 
} 

En utilisant cette autre configuration, l'erreur est presque le même:

Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to resolve class name. Class not found [br.com.beblue.wallet.payment.application.accounts.PaymentEntryCommand] 

Configuration:

@Configuration 
public class RabbitConfiguration { 

    public final static String EXCHANGE_NAME = "wallet-accounts"; 

    public final static String QUEUE_PAYMENT = "wallet-accounts.payment"; 
    public final static String QUEUE_RECHARGE = "wallet-accounts.recharge"; 

    @Bean 
    public List<Declarable> ds() { 
     return queues(QUEUE_PAYMENT, QUEUE_RECHARGE); 
    } 

    @Autowired 
    private ConnectionFactory rabbitConnectionFactory; 

    @Bean 
    public AmqpAdmin amqpAdmin() { 
     return new RabbitAdmin(rabbitConnectionFactory); 
    } 

    @Bean 
    public TopicExchange exchange() { 
     return new TopicExchange(EXCHANGE_NAME); 
    } 

    @Bean 
    public MessageConverter jsonMessageConverter() { 
     return new Jackson2JsonMessageConverter(); 
    } 

    private List<Declarable> queues(String ... names){ 
     List<Declarable> result = new ArrayList<>(); 

     for (int i = 0; i < names.length; i++) { 
      result.add(makeQueue(names[i])); 
      result.add(makeBinding(names[i])); 
     } 
     return result; 
    } 

    private static Binding makeBinding(String queueName){ 
     return new Binding(queueName, DestinationType.QUEUE, EXCHANGE_NAME, queueName, null); 
    } 

    private static Queue makeQueue(String name){ 
     return new Queue(name); 
    } 
} 

Quelqu'un peut-il me dire ce qui ne va pas avec ces paramètres, ou ce qui manque?

Répondre

3

Aucune méthode trouvée pour la classe [B

signifie qu'il ya un défaut SimpleMessageConverter qui ne peut pas convertir votre application/json entrant. Il n'est tout simplement pas au courant de cela content-type et revient juste au byte[] pour revenir.

Classe introuvable [br.com.beblue.wallet.payment.application.accounts.PaymentEntryCommand]

Signifie que Jackson2JsonMessageConverter ne peut pas convertir votre application/json parce que l'en-tête __TypeId__ entrant, ce qui représente la classe de le contenu, ne peut pas être trouvé dans le classpath local.

Eh bien, certainement votre configuration pour le DefaultMessageHandlerMethodFactory n'a pas de sens pour la conversion AMQP. Vous devez envisager d'utiliser la définition de bean SimpleRabbitListenerContainerFactory et ses setMessageConverter. Et oui, pensez à injecter la bonne implémentation org.springframework.amqp.support.converter.MessageConverter.

https://docs.spring.io/spring-amqp/docs/1.7.3.RELEASE/reference/html/_reference.html#async-annotation-conversion

Du point de vue de démarrage du printemps, il est SimpleRabbitListenerContainerFactoryConfigurer de configurer en la matière:

https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-using-amqp-receiving

+0

Ty Artem, le problème est que je ne configure pas l'usine dans la méthode de consommation: @RabbitListener (id = "listenerPayment", files d'attente = RabbitConfiguration.QUEUE_PAYMENT, containerFactory = "myFactory") –