/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.amqp.rabbit.core; import org.springframework.amqp.AmqpException; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessagePostProcessor; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.core.ParameterizedTypeReference; /** * Rabbit specific methods for Amqp functionality. * @author Mark Pollack * @author Mark Fisher * @author Gary Russell */ public interface RabbitOperations extends AmqpTemplate { /** * Execute the callback with a channel and reliably close the channel afterwards. * @param action the call back. * @param <T> the return type. * @return the result from the * {@link ChannelCallback#doInRabbit(com.rabbitmq.client.Channel)}. * @throws AmqpException if one occurs. */ <T> T execute(ChannelCallback<T> action) throws AmqpException; /** * Invoke the callback and run all operations on the template argument in a dedicated * thread-bound channel and reliably close the channel afterwards. * @param action the call back. * @param <T> the return type. * @return the result from the * {@link OperationsCallback#doInRabbit(RabbitOperations operations)}. * @throws AmqpException if one occurs. * @since 2.0 */ <T> T invoke(OperationsCallback<T> action) throws AmqpException; /** * Delegate to the underlying dedicated channel to wait for confirms. The connection * factory must be configured for publisher confirms and this method must be called * within the scope of an {@link #invoke(OperationsCallback)} operation. * Requires {@code CachingConnectionFactory#setPublisherConfirms(true)}. * @param timeout the timeout * @return true if acks and no nacks are received. * @throws AmqpException if one occurs. * @since 2.0 * @see com.rabbitmq.client.Channel#waitForConfirms(long) */ boolean waitForConfirms(long timeout) throws AmqpException; /** * Delegate to the underlying dedicated channel to wait for confirms. The connection * factory must be configured for publisher confirms and this method must be called * within the scope of an {@link #invoke(OperationsCallback)} operation. * Requires {@code CachingConnectionFactory#setPublisherConfirms(true)}. * @param timeout the timeout * @throws AmqpException if one occurs. * @since 2.0 * @see com.rabbitmq.client.Channel#waitForConfirmsOrDie(long) */ void waitForConfirmsOrDie(long timeout) throws AmqpException; /** * Return the connection factory for this operations. * @return the connection factory. * @since 2.0 */ ConnectionFactory getConnectionFactory(); /** * Send a message to a specific exchange with a specific routing key. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void send(String exchange, String routingKey, Message message, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a default exchange * with a default routing key. * * @param message a message to send * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void correlationConvertAndSend(Object message, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a default exchange * with a specific routing key. * * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void convertAndSend(String routingKey, Object message, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a specific exchange * with a specific routing key. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void convertAndSend(String exchange, String routingKey, Object message, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a default exchange * with a default routing key. * * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void convertAndSend(Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a default exchange * with a specific routing key. * * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void convertAndSend(String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Convert a Java object to an Amqp {@link Message} and send it to a specific exchange * with a specific routing key. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @throws AmqpException if there is a problem */ void convertAndSend(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a default routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param message a message to send. * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(Object message, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(String routingKey, Object message, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * specific exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(String exchange, String routingKey, Object message, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a default routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * specific exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @return the response if there is one * @throws AmqpException if there is a problem */ Object convertSendAndReceive(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a default routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param message a message to send. * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one. * @throws AmqpException if there is a problem. */ <T> T convertSendAndReceiveAsType(Object message, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one * @throws AmqpException if there is a problem */ <T> T convertSendAndReceiveAsType(String routingKey, Object message, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * specific exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one * @throws AmqpException if there is a problem */ <T> T convertSendAndReceiveAsType(String exchange, String routingKey, Object message, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a default routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one * @throws AmqpException if there is a problem */ <T> T convertSendAndReceiveAsType(Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * default exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one * @throws AmqpException if there is a problem */ <T> T convertSendAndReceiveAsType(String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Basic RPC pattern with conversion. Send a Java object converted to a message to a * specific exchange with a specific routing key and attempt to receive a response, * converting that to a Java object. Implementations will normally set the reply-to * header to an exclusive queue and wait up for some time limited by a timeout. * Requires a * {@link org.springframework.amqp.support.converter.SmartMessageConverter}. * * @param exchange the name of the exchange * @param routingKey the routing key * @param message a message to send * @param messagePostProcessor a processor to apply to the message before it is sent * @param correlationData data to correlate publisher confirms. * @param responseType the type to convert the reply to. * @param <T> the type. * @return the response if there is one * @throws AmqpException if there is a problem */ <T> T convertSendAndReceiveAsType(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData, ParameterizedTypeReference<T> responseType) throws AmqpException; /** * Callback for using the same channel for multiple RabbitTemplate * operations. * @param <T> the type the callback returns. * * @since 2.0 */ @FunctionalInterface public interface OperationsCallback<T> { /** * Execute any number of operations using a dedicated * {@link com.rabbitmq.client.Channel} as long as those operations are performed * on the template argument and on the calling thread. The channel will be * physically closed when the callback exits. * * @param operations The operations. * @return The result. */ T doInRabbit(RabbitOperations operations); } }