/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.activemq.artemis.api.core.client;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
/**
* A ClientSessionFactory is the entry point to create and configure ActiveMQ Artemis resources to produce and consume messages.
* <br>
* It is possible to configure a factory using the setter methods only if no session has been created.
* Once a session is created, the configuration is fixed and any call to a setter method will throw an IllegalStateException.
*/
public interface ClientSessionFactory extends AutoCloseable {
/**
* Creates a session with XA transaction semantics.
*
* @return a ClientSession with XA transaction semantics
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createXASession() throws ActiveMQException;
/**
* Creates a <em>transacted</em> session.
* <p>
* It is up to the client to commit when sending and acknowledging messages.
*
* @return a transacted ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
* @see ClientSession#commit()
*/
ClientSession createTransactedSession() throws ActiveMQException;
/**
* Creates a <em>non-transacted</em> session.
* Message sends and acknowledgements are automatically committed by the session. <em>This does not
* mean that messages are automatically acknowledged</em>, only that when messages are acknowledged,
* the session will automatically commit the transaction containing the acknowledgements.
*
* @return a non-transacted ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession() throws ActiveMQException;
/**
* Creates a session.
*
* @param autoCommitSends <code>true</code> to automatically commit message sends, <code>false</code> to commit manually
* @param autoCommitAcks <code>true</code> to automatically commit message acknowledgement, <code>false</code> to commit manually
* @return a ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession(boolean autoCommitSends, boolean autoCommitAcks) throws ActiveMQException;
/**
* Creates a session.
*
* @param autoCommitSends <code>true</code> to automatically commit message sends, <code>false</code> to commit manually
* @param autoCommitAcks <code>true</code> to automatically commit message acknowledgement, <code>false</code> to commit manually
* @param ackBatchSize the batch size of the acknowledgements
* @return a ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession(boolean autoCommitSends,
boolean autoCommitAcks,
int ackBatchSize) throws ActiveMQException;
/**
* Creates a session.
*
* @param xa whether the session support XA transaction semantic or not
* @param autoCommitSends <code>true</code> to automatically commit message sends, <code>false</code> to commit manually
* @param autoCommitAcks <code>true</code> to automatically commit message acknowledgement, <code>false</code> to commit manually
* @return a ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession(boolean xa, boolean autoCommitSends, boolean autoCommitAcks) throws ActiveMQException;
/**
* Creates a session.
* <p>
* It is possible to <em>pre-acknowledge messages on the server</em> so that the client can avoid additional network trip
* to the server to acknowledge messages. While this increase performance, this does not guarantee delivery (as messages
* can be lost after being pre-acknowledged on the server). Use with caution if your application design permits it.
*
* @param xa whether the session support XA transaction semantic or not
* @param autoCommitSends <code>true</code> to automatically commit message sends, <code>false</code> to commit manually
* @param autoCommitAcks <code>true</code> to automatically commit message acknowledgement, <code>false</code> to commit manually
* @param preAcknowledge <code>true</code> to pre-acknowledge messages on the server, <code>false</code> to let the client acknowledge the messages
* @return a ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession(boolean xa,
boolean autoCommitSends,
boolean autoCommitAcks,
boolean preAcknowledge) throws ActiveMQException;
/**
* Creates an <em>authenticated</em> session.
* <p>
* It is possible to <em>pre-acknowledge messages on the server</em> so that the client can avoid additional network trip
* to the server to acknowledge messages. While this increase performance, this does not guarantee delivery (as messages
* can be lost after being pre-acknowledged on the server). Use with caution if your application design permits it.
*
* @param username the user name
* @param password the user password
* @param xa whether the session support XA transaction semantic or not
* @param autoCommitSends <code>true</code> to automatically commit message sends, <code>false</code> to commit manually
* @param autoCommitAcks <code>true</code> to automatically commit message acknowledgement, <code>false</code> to commit manually
* @param preAcknowledge <code>true</code> to pre-acknowledge messages on the server, <code>false</code> to let the client acknowledge the messages
* @return a ClientSession
* @throws ActiveMQException if an exception occurs while creating the session
*/
ClientSession createSession(String username,
String password,
boolean xa,
boolean autoCommitSends,
boolean autoCommitAcks,
boolean preAcknowledge,
int ackBatchSize) throws ActiveMQException;
/**
* Closes this factory and any session created by it.
*/
@Override
void close();
/**
* @return {@code true} if the factory is closed, {@code false} otherwise.
*/
boolean isClosed();
/**
* Adds a FailoverEventListener to the session which is notified if a failover event occurs on the session.
*
* @param listener the listener to add
* @return this ClientSessionFactory
*/
ClientSessionFactory addFailoverListener(FailoverEventListener listener);
/**
* Removes a FailoverEventListener to the session.
*
* @param listener the listener to remove
* @return <code>true</code> if the listener was removed, <code>false</code> else
*/
boolean removeFailoverListener(FailoverEventListener listener);
/**
* Opposed to close, will call cleanup only on every created session and children objects.
*/
void cleanup();
/**
* @return the server locator associated with this session factory
*/
ServerLocator getServerLocator();
/**
* Returns the code connection used by this session factory.
*
* @return the core connection
*/
RemotingConnection getConnection();
/**
* Return the configuration used
*
* @return
*/
TransportConfiguration getConnectorConfiguration();
}