Java Spring集成不转发自定义头?
我正在Java Spring集成不转发自定义头?,java,spring,spring-integration,Java,Spring,Spring Integration,我正在我的转换器中添加一些标题: public Message<?> transform(final Message<?> message) { List<Item> items = doStuff(message); final MessageBuilder<?> messageBuilder = MessageBuilder .withPayload(message.getPayload
我的转换器中添加一些标题
:
public Message<?> transform(final Message<?> message) {
List<Item> items = doStuff(message);
final MessageBuilder<?> messageBuilder = MessageBuilder
.withPayload(message.getPayload())
.copyHeadersIfAbsent(message.getHeaders());
for (final Item item : items) {
messageBuilder.setHeader(item.getHeaderName(), item.getValue());
}
return messageBuilder.build();
}
并发送了相同的EXAMPLE\u PAYLOAD
I在log
s日志中收到了以下消息:GenericMessage[PAYLOAD=…,headers={kafka\u offset=0,id=f0a0727c-9351-274c-58b3-edee9ccbf6ce,kafka\u receivedPartitionId=0,contentType=text/plain;charset=UTF-8,kafka\u receivedTopic=myTopic.my-transformer,timestamp=1485171448947}]
为什么我的头测试不在消息头中
--编辑--
因此,如果我理解正确,我应该做如下事情:
public class MyTransformer implements Transformer {
private final EmbeddedHeadersMessageConverter converter = new EmbeddedHeadersMessageConverter();
@Override
public Message<?> transform(final Message<?> message) {
List<Item> items = doStuff(message);
final MessageBuilder<byte[]> messageBuilder = MessageBuilder
.withPayload(((String) message.getPayload()).getBytes())
.copyHeadersIfAbsent(message.getHeaders());
final int itemsSize = items.size();
final String[] headerNames = new String[itemsSize];
for (int i = 0; i < itemsSize; i++) {
final Item item = items.get(i);
messageBuilder.setHeader(item.getHeaderName(), item.getValue());
headerNames[i] = item.getHeaderName();
}
final Message<byte[]> msg = messageBuilder.build();
final byte[] rawMessageWithEmbeddedHeaders;
try {
rawMessageWithEmbeddedHeaders = converter.embedHeaders(new MessageValues(msg), headerNames);
} catch (final Exception e) {
throw new HeaderEmbeddingException(String.format("Cannot embed headers from '%s' into message: %s", items, msg), e);
}
return new GenericMessage<>(rawMessageWithEmbeddedHeaders);
}
}
公共类MyTransformer实现Transformer{
私有最终EmbeddedHeaderMessageConverter=新EmbeddedHeaderMessageConverter();
@凌驾
公共消息转换(最终消息){
列表项=doStuff(消息);
最终MessageBuilder MessageBuilder=MessageBuilder
.withPayload(((字符串)message.getPayload()).getBytes())
.copyHeadersFabSent(message.getHeaders());
final int itemsize=items.size();
最终字符串[]headerNames=新字符串[itemsSize];
对于(int i=0;i
在application.properties
中设置spring.cloud.stream.bindings.output.producer.headerMode=raw
,然后在接收端转换消息负载?或者我可以让接收方自动转换消息负载吗?您没有说是使用Spring XD还是Spring Cloud数据流,但解决方案在每种情况下都是类似的
由于kafka没有对头的本地支持,因此我们必须将它们嵌入到消息负载中。因为我们不想传输不必要的头,所以您必须通过在Spring XD的servers.yml
或Spring Cloud Stream应用程序的application.yml
(或.properties
)中设置头名称来选择要传输的头
编辑
不幸的是,没有对模式的支持。一个选项是自己使用EmbeddedHeadersMessageConverter
,并将kafka模式设置为raw(在变压器的输出目标上)。原始模式意味着绑定器不会嵌入标题
这样,下一个应用程序(没有模式raw
)应该能够解码标题,就好像它们是由转换器中的活页夹编码的一样
您被限制为255个标题。Oops,忘了提到我正在使用Spring CDF。问题是我事先不知道我的标题名。有没有一种方法可以选择加入我的transformer中的所有头?不幸的是,不支持像*
这样的模式。我在我的答案中添加了一个变通方法。我觉得还可以。那么我不能自动转换消息负载了吗?因为my transformer
之后的应用程序正在获取GenericMessage[payload=byte[18],headers={kafka_offset=0,id=9fb76cde-0ee9-b5ed-0148-3315085b207c,kafka_receivedPartitionId=0,kafka_receivedTopic=example.my-transformer,header test=something,timestamp=1485187162288}]
而我的transformer的输入是JSON.Ugh,对当然,绑定器完成的头嵌入是在消息转换/序列化之后完成的。我得好好玩玩,看看能不能想出一个变通办法。我补充道。
http --port=1234 | my-transformer | log --expression=toString()
public class MyTransformer implements Transformer {
private final EmbeddedHeadersMessageConverter converter = new EmbeddedHeadersMessageConverter();
@Override
public Message<?> transform(final Message<?> message) {
List<Item> items = doStuff(message);
final MessageBuilder<byte[]> messageBuilder = MessageBuilder
.withPayload(((String) message.getPayload()).getBytes())
.copyHeadersIfAbsent(message.getHeaders());
final int itemsSize = items.size();
final String[] headerNames = new String[itemsSize];
for (int i = 0; i < itemsSize; i++) {
final Item item = items.get(i);
messageBuilder.setHeader(item.getHeaderName(), item.getValue());
headerNames[i] = item.getHeaderName();
}
final Message<byte[]> msg = messageBuilder.build();
final byte[] rawMessageWithEmbeddedHeaders;
try {
rawMessageWithEmbeddedHeaders = converter.embedHeaders(new MessageValues(msg), headerNames);
} catch (final Exception e) {
throw new HeaderEmbeddingException(String.format("Cannot embed headers from '%s' into message: %s", items, msg), e);
}
return new GenericMessage<>(rawMessageWithEmbeddedHeaders);
}
}