2017-04-12 49 views
2

我有一個JMS出站網關,用於將消息發送到隊列管理器中的多個隊列。目標是使用destinationExpression方法上飛決定:如何動態添加傳遞延遲到出站郵件?

@Bean 
public IntegrationFlow sendTo101() { 
    return flow -> flow 
      .handle(Jms 
        .outboundAdapter(context.getBean("connection101", ConnectionFactory.class)) 
        .destinationExpression("headers.destinationName") 
        .configureJmsTemplate(spec -> spec 
          .explicitQosEnabled(true) 
          .get().setDeliveryDelay(180000) 
        ) 
        .get(), 
        endpointSpec -> endpointSpec.advice(context.getBean(RequestHandlerRetryAdvice.class)) 
      ); 

} 

現在有一個需要交付的延遲設置爲進來的消息的某些子集有沒有辦法使用該消息的內容確定我是否應該添加延遲或不?

我可以有一個過濾器進一步檢查此屬性,並將流重定向到另一個出站網關,但這將是相當多的冗餘代碼,所以我想確保沒有更好的方法。

另外,不同的消息需要不同的延遲。是否有可能爲每封郵件設置不同的延遲時間?我意識到延遲屬性在Message Producer上,而不是根據JMS規範在消息上設置的內容,但即使阻礙了性能,我仍然可以爲每條消息創建一個新的JMS生產者。

感謝您的幫助!

回答

0

那麼,我可以建議在這種情況下,喜歡有頂級JmsTemplate豆,並在Jms.outboundAdapter()之前設置其deliveryDelay。但在這種情況下,必須在同一個Thread的流程中處理所有消息,以避免併發修改。

我們有DynamicJmsTemplate這是根據DynamicJmsTemplateProperties。最後一個使用ThreadLocal更改priorityreceiveTimeout每個請求。

我很確定您對deliveryDelay的請求可以被視爲該功能的一部分。

只有目標JmsTemplate沒有使用getter,而是直接訪問屬性。所以,首先我們要問Spring Framework團隊(https://jira.spring.io/browse/SPR)重構JmsTemplate內部以獲得更好的繼承。