MessageHeaders在HttpOutboundGateway上丢失了

时间:2010-07-16 08:04:19

标签: java spring-integration eai

我实现了Message接口,以包含一些用于服务器端HeaderValueRouter的头文件。

在一个虚拟机中,这可以工作(使用两个端点之间的过滤器进行测试)。

但是,如果我通过HttpOutboundGatway发送消息,我的字段将被剥离(不包括在HttpRequest中)。因此,路由信息在服务器端丢失。

我不应该操纵标题吗?

public class TaskMessage implements Message<String> {

    private MessageHeaders headers;
    private String payload;

    public TaskMessage(String taskId, String boxId, String payload) {
        super();
        this.taskId = taskId;
        this.boxId = boxId;
        this.payload = payload;
        StringMessage sm = new StringMessage(payload);
        Set<String> keySet = sm.getHeaders().keySet();

        HashMap<String, Object> map = new HashMap<String, Object>();
        for (String key : keySet) {
            map.put(key, sm.getHeaders().get(key));
        }
        map.put("taskId", taskId);
        map.put("boxId", boxId);
        headers = new MessageHeaders(map);
    }
    @Override
    public MessageHeaders getHeaders() {
        return headers;
    }

    @Override
    public String getPayload() {
        return payload;
    }
}

编辑:

版本是1.0.3

我配置的部分是:

<si:inbound-channel-adapter ref="jdbcInputAdapter" method="fetchData" channel="msgChannel">
    <si:poller max-messages-per-poll="1"> 
        <si:interval-trigger interval="5000" />
    </si:poller>
</si:inbound-channel-adapter>

<http:outbound-gateway id="httpChannelAdapter" auto-startup="true" request-timeout="1000" request-channel="msgChannel" reply-channel="replyChannel" default-url="http://localhost:8080/taskserver/gateway"/>

1 个答案:

答案 0 :(得分:1)

您使用的版本不支持(自定义)标题序列化。解决方案是制作包含所需所有信息的请求,并将其作为有效负载传递。版本2.0.x中新的基于REST的http支持确实支持标头映射,并且还公开了用于转换消息(包括标头)的扩展点。

作为旁注,必须实现自定义Message非常罕见,因此我不是这样做而是使用MessageBuilder创建消息

MessageBuilder.withPayload("foo").setHeader("taskId", "someTaskId").build();

通常,并非所有标头都可以与所有协议一起传输,因此如果您想使用分布式系统,通常可以更灵活地打包发送到有效负载中的所有信息。