无法从pojo设置相关ID

时间:2014-05-02 13:26:30

标签: spring-integration

我可以使用<int:correlation-id />标记设置相关ID,但我想从POJO设置它。所以我试过

<int:header-enricher id="he" input-channel="in" output-channel="test">
    <int:correlation-id ref="heSimple" method="resolve" />
</int:header-enricher>

这不起作用。 CorrelationId未修改。但是,如果我将其更改为

<int:header-enricher id="he" input-channel="in" output-channel="test">
    <int:header name="foo" ref="heSimple" method="resolve" />
</int:header-enricher>

这很好用。所以基本上我可以修改除此pojo之外的任何其他标题键而不是相关id。我也试过

<int:header-enricher id="he" input-channel="in" output-channel="test">
    <int:header name="correlationId" ref="heSimple" method="resolve" />
</int:header-enricher>

有趣的是,这也不起作用。

修改

private MessageChannel in;

in.send(MessageBuilder.withPayload("a1").build());
in.send(MessageBuilder.withPayload("b1").setCorrelationId("1").build());

某种程度上,该问题似乎与在发送消息时明确设置相关性ID有关。因此,在这种情况下,a1消息最终会使用标头更丰富来设置新的核心化ID,但消息b2继续使用1作为相关ID。

查看调试日志,似乎a1消息被发送到转换器并调用标头更丰富但是对于消息b2,不调用标头扩充器

[11:44:23:052] [main] DEBUG o.s.i.t.MessageTransformingHandler - org.springframework.integration.transformer.MessageTransformingHandler#0 received message:    [Payload=a1][Headers={timestamp=1399045463050, id=d20d68e1-ea7a-df20-4faf-d1864855851c}] 
in hesimple for [Payload=a1][Headers={timestamp=1399045463050, id=d20d68e1-ea7a-df20-4faf-d1864855851c}]
[11:44:23:055] [main] DEBUG o.s.i.t.MessageTransformingHandler - handler 'org.springframework.integration.transformer.MessageTransformingHandler#0' sending reply Message: [Payload=a1][Headers={timestamp=1399045463055, id=3b72891c-aaa5-3570-7715-e020529b5f83, correlationId=test}] 

对于消息b1标题已经被跳过

[11:44:23:056] [main] DEBUG o.s.i.t.MessageTransformingHandler - org.springframework.integration.transformer.MessageTransformingHandler#0 received message: [Payload=b1][Headers={timestamp=1399045463055, id=9aa2bb7e-9c6c-66e5-0d64-3afea4a57ee4, correlationId=1}] 
[11:44:23:056] [main] DEBUG o.s.i.t.MessageTransformingHandler - handler 'org.springframework.integration.transformer.MessageTransformingHandler#0' sending reply Message: [Payload=b1][Headers={timestamp=1399045463056, id=c8d54223-e506-727d-6bff-703755017403, correlationId=1}] 

标题集中没有多少

public static class HESimple {
    public String resolve(Message<String> message){
        System.out.println("in hesimple for " + message);
        return "test";
    }
}

1 个答案:

答案 0 :(得分:1)

我刚刚测试了第一个案例,它对我来说效果很好。

您使用的是什么版本的Spring Integration?

该方法的签名是什么?

关于该标题没有任何“特殊”可能导致您描述的不同行为。我建议你打开DEBUG日志来弄清楚发生了什么。

编辑:

要覆盖现有值,您需要设置overwrite="true"