Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring集成不转发自定义头?_Java_Spring_Spring Integration - Fatal编程技术网

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