Skip to content

Update documentation reflecting the recent changes to AmqpInboundChannelAdapter and its header copying behavior. [INT-2344] #6324

@spring-operator

Description

@spring-operator

Victor Romero opened INT-2344 and commented

When receiving a message AmqpInboundChannelAdapter will :

public void onMessage(Message message) {
	Object payload = messageConverter.fromMessage(message);
	Map<String, ?> headers = headerMapper.toHeadersFromRequest(message.getMessageProperties());
	sendMessage(MessageBuilder.withPayload(payload).copyHeaders(headers).build());
}

That headerMapper, usually DefaultAmqpHeaderMapper, will through AbstractHeaderMapper :

private Map<String, Object> toHeaders(T source, List<String> headerPatterns) {
	Map<String, Object> headers = new HashMap<String, Object>();
	Map<String, Object> standardHeaders = this.extractStandardHeaders(source);
	this.copyHeaders(this.standardHeaderPrefix, standardHeaders, headers, headerPatterns);
	Map<String, Object> userDefinedHeaders = this.extractUserDefinedHeaders(source);
	this.copyHeaders(this.userDefinedHeaderPrefix, userDefinedHeaders, headers, headerPatterns);
	return headers;
}

this.extractUserDefinedHeaders(source); extracts them correctly but this.copyHeaders(this.userDefinedHeaderPrefix, userDefinedHeaders, headers, headerPatterns); :

private <V> void copyHeaders(String prefix, Map<String, Object> source, Map<String, Object> target, List<String> headerPatterns) {
	if (!CollectionUtils.isEmpty(source)) {
		for (Map.Entry<String, Object> entry : source.entrySet()) {
			try {
				String headerName = this.addPrefixIfNecessary(prefix, entry.getKey());
				if (this.shouldMapHeader(headerName, headerPatterns)){
					target.put(headerName, entry.getValue());
	

will only copy the headers that matches the headerPatterns (amqp_appId, amqp_clusterId, amqp_contentEncoding, amqp_contentLength, amqp_contentType, amqp_correlationId, amqp_deliveryMode, amqp_deliveryTag, amqp_expiration, amqp_messageCount, amqp_messageId, amqp_receivedExchange, amqp_receivedRoutingKey, amqp_redelivered, amqp_replyTo, amqp_timestamp, amqp_type, amqp_userId)

private volatile List<String> requestHeaderNames = new ArrayList<String>();

private volatile List<String> replyHeaderNames = new ArrayList<String>();

protected AbstractHeaderMapper() {
	...
	this.requestHeaderNames.addAll(this.getStandardRequestHeaderNames());
	...
}

Affects: 2.0.5

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions