001package ca.uhn.fhir.jpa.subscription.channel.api;
002
003/*-
004 * #%L
005 * HAPI FHIR Storage api
006 * %%
007 * Copyright (C) 2014 - 2022 Smile CDR, Inc.
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import ca.uhn.fhir.jpa.subscription.channel.subscription.IChannelNamer;
024
025/**
026 * This interface is the factory for Queue Channels, which are the low level abstraction over a
027 * queue (e.g. memory queue, JMS queue, Kafka stream, etc.) for any purpose.
028 */
029public interface IChannelFactory {
030
031        /**
032         * Create a channel that is used to receive messages from the queue.
033         *
034         * <p>
035         * Implementations can choose to return the same object for multiple invocations of this method (and {@link #getOrCreateReceiver(String, Class, ChannelConsumerSettings)}
036         * when invoked with the same {@literal theChannelName} if they need to, or they can create a new instance.
037         * </p>
038         *
039         * @param theChannelName     The actual underlying queue name
040         * @param theMessageType     The object type that will be placed on this queue. Objects will be Jackson-annotated structures.
041         * @param theChannelSettings Contains the configuration for subscribers.
042         */
043        IChannelReceiver getOrCreateReceiver(String theChannelName, Class<?> theMessageType, ChannelConsumerSettings theChannelSettings);
044
045        /**
046         * Create a channel that is used to send messages to the queue.
047         *
048         * <p>
049         * Implementations can choose to return the same object for multiple invocations of this method (and {@link #getOrCreateReceiver(String, Class, ChannelConsumerSettings)}
050         * when invoked with the same {@literal theChannelName} if they need to, or they can create a new instance.
051         * </p>
052         *
053         * @param theChannelName     The actual underlying queue name
054         * @param theMessageType     The object type that will be placed on this queue. Objects will be Jackson-annotated structures.
055         * @param theChannelSettings Contains the configuration for senders.
056         */
057        IChannelProducer getOrCreateProducer(String theChannelName, Class<?> theMessageType, ChannelProducerSettings theChannelSettings);
058
059        /**
060         * @return the IChannelNamer used by this factory
061         */
062        IChannelNamer getChannelNamer();
063}