【问题标题】:Is it possible to overwrite the value of the message header id in spring integration?是否可以在spring集成中覆盖消息头id的值?
【发布时间】:2015-02-09 21:08:48
【问题描述】:

我正在使用来自 的声明检查模式,但我希望使用自定义 ID 存储消息。这应该很容易,因为消息存储实现使用传入的消息头 id 来存储消息。是否可以使用标头丰富器或/和标头过滤器覆盖消息标头 ID 的值?

消息头 id 和消息存储

SimpleMessageStoreJdbcMessageStore 正在使用传入消息 ID 来存储消息。在addMessage 方法中(示例来自SimpleMessageStore)我们有:

this.idToMessage.put(message.getHeaders().getId(), message); 

要拥有自定义 ID,在声明签入之前拥有一个标头丰富器就足够了,其中 id 标头的值被替换为自定义值。例如:

<int:header-enricher input-channel="gateDocCheckInReqChannel" 
    output-channel="gateDocCheckInEnrichedChannel">
    <int:header name="id" expression="payload.getDocumentID()" overwrite="true" />
</int:header-enricher>
<int:claim-check-in input-channel="gateDocCheckInEnrichedChannel" 
    output-channel="gateDocCheckInReplyChannel" message-store="messageStore" />

它不起作用;消息头 id 不会被覆盖。我尝试在标题丰富器之前对 ID 进行标题过滤器,但它也不起作用。

相关

我发现这篇关于删除被某些内部逻辑撤消的标题字段的旧帖子:
http://forum.spring.io/forum/spring-projects/integration/74099-remove-header-fields
此外,在撤消标头删除的消息处理程序上存在这个已关闭的问题 INT-923。
https://jira.spring.io/browse/INT-923
假设标题过滤器上的问题 INT-1135 修复了此行为。
https://jira.spring.io/browse/INT-1135

【问题讨论】:

    标签: spring-integration spring spring-integration


    【解决方案1】:

    实际上IDTIMESTAMP 标头是只读MessageHeaderAccessor):

    protected boolean isReadOnly(String headerName) {
        return (MessageHeaders.ID.equals(headerName) || MessageHeaders.TIMESTAMP.equals(headerName));
    }
    

    它们是为具体的Message 指定的,它是不可变的

    这些标头是为框架内​​部使用而设计的,不能更改。

    对于像您这样的用例,需要引入添加 businessKey 并处理不考虑那些 interlan 标头的问题。

    既然你说你想通过claim-ckeck之后的ID从商店中确定一条消息,我建议你考虑使用MetadataStore来保持ID &lt;-&gt; businessKey对有能力恢复它们在未来不知何故。

    当然,您可以尝试将MutableMessageBuilder 用于您的特定用例:

    MutableMessageBuilder.fromMessage(message)
                .setHeader(MessageHeaders.ID, UUID.randomUUID())
                .build()
    

    但是ID 无论如何都必须是UUID

    没错:HeaderFilter 也不会删除那些只读标头。

    【讨论】:

      【解决方案2】:
      I have overridden the http_requestMethod by doing as like below. The request coming is Post which I have removed from Headers and added PUT.
      
      
      <int:header-filter input-channel="headerFilterChannel"
              header-names="http_requestMethod" output-channel="closeAndCloneOldTasksHeaderEnricherChannel" />
      
          <int:header-enricher input-channel="closeAndCloneOldTasksHeaderEnricherChannel"
              output-channel="caresToSfdc">
              <int:header name="http_requestMethod" value="PUT" />
          </int:header-enricher>
      
      ***Before Overriding Log*** 
      GenericMessage [payload=com.cardinalhealth.chh.exception.model.GenericResponse@1948829c, headers={http_requestMethod=POST, replyChannel=org.springframework.messag
      
      **After  Overriding Log :**
      GenericResponse@142cd5fd, headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@5710c249, http_requestMethod=PUT, 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 2020-11-06
        • 2011-05-06
        • 2013-09-17
        • 1970-01-01
        相关资源
        最近更新 更多