MessageHeaders теряются в HttpOutboundGateway - PullRequest
1 голос
/ 16 июля 2010

Я реализовал интерфейс сообщений, чтобы включить некоторые заголовки для использования с 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;
    }
}

EDIT:

Версия 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 Ответ

1 голос
/ 16 июля 2010

Используемая версия не поддерживает (настраиваемую) сериализацию заголовков.Решение состоит в том, чтобы создать запрос, содержащий всю необходимую информацию, и передать его в качестве полезной нагрузки.Новая поддержка http на основе REST в версии 2.0.x поддерживает сопоставление заголовков, а также предоставляет точки расширения для преобразования сообщений (включая заголовки).

В качестве примечания, довольно редко приходится реализовывать пользовательское сообщениепоэтому вместо этого я бы создал сообщение с использованием MessageBuilder

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

. В общем, не все заголовки могут быть переданы со всеми протоколами, поэтому, если вы хотите использовать распределенную систему, она обычно более гибкаяупакуйте всю информацию, которую нужно отправить в полезную нагрузку.

...