Spring integration 如何在Spring集成出站适配器中为Artemis Broker的JmsMessage添加延迟

Spring integration 如何在Spring集成出站适配器中为Artemis Broker的JmsMessage添加延迟,spring-integration,activemq-artemis,Spring Integration,Activemq Artemis,我有一个jms出站通道适配器。我想向我的ApacheArtemis代理发送一条消息,并添加一个延迟 <int-jms:outbound-channel-adapter connection-factory="scheduledConnectionFactory" channel="tnpScheduledOutboundChannel" destination="tnpScheduledQueue" /> 该头作为spri

我有一个jms出站通道适配器。我想向我的ApacheArtemis代理发送一条消息,并添加一个延迟

<int-jms:outbound-channel-adapter connection-factory="scheduledConnectionFactory" channel="tnpScheduledOutboundChannel" destination="tnpScheduledQueue" />
该头作为spring集成头添加。但是它并没有被JMS拾取,即队列的消费者立即看到它

我需要添加某种JmsHeaderMapper吗?有人能指出一些文档或例子吗

更新

这是调试时在JmsSendingMessageHandler中捕获的消息

ActiveMQMessage[null]:PERSISTENT/ClientMessageImpl[messageID=0, durable=true, address=null,userID=null,properties=TypedProperties[sequenceNumber=4,file_status=0,sequenceSize=0,_AMQ_SCHED_DELIVERY=14685858,timestamp=1605707114145,correlationId=4d6fa6c8-fdcb-d69b-cd60-d260264545f5]]
如果我直接在激活器中使用jmsTemplate

public void sendDelayMessage(SdpInfoTemplate<?> message, long deliveryDelay, String queue) {
        jmsTemplateDelay.setDeliveryDelay(deliveryDelay);
        jmsTemplateDelay.setDeliveryMode(DeliveryMode.PERSISTENT);
        jmsTemplateDelay.convertAndSend("sdp-file-tnp-scheduled-dimitris-test", message, m -> {
            m.setLongProperty("_AMQ_SCHED_DELIVERY", deliveryDelay);
            m.setStringProperty("TRANSACTION_ID",message.getTransactionId());
            return m;
        });
public void sendDelayMessage(SdpInfoTemplate消息、长deliveryDelay、字符串队列){
setDeliveryDelay(deliveryDelay);
setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplateDelay.convertAndSend(“sdp文件tnp计划的dimitris测试”),消息,m->{
m、 setLongProperty(“_AMQ_SCHED_DELIVERY”,deliveryDelay);
m、 setStringProperty(“TRANSACTION_ID”,message.getTransactionId());
返回m;
});
关键部分是
jmsTemplateDelay.setDeliveryDelay(deliveryDelay);


如果我不设置此选项,它将被计划忽略,并且使用者端会立即拾取消息

默认情况下,
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

private static final list我已经更新了我的答案,我似乎没有丢失标题。另外,如果我直接使用jmsTemlpate,并且我没有
jmsTemplateDelay.setDeliveryDelay(deliveryDelay)
消息立即发送请在我的回答中查看更新。以毫秒为单位的时间计算是错误的,我只传递了差值,没有必要添加setDeliveryDelay,这归结为
\u AMQ\u SCHED\u DELIVERY
本身
private static final List<Class<?>> SUPPORTED_PROPERTY_TYPES = Arrays.asList(new Class<?>[] {
        Boolean.class, Byte.class, Double.class, Float.class