2010-07-16 19 views
1

J'ai implémenté l'interface Message pour inclure certains en-têtes à utiliser avec un HeaderValueRouter côté serveur. Au sein d'une même machine virtuelle, cela fonctionne (testé à l'aide d'un filtre entre deux extrémités). Mais si j'envoie le message via HttpOutboundGatway, mes champs seront supprimés (non inclus dans la demande HttpRequest). Et par conséquent, les informations de routage sont perdues du côté serveur.MessageHeaders se perdre à HttpOutboundGateway

Ne suis-je pas censé manipuler les en-têtes?

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; 
    } 
} 

EDIT:

La version 1.0.3

La partie de ma configuration est:

<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"/> 

Répondre

1

La version que vous utilisez ne sérialisation d'en-tête non (personnalisé) . La solution consisterait à créer une requête contenant toutes les informations nécessaires et à la transmettre en tant que charge utile. Le nouveau support HTTP basé sur REST dans la version 2.0.x prend en charge le mappage d'en-tête et expose également les points d'extension pour la conversion des messages (y compris les en-têtes).

Comme une note de côté, il est assez rare d'avoir à mettre en œuvre un message personnalisé, donc au lieu de le faire, je créerais un message en utilisant MessageBuilder

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

En général tous les en-têtes peuvent être transférés avec tous les protocoles, donc si vous voulez utiliser un système distribué, il est généralement plus flexible d'emballer toutes les informations dont vous avez besoin d'envoyer dans la charge utile.

+0

@iwein J'ai ajouté la version et la config (partielle) à la question. Je voudrais savoir pourquoi les en-têtes sont dépouillés de mon message. Merci d'avance. – stacker

+0

réponse mise à jour en conséquence – iwein

+0

@iwein merci beaucoup, j'ai changé la charge de paiement à o carte de chaîne, chaîne cela fonctionne maintenant – stacker