Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ';序列号';标题值必须是整数。但是它很长_Java_Rabbitmq_Spring Integration_Spring Integration Amqp - Fatal编程技术网

Java ';序列号';标题值必须是整数。但是它很长

Java ';序列号';标题值必须是整数。但是它很长,java,rabbitmq,spring-integration,spring-integration-amqp,Java,Rabbitmq,Spring Integration,Spring Integration Amqp,我正在使用RabbitMQ 3.6.10 UI发布一条消息,该消息由使用Spring Integration AMQP 4.3.11的Java应用程序接收。该消息是对使用拆分器创建的早期消息的回复,因此它具有sequenceNumber和sequenceSize标题。我将这些头复制到回复中,并将它们设置为RabbitMQ UI中的类型Number。但是,在Java方面,我遇到了一个例外: org.springframework.amqp.rabbit.listener.exception.Lis

我正在使用RabbitMQ 3.6.10 UI发布一条消息,该消息由使用Spring Integration AMQP 4.3.11的Java应用程序接收。该消息是对使用拆分器创建的早期消息的回复,因此它具有
sequenceNumber
sequenceSize
标题。我将这些头复制到回复中,并将它们设置为RabbitMQ UI中的类型
Number
。但是,在Java方面,我遇到了一个例外:

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Message conversion failed
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:223)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:822)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:745)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:97)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1276)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:726)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1219)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1189)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1500(SimpleMessageListenerContainer.java:97)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1421)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: The 'sequenceNumber' header value must be an Integer.
    at org.springframework.util.Assert.isTrue(Assert.java:92)
    at org.springframework.integration.IntegrationMessageHeaderAccessor.verifyType(IntegrationMessageHeaderAccessor.java:143)
    at org.springframework.messaging.support.MessageHeaderAccessor.setHeader(MessageHeaderAccessor.java:298)
    at org.springframework.messaging.support.MessageHeaderAccessor.copyHeaders(MessageHeaderAccessor.java:389)
    at org.springframework.integration.support.MessageBuilder.copyHeaders(MessageBuilder.java:177)
    at org.springframework.integration.support.MessageBuilder.copyHeaders(MessageBuilder.java:47)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.processMessage(AmqpInboundChannelAdapter.java:243)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:203)
    ... 14 more
我检查了Java端的
sequenceNumber
sequenceSize
头的类型是否为
Long
,而不是
Integer
。但是,在RabbitMQ UI中没有任何选项可以实现这一差异。消息将由非Java应用程序发送,那么如何确保通过Spring集成将头识别为整数


当我使用Java客户机发布回复并将标题值设置为
Integer
,消费者就会接受它们。因此,这可能是RabbitMQ UI的头类型不够具体(例如,32位与64位数字)或Java客户端对预期值类型过于严格的限制。有人能确认其中一个吗?

向适配器的侦听器容器中添加一个
MessagePostProcessor

@Bean
public AmqpInboundChannelAdapter adapter(ConnectionFactory cf) {
    AmqpInboundChannelAdapter adapter = new AmqpInboundChannelAdapter(listenerContainer(cf));
    adapter.setOutputChannelName("someChannel");
    return adapter;
}

@Bean
public AbstractMessageListenerContainer listenerContainer(ConnectionFactory cf) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
    container.setQueueNames("foo");
    container.setAfterReceivePostProcessors(m -> {
        if (m.getMessageProperties().getHeaders()
                .get(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER) instanceof Long) {
            Integer sequenceNumber = ((Long) m.getMessageProperties().getHeaders()
                    .get(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER)).intValue();
            m.getMessageProperties().getHeaders().put(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER,
                    sequenceNumber);
        }
        return m;
    });
    return container;
}

请打开a-我们可能应该更宽松一些,特别是如果值是<
整数。MAX_value

如果您说您只是传播它们,那么“将它们设置为类型”是什么意思?您是否在手动测试某些内容,例如回复案例?@ArtemBilan-是的,我正在通过RabbitMQ UI手动测试回复案例。其中唯一可能的标题类型是:字符串、数字、布尔值、列表。我这里所说的“传播”是指“手动复制值”;请参阅我的答案以了解解决方法。是的,您可以在
聚合器之前使用
headerenrich
执行相同的操作。我的意思是重新映射
IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER
,但使用
.intValue()
overwrite=true
选项。@Artem-失败在org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:223)的通道适配器
Doh。。。事实上,
IntegrationMessageHeaderAccessor.verifyType()
在这个问题上仅限于
Integer
。今天不是我的日子。。。抱歉吵闹了,谢谢你,加里。我创造了。现在,我将使用一个简单的Java发布器进行测试——这个发布器以兼容的方式设置头类型。