/* * 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.core.server; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.core.config.BridgeConfiguration; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.DivertConfiguration; import org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl; import org.apache.activemq.artemis.core.paging.PagingManager; import org.apache.activemq.artemis.core.persistence.OperationContext; import org.apache.activemq.artemis.core.persistence.StorageManager; import org.apache.activemq.artemis.core.postoffice.PostOffice; import org.apache.activemq.artemis.core.remoting.server.RemotingService; import org.apache.activemq.artemis.core.replication.ReplicationEndpoint; import org.apache.activemq.artemis.core.replication.ReplicationManager; import org.apache.activemq.artemis.core.security.Role; import org.apache.activemq.artemis.core.security.SecurityAuth; import org.apache.activemq.artemis.core.security.SecurityStore; import org.apache.activemq.artemis.core.server.cluster.ClusterManager; import org.apache.activemq.artemis.core.server.cluster.ha.HAPolicy; import org.apache.activemq.artemis.core.server.group.GroupingHandler; import org.apache.activemq.artemis.core.server.impl.Activation; import org.apache.activemq.artemis.core.server.impl.AddressInfo; import org.apache.activemq.artemis.core.server.impl.ConnectorsService; import org.apache.activemq.artemis.core.server.management.ManagementService; import org.apache.activemq.artemis.core.server.plugin.ActiveMQPluginRunnable; import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerPlugin; import org.apache.activemq.artemis.core.server.reload.ReloadManager; import org.apache.activemq.artemis.core.settings.HierarchicalRepository; import org.apache.activemq.artemis.core.settings.impl.AddressSettings; import org.apache.activemq.artemis.core.transaction.ResourceManager; import org.apache.activemq.artemis.core.version.Version; import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; import org.apache.activemq.artemis.spi.core.protocol.SessionCallback; import org.apache.activemq.artemis.spi.core.security.ActiveMQSecurityManager; import org.apache.activemq.artemis.utils.ExecutorFactory; /** * This interface defines the internal interface of the ActiveMQ Artemis Server exposed to other components * of the server. * <p> * This is not part of our public API. */ public interface ActiveMQServer extends ServiceComponent { /** * Sets the server identity. * <p> * The identity will be exposed on logs. It may help to debug issues on the log traces and * debugs. * <p> * This method was created mainly for testing but it may be used in scenarios where you need to * have more than one Server inside the same VM. */ void setIdentity(String identity); String getIdentity(); String describe(); void addActivationParam(String key, Object val); Configuration getConfiguration(); ServiceRegistry getServiceRegistry(); RemotingService getRemotingService(); StorageManager getStorageManager(); PagingManager getPagingManager(); ManagementService getManagementService(); ActiveMQSecurityManager getSecurityManager(); NetworkHealthCheck getNetworkHealthCheck(); Version getVersion(); NodeManager getNodeManager(); /** * @return */ ReplicationEndpoint getReplicationEndpoint(); /** * it will release hold a lock for the activation. */ void unlockActivation(); /** * it will hold a lock for the activation. This will prevent the activation from happening. */ void lockActivation(); /** * Returns the resource to manage this ActiveMQ Artemis server. * * @throws IllegalStateException if the server is not properly started. */ ActiveMQServerControlImpl getActiveMQServerControl(); void destroyQueue(SimpleString queueName, SecurityAuth session, boolean checkConsumerCount, boolean removeConsumers, boolean autoDeleteAddress) throws Exception; void registerActivateCallback(ActivateCallback callback); void unregisterActivateCallback(ActivateCallback callback); /** * Register a listener to detect problems during activation * * @param listener @see org.apache.activemq.artemis.core.server.ActivationFailureListener */ void registerActivationFailureListener(ActivationFailureListener listener); /** * Remove a previously registered failure listener * * @param listener */ void unregisterActivationFailureListener(ActivationFailureListener listener); /** * Alert activation failure listeners of a failure. * * @param e the exception that caused the activation failure */ void callActivationFailureListeners(Exception e); /** * @param callback {@link org.apache.activemq.artemis.core.server.PostQueueCreationCallback} */ void registerPostQueueCreationCallback(PostQueueCreationCallback callback); /** * @param callback {@link org.apache.activemq.artemis.core.server.PostQueueCreationCallback} */ void unregisterPostQueueCreationCallback(PostQueueCreationCallback callback); /** * @param queueName */ void callPostQueueCreationCallbacks(SimpleString queueName) throws Exception; /** * @param callback {@link org.apache.activemq.artemis.core.server.PostQueueDeletionCallback} */ void registerPostQueueDeletionCallback(PostQueueDeletionCallback callback); /** * @param callback {@link org.apache.activemq.artemis.core.server.PostQueueDeletionCallback} */ void unregisterPostQueueDeletionCallback(PostQueueDeletionCallback callback); /** * @param queueName */ void callPostQueueDeletionCallbacks(SimpleString address, SimpleString queueName) throws Exception; void registerBrokerPlugin(ActiveMQServerPlugin plugin); void unRegisterBrokerPlugin(ActiveMQServerPlugin plugin); void registerBrokerPlugins(List<ActiveMQServerPlugin> plugins); List<ActiveMQServerPlugin> getBrokerPlugins(); void callBrokerPlugins(ActiveMQPluginRunnable pluginRun); boolean hasBrokerPlugins(); void checkQueueCreationLimit(String username) throws Exception; ServerSession createSession(String name, String username, String password, int minLargeMessageSize, RemotingConnection remotingConnection, boolean autoCommitSends, boolean autoCommitAcks, boolean preAcknowledge, boolean xa, String defaultAddress, SessionCallback callback, boolean autoCreateQueues, OperationContext context, Map<SimpleString, RoutingType> prefixes) throws Exception; SecurityStore getSecurityStore(); void removeSession(String name) throws Exception; Set<ServerSession> getSessions(); HierarchicalRepository<Set<Role>> getSecurityRepository(); HierarchicalRepository<AddressSettings> getAddressSettingsRepository(); OperationContext newOperationContext(); int getConnectionCount(); long getTotalConnectionCount(); long getTotalMessageCount(); long getTotalMessagesAdded(); long getTotalMessagesAcknowledged(); long getTotalConsumerCount(); PostOffice getPostOffice(); QueueFactory getQueueFactory(); ResourceManager getResourceManager(); List<ServerSession> getSessions(String connectionID); /** * @return a session containing the meta-key and meata-value */ ServerSession lookupSession(String metakey, String metavalue); ClusterManager getClusterManager(); SimpleString getNodeID(); boolean isActive(); String getUptime(); long getUptimeMillis(); /** * Returns whether the initial replication synchronization process with the backup server is complete; applicable for * either the live or backup server. */ boolean isReplicaSync(); /** * Wait for server initialization. * * @param timeout * @param unit * @return {@code true} if the server was already initialized or if it was initialized within the * timeout period, {@code false} otherwise. * @throws InterruptedException * @see java.util.concurrent.CountDownLatch#await(long, java.util.concurrent.TimeUnit) */ boolean waitForActivation(long timeout, TimeUnit unit) throws InterruptedException; /** * Creates a transient queue. A queue that will exist as long as there are consumers. * The queue will be deleted as soon as all the consumers are removed. * <p> * Notice: the queue won't be deleted until the first consumer arrives. * * @param address * @param name * @param filterString * @param durable * @throws org.apache.activemq.artemis.api.core.ActiveMQInvalidTransientQueueUseException if the shared queue already exists with a different {@code address} or {@code filterString} * @throws NullPointerException if {@code address} is {@code null} */ void createSharedQueue(final SimpleString address, final RoutingType routingType, final SimpleString name, final SimpleString filterString, final SimpleString user, boolean durable) throws Exception; Queue createQueue(SimpleString address, RoutingType routingType, SimpleString queueName, SimpleString filter, boolean durable, boolean temporary) throws Exception; Queue createQueue(final SimpleString address, final RoutingType routingType, final SimpleString queueName, final SimpleString user, final SimpleString filterString, final boolean durable, final boolean temporary) throws Exception; Queue createQueue(SimpleString address, RoutingType routingType, SimpleString queueName, SimpleString filter, boolean durable, boolean temporary, int maxConsumers, boolean purgeOnNoConsumers, boolean autoCreateAddress) throws Exception; Queue createQueue(SimpleString address, RoutingType routingType, SimpleString queueName, SimpleString filter, SimpleString user, boolean durable, boolean temporary, boolean autoCreated, Integer maxConsumers, Boolean purgeOnNoConsumers, boolean autoCreateAddress) throws Exception; Queue createQueue(SimpleString address, RoutingType routingType, SimpleString queueName, SimpleString filter, SimpleString user, boolean durable, boolean temporary, boolean ignoreIfExists, boolean transientQueue, boolean autoCreated, int maxConsumers, boolean purgeOnNoConsumers, boolean autoCreateAddress) throws Exception; @Deprecated Queue createQueue(SimpleString address, SimpleString queueName, SimpleString filter, boolean durable, boolean temporary) throws Exception; @Deprecated Queue deployQueue(String address, String queue, String filter, boolean durable, boolean temporary) throws Exception; @Deprecated Queue deployQueue(SimpleString address, SimpleString queue, SimpleString filter, boolean durable, boolean temporary) throws Exception; Queue locateQueue(SimpleString queueName); BindingQueryResult bindingQuery(SimpleString address) throws Exception; QueueQueryResult queueQuery(SimpleString name) throws Exception; AddressQueryResult addressQuery(SimpleString name) throws Exception; void destroyQueue(SimpleString queueName) throws Exception; void destroyQueue(SimpleString queueName, SecurityAuth session) throws Exception; void destroyQueue(SimpleString queueName, SecurityAuth session, boolean checkConsumerCount) throws Exception; void destroyQueue(SimpleString queueName, SecurityAuth session, boolean checkConsumerCount, boolean removeConsumers) throws Exception; String destroyConnectionWithSessionMetadata(String metaKey, String metaValue) throws Exception; ScheduledExecutorService getScheduledPool(); ExecutorFactory getExecutorFactory(); ExecutorFactory getIOExecutorFactory(); void setGroupingHandler(GroupingHandler groupingHandler); GroupingHandler getGroupingHandler(); ReplicationManager getReplicationManager(); void deployDivert(DivertConfiguration config) throws Exception; void destroyDivert(SimpleString name) throws Exception; ConnectorsService getConnectorsService(); void deployBridge(BridgeConfiguration config) throws Exception; void destroyBridge(String name) throws Exception; ServerSession getSessionByID(String sessionID); void threadDump(); /** * return true if there is a binding for this address (i.e. if there is a created queue) * * @param address * @return */ boolean isAddressBound(String address) throws Exception; void stop(boolean failoverOnServerShutdown) throws Exception; Queue updateQueue(String name, RoutingType routingType, Integer maxConsumers, Boolean purgeOnNoConsumers) throws Exception; /* * add a ProtocolManagerFactory to be used. Note if @see Configuration#isResolveProtocols is tur then this factory will * replace any factories with the same protocol * */ void addProtocolManagerFactory(ProtocolManagerFactory factory); /* * add a ProtocolManagerFactory to be used. * */ void removeProtocolManagerFactory(ProtocolManagerFactory factory); ReloadManager getReloadManager(); ActiveMQServer createBackupServer(Configuration configuration); void addScaledDownNode(SimpleString scaledDownNodeId); boolean hasScaledDown(SimpleString scaledDownNodeId); Activation getActivation(); HAPolicy getHAPolicy(); void setHAPolicy(HAPolicy haPolicy); void setMBeanServer(MBeanServer mBeanServer); void addExternalComponent(ActiveMQComponent externalComponent); boolean addClientConnection(String clientId, boolean unique); void removeClientConnection(String clientId); AddressInfo getAddressInfo(SimpleString address); /** * Updates an {@code AddressInfo} on the broker with the specified routing types. * * @param address the name of the {@code AddressInfo} to update * @param routingTypes the routing types to update the {@code AddressInfo} with * @return {@code true} if the {@code AddressInfo} was updated, {@code false} otherwise * @throws Exception */ boolean updateAddressInfo(SimpleString address, Collection<RoutingType> routingTypes) throws Exception; /** * Add the {@code AddressInfo} to the broker * * @param addressInfo the {@code AddressInfo} to add * @return {@code true} if the {@code AddressInfo} was added, {@code false} otherwise * @throws Exception */ boolean addAddressInfo(AddressInfo addressInfo) throws Exception; /** * A convenience method to combine the functionality of {@code addAddressInfo} and {@code updateAddressInfo}. It will * add the {@code AddressInfo} object to the broker if it doesn't exist or update it if it does. * * @param addressInfo the {@code AddressInfo} to add or the info used to update the existing {@code AddressInfo} * @return the resulting {@code AddressInfo} * @throws Exception */ AddressInfo addOrUpdateAddressInfo(AddressInfo addressInfo) throws Exception; /** * Remove an {@code AddressInfo} from the broker. * * @param address the {@code AddressInfo} to remove * @param auth authorization information; {@code null} is valid * @throws Exception */ void removeAddressInfo(SimpleString address, SecurityAuth auth) throws Exception; String getInternalNamingPrefix(); }