Java ';序列号';标题值必须是整数。但是它很长
我正在使用RabbitMQ 3.6.10 UI发布一条消息,该消息由使用Spring Integration AMQP 4.3.11的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
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发布器进行测试——这个发布器以兼容的方式设置头类型。