【问题标题】:SimpleMessageListenerContainer AbstractMethodError in Spring Integration DSL with RabbitMQSpring Integration DSL 中的 SimpleMessageListenerContainer AbstractMethodError 与 RabbitMQ
【发布时间】:2018-09-20 11:29:21
【问题描述】:

我有以下 RabbitMQ 配置

@Configuration
@IntegrationComponentScan
public class RabbitConfig {

@Autowired // TODO constructor!
private ConnectionFactory connectionFactory;

public RabbitConfig(
        @Value("${article.inbound.queue}") String queueName,
        @Value("${article.inbound.exchange}") String exchangeName,
        @Value("${article.inbound.routingkey}") String routingKey) {
    this.queueName = queueName;
    this.exchangeName = exchangeName;
    this.routingKey = routingKey;
}

@Bean
Exchange exchange() {
    return ExchangeBuilder
            .topicExchange(this.exchangeName)
            .durable(true)
            .build();
}

@Bean
Queue queue() {
    return QueueBuilder.durable(queueName).build();
}

@Bean
Binding binding() {
    return BindingBuilder.bind(queue())
            .to(exchange())
            .with(routingKey)
            .noargs();
}

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

@Bean
public SimpleMessageListenerContainer articleListenerContainer(
        ConnectionFactory connectionFactory) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
    container.setQueues(queue());
    container.setMessageConverter(jsonMessageConverter());
    return container;
}

}

简单的 Spring 集成流程

@Bean
IntegrationFlow fromMessageBroker(SimpleMessageListenerContainer messageListener) {
    return IntegrationFlows.from(Amqp.inboundAdapter(messageListener))
            .log()
            .handle(message -> {
                final MessageHeaders headers = message.getHeaders();
                final Object assetId = headers.get("assetId");
                log.info(assetId);
            })
            .get();
}

当我启动 Spring Boot 时,一切都很好,直到我发布消息以交换我定义的队列绑定。然后所有处理进一步进行,在 SimpleMessageListenerContainer 崩溃之后。

2018-09-20 13:11:08.240  INFO 49400 --- [           main] c.p.ftppush.article.MessageConsumer      : Started MessageConsumer in 1.743 seconds (JVM running for 2.386)
2018-09-20 13:11:12.309  INFO 49400 --- [erContainer#0-1] o.s.integration.handler.LoggingHandler   : GenericMessage [payload=byte[0], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=article.original.orgn.123, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@1b7db656, amqp_receivedExchange=que.article.content.pf.normal.trigger, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@1b7db656, amqp_deliveryTag=1, assetId=1qh22m9027k6d1jz29tsi510x5, amqp_consumerQueue=exc.article.content, amqp_redelivered=false, id=0d04f22a-991f-000b-63f5-5cb087b915ab, amqp_consumerTag=amq.ctag-bK2-KaIxWpk57HJeQ_38AQ, timestamp=1537441872308}]
2018-09-20 13:11:12.310  INFO 49400 --- [erContainer#0-1] com.perform.ftppush.article.Flow         : 1qh22m9027k6d1jz29tsi510x5
2018-09-20 13:11:12.317 ERROR 49400 --- [erContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Consumer thread error, thread abort.

java.lang.AbstractMethodError: org.springframework.integration.channel.interceptor.WireTap.postSend(Lorg/springframework/messaging/Message;Lorg/springframework/messaging/MessageChannel;Z)V
    at org.springframework.integration.channel.AbstractMessageChannel$ChannelInterceptorList.postSend(AbstractMessageChannel.java:607) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:460) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:181) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:227) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:47) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive(AbstractMessagingTemplate.java:45) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.integration.core.MessagingTemplate.sendAndReceive(MessagingTemplate.java:97) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:497) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage(MessagingGatewaySupport.java:465) ~[spring-integration-core-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.integration.amqp.inbound.AmqpInboundGateway.access$1000(AmqpInboundGateway.java:66) ~[spring-integration-amqp-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.integration.amqp.inbound.AmqpInboundGateway$Listener.process(AmqpInboundGateway.java:315) ~[spring-integration-amqp-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.integration.amqp.inbound.AmqpInboundGateway$Listener.onMessage(AmqpInboundGateway.java:263) ~[spring-integration-amqp-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:817) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:801) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1042) ~[spring-rabbit-2.0.4.RELEASE.jar:2.0.4.RELEASE]
    at java.base/java.lang.Thread.run(Thread.java:844) [na:na]

2018-09-20 13:11:12.322 ERROR 49400 --- [erContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Stopping container from aborted consumer
2018-09-20 13:11:12.322  INFO 49400 --- [erContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Waiting for workers to finish.
2018-09-20 13:11:12.322  INFO 49400 --- [erContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Successfully waited for workers to finish.

正如您在日志中看到的那样,流程走到了尽头,然后这个容器崩溃了。不幸的是,异常跟踪中没有有用的信息。我想知道为什么会这样。我试图将此流中的这些消息重定向到 MessageChannel,然后处理它们,但它没有帮助。

【问题讨论】:

    标签: java spring spring-boot rabbitmq spring-integration


    【解决方案1】:

    我会检查您是否有相同版本的库,例如在 stacktrace 中,您可能会发现 spring-messaging 与 spring-integration 的版本不同。 也许这就是问题所在?

    如果您可以发布您的 pom.xml 或其他构建配置,我们可能会根据需要进行更多调查。

    在这里您可能会找到对此类错误的一些解释 https://www.pixelstech.net/article/1469241003-Java-AbstractMethodError-explained-and-demonstrated

    【讨论】:

    • 感谢 spring-integration-core 的不兼容版本和 spring-messaging 是一个问题。我使用的是 spring-boot-starter-integration,它提供了 5.0.6.RELEASE,而我为 spring-integration-amqp 提供了 5.0.5.RELEASE。升级到 5.0.8.RELEASE 后,它可以正常工作而不会出错。谢谢!
    • 很高兴我帮助解决了这个问题 :)
    猜你喜欢
    • 2018-03-24
    • 2017-12-23
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2016-06-10
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多