2010-07-16 20 views
1

我實現了Message接口以包含一些HeaderValueRouter在服務器端使用的頭文件。MessageHeaders在HttpOutboundGateway處迷路

在一個VM中工作(使用兩個端點之間的過濾器進行測試)。

但是,如果我通過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

您使用的是不支持的版本(自定義)頭系列化。解決方案是創建一個請求,其中包含所有需要的信息並將其作爲有效負載傳遞。 2.0.x版本中基於REST的新HTTP支持確實支持頭部映射,並且還公開了用於轉換消息(包括頭部)的擴展點。

作爲一個方面說明,這是相當罕見的是實現一個自定義消息,所以不是這樣做,我會用MessageBuilder

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

一般來說不是所有的標題可以被轉移創建消息所有的協議,所以如果你想使用分佈式系統,通常將你需要發送的數據打包到有效載荷中更加靈活。

+0

@iwein我添加了版本和配置(部分)的問題。我想知道爲什麼標題被從我的消息中刪除。提前致謝。 – stacker 2010-07-17 07:06:26

+0

答案更新後相應 – iwein 2010-07-18 12:45:29

+0

@iwein非常感謝,我將工作負載更改爲o地圖的字符串,字符串現在工作 – stacker 2010-07-18 16:14:44