默认情况下,在
DefaultJmsHeaderMapper
中使用 JmsSendingMessageHandler
。如果值属于支持的类型,它将所有标头映射到 jmsMessage.setObjectProperty(propertyName, value);
:
private static final List<Class<?>> SUPPORTED_PROPERTY_TYPES = Arrays.asList(new Class<?>[] {
Boolean.class, Byte.class, Double.class, Float.class
或者你在中间的某个地方丢失了标题......
更新
抱歉,您让我们感到困惑。您的
_AMQ_SCHED_DELIVERY
确实作为最终 JMS 消息中的属性存在。当你谈论setDeliveryDelay()
时,这是完全不同的故事。
您可以做的就是扩展
DynamicJmsTemplate
。覆盖其 getDeliveryDelay()
并从您填充的 ThreadLocal
中获取所需的值,然后再向该 <int-jms:outbound-channel-adapter>
发送消息。
这是我们绝对可以添加到
DynamicJmsTemplate
和 DynamicJmsTemplateProperties
中以通过上述 JmsSendingMessageHandler
解决的问题。但目前的解决方法仅为此 ThreadLocal
选项实现您自己的 deliveryDelay
变量。
对于此设置(Spring Integration + Artemis),如果您想延迟向消费者传递消息,您可以这样做
.setHeader(Message.HDR_SCHEDULED_DELIVERY_TIME.toString(), System.currentTimeMillis() + {yourDelayInMs})
关键点是您应该设置从纪元开始的以毫秒为单位的交付时间,而不是实际的延迟值。