Да, если ваш заголовок x-foo
, установите для свойства mappedRequestHeaders
процессора http-client
значение "HTTP_REQUEST_HEADERS, x-foo"
.
Затем, если входящее сообщение JMS имеет заголовок x-foo=bar
, оно будет отображено в файле http-client
.
Это предполагает, что вы используете локальную или кроличью шину сообщений; для redis вам нужно будет настроить шину для передачи вашего заголовка.
Если входящее сообщение JMS не имеет заголовка, вам потребуется специальный процессор (или настроенный http-client
), чтобы использовать <header-enricher/>
для добавления заголовка.
ИЗМЕНИТЬ:
Вы можете использовать redis, но вам нужно добавить имя заголовка в конфигурацию server.yml для redis, если вы хотите, чтобы они пересекали шину:
xd:
messagebus:
redis:
headers:
Однако, если вы добавите обогатитель заголовков непосредственно в свой собственный http-клиент, им не нужно будет проходить через шину.
Вы можете использовать путь json для извлечения содержимого из вашего сообщения JMS. Если вам также необходимо изменить полезную нагрузку, вам может быть проще использовать пользовательский преобразователь для создания сообщения.
Message<?> transform(Message<String> msg) {
return MessageBuilder.withPayload(newPayload)
.copyHeaders(msg)
.setHeader("accept", "...")
.setHeader(...)
. ...
.build();
}
ИЗМЕНИТЬ №2:
Я только что проверил его, и он работал нормально для меня...
<header-enricher input-channel="input" output-channel="toHttp">
<header name="foo" value="bar" />
</header-enricher>
<channel id="toHttp" />
<int-http:outbound-gateway id='http-client'
request-channel='toHttp' url-expression="${url}" http-method="${httpMethod}"
expected-response-type='java.lang.String' charset='${charset}'
reply-timeout='${replyTimeout}' reply-channel='output'
mapped-request-headers="${mappedRequestHeaders}"
mapped-response-headers="${mappedResponseHeaders}">
</int-http:outbound-gateway>
<channel id="output" />
<channel id="input" />
С этим определением потока...
xd:>stream create ticktock --definition "time --fixedDelay=5 | http-client --url='''http://localhost:8080/http/receiveGateway''' --mappedRequestHeaders=HTTP_REQUEST_HEADERS,foo | log --expression=#root" --deploy
...с этими результатами...
18:02:20,284 INFO task-scheduler-3 sink.ticktock - GenericMessage [payload=2015-02-02 18:02:20 from the other side, headers={Server=Apache-Coyote/1.1, foo=bar, connection=keep-alive, id=8a444177-b96d-70c3-58e7-d92067d6b18e, Content-Length=39, contentType=text/plain, http_statusCode=200, Date=1422918140000, timestamp=1422918140284}]
18:02:25,292 INFO task-scheduler-3 sink.ticktock - GenericMessage [payload=2015-02-02 18:02:25 from the other side, headers={Server=Apache-Coyote/1.1, foo=bar, connection=keep-alive, id=d62b46ed-dcc7-6dd0-35ea-b7b988c4f2f1, Content-Length=39, contentType=text/plain, http_statusCode=200, Date=1422918145000, timestamp=1422918145292}]
Как видите, в последнем сообщении появляется foo=bar
.
Теперь в сообщении HTTP по умолчанию пользовательские заголовки имеют префикс X-
, поэтому заголовок foo
отображается как X-foo: bar
в HTTP.
Чтобы подавить X-
, вам нужна еще одна настройка http-client
...
<header-enricher input-channel="input" output-channel="toHttp">
<header name="foo" value="bar" />
</header-enricher>
<channel id="toHttp" />
<int-http:outbound-gateway id='http-client'
request-channel='toHttp' url-expression="${url}" http-method="${httpMethod}"
expected-response-type='java.lang.String' charset='${charset}'
reply-timeout='${replyTimeout}' reply-channel='output'
header-mapper="mapper">
</int-http:outbound-gateway>
<beans:bean id="mapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
<beans:property name="userDefinedHeaderPrefix" value="" />
<beans:property name="outboundHeaderNames" value="${mappedRequestHeaders}" />
<beans:property name="inboundHeaderNames" value="${mappedResponseHeaders}" />
</beans:bean>
<channel id="output" />
<channel id="input" />
person
Gary Russell
schedule
26.01.2015