001/* 002 * Copyright 2002-2014 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.messaging.core; 018 019import java.util.Map; 020 021import org.springframework.messaging.Message; 022 023/** 024 * An extension of {@link AbstractMessageReceivingTemplate} that adds support for 025 * request-reply style operations as defined by {@link MessageRequestReplyOperations}. 026 * 027 * @author Mark Fisher 028 * @author Rossen Stoyanchev 029 * @author Stephane Nicoll 030 * @since 4.0 031 */ 032public abstract class AbstractMessagingTemplate<D> extends AbstractMessageReceivingTemplate<D> 033 implements MessageRequestReplyOperations<D> { 034 035 @Override 036 public Message<?> sendAndReceive(Message<?> requestMessage) { 037 return sendAndReceive(getRequiredDefaultDestination(), requestMessage); 038 } 039 040 @Override 041 public Message<?> sendAndReceive(D destination, Message<?> requestMessage) { 042 return doSendAndReceive(destination, requestMessage); 043 } 044 045 protected abstract Message<?> doSendAndReceive(D destination, Message<?> requestMessage); 046 047 048 @Override 049 public <T> T convertSendAndReceive(Object request, Class<T> targetClass) { 050 return convertSendAndReceive(getRequiredDefaultDestination(), request, targetClass); 051 } 052 053 @Override 054 public <T> T convertSendAndReceive(D destination, Object request, Class<T> targetClass) { 055 return convertSendAndReceive(destination, request, null, targetClass); 056 } 057 058 @Override 059 public <T> T convertSendAndReceive(D destination, Object request, Map<String, Object> headers, Class<T> targetClass) { 060 return convertSendAndReceive(destination, request, headers, targetClass, null); 061 } 062 063 @Override 064 public <T> T convertSendAndReceive(Object request, Class<T> targetClass, MessagePostProcessor postProcessor) { 065 return convertSendAndReceive(getRequiredDefaultDestination(), request, targetClass, postProcessor); 066 } 067 068 @Override 069 public <T> T convertSendAndReceive(D destination, Object request, Class<T> targetClass, MessagePostProcessor postProcessor) { 070 return convertSendAndReceive(destination, request, null, targetClass, postProcessor); 071 } 072 073 @SuppressWarnings("unchecked") 074 @Override 075 public <T> T convertSendAndReceive(D destination, Object request, Map<String, Object> headers, 076 Class<T> targetClass, MessagePostProcessor postProcessor) { 077 078 Message<?> requestMessage = doConvert(request, headers, postProcessor); 079 Message<?> replyMessage = sendAndReceive(destination, requestMessage); 080 return (replyMessage != null ? (T) getMessageConverter().fromMessage(replyMessage, targetClass) : null); 081 } 082 083}