/** * 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.broker; import java.net.URI; import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadPoolExecutor; import org.apache.activemq.Service; import org.apache.activemq.broker.region.Destination; import org.apache.activemq.broker.region.MessageReference; import org.apache.activemq.broker.region.Region; import org.apache.activemq.broker.region.Subscription; import org.apache.activemq.broker.region.virtual.VirtualDestination; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.BrokerId; import org.apache.activemq.command.BrokerInfo; import org.apache.activemq.command.ConnectionInfo; import org.apache.activemq.command.DestinationInfo; import org.apache.activemq.command.MessageDispatch; import org.apache.activemq.command.ProducerInfo; import org.apache.activemq.command.SessionInfo; import org.apache.activemq.command.TransactionId; import org.apache.activemq.store.PListStore; import org.apache.activemq.thread.Scheduler; import org.apache.activemq.usage.Usage; /** * The Message Broker which routes messages, maintains subscriptions and * connections, acknowledges messages and handles transactions. */ public interface Broker extends Region, Service { /** * Get a Broker from the Broker Stack that is a particular class * * @param type * @return a Broker instance. */ Broker getAdaptor(Class<?> type); /** * Get the id of the broker */ BrokerId getBrokerId(); /** * Get the name of the broker */ String getBrokerName(); /** * A remote Broker connects */ void addBroker(Connection connection, BrokerInfo info); /** * Remove a BrokerInfo * * @param connection * @param info */ void removeBroker(Connection connection, BrokerInfo info); /** * A client is establishing a connection with the broker. * * @throws Exception TODO */ void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception; /** * A client is disconnecting from the broker. * * @param context the environment the operation is being executed under. * @param info * @param error null if the client requested the disconnect or the error * that caused the client to disconnect. * @throws Exception TODO */ void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception; /** * Adds a session. * * @param context * @param info * @throws Exception TODO */ void addSession(ConnectionContext context, SessionInfo info) throws Exception; /** * Removes a session. * * @param context * @param info * @throws Exception TODO */ void removeSession(ConnectionContext context, SessionInfo info) throws Exception; /** * Adds a producer. * * @param context the environment the operation is being executed under. * @throws Exception TODO */ @Override void addProducer(ConnectionContext context, ProducerInfo info) throws Exception; /** * Removes a producer. * * @param context the environment the operation is being executed under. * @throws Exception TODO */ @Override void removeProducer(ConnectionContext context, ProducerInfo info) throws Exception; /** * @return all clients added to the Broker. * @throws Exception TODO */ Connection[] getClients() throws Exception; /** * @return all destinations added to the Broker. * @throws Exception TODO */ ActiveMQDestination[] getDestinations() throws Exception; /** * return a reference destination map of a region based on the destination type * * @param destination * * @return destination Map */ public Map<ActiveMQDestination, Destination> getDestinationMap(ActiveMQDestination destination); /** * Gets a list of all the prepared xa transactions. * * @param context transaction ids * @return array of TransactionId values * @throws Exception TODO */ TransactionId[] getPreparedTransactions(ConnectionContext context) throws Exception; /** * Starts a transaction. * * @param context * @param xid * @throws Exception TODO */ void beginTransaction(ConnectionContext context, TransactionId xid) throws Exception; /** * Prepares a transaction. Only valid for xa transactions. * * @param context * @param xid * @return id * @throws Exception TODO */ int prepareTransaction(ConnectionContext context, TransactionId xid) throws Exception; /** * Rollsback a transaction. * * @param context * @param xid * @throws Exception TODO */ void rollbackTransaction(ConnectionContext context, TransactionId xid) throws Exception; /** * Commits a transaction. * * @param context * @param xid * @param onePhase * @throws Exception TODO */ void commitTransaction(ConnectionContext context, TransactionId xid, boolean onePhase) throws Exception; /** * Forgets a transaction. * * @param context * @param transactionId * @throws Exception */ void forgetTransaction(ConnectionContext context, TransactionId transactionId) throws Exception; /** * Get the BrokerInfo's of any connected Brokers * * @return array of peer BrokerInfos */ BrokerInfo[] getPeerBrokerInfos(); /** * Notify the Broker that a dispatch is going to happen * * @param messageDispatch */ void preProcessDispatch(MessageDispatch messageDispatch); /** * Notify the Broker that a dispatch has happened * * @param messageDispatch */ void postProcessDispatch(MessageDispatch messageDispatch); /** * @return true if the broker has stopped */ boolean isStopped(); /** * @return a Set of all durable destinations */ Set<ActiveMQDestination> getDurableDestinations(); /** * Add and process a DestinationInfo object * * @param context * @param info * @throws Exception */ void addDestinationInfo(ConnectionContext context, DestinationInfo info) throws Exception; /** * Remove and process a DestinationInfo object * * @param context * @param info * * @throws Exception */ void removeDestinationInfo(ConnectionContext context, DestinationInfo info) throws Exception; /** * @return true if fault tolerant */ boolean isFaultTolerantConfiguration(); /** * @return the connection context used to make administration operations on * startup or via JMX MBeans */ ConnectionContext getAdminConnectionContext(); /** * Sets the default administration connection context used when configuring * the broker on startup or via JMX * * @param adminConnectionContext */ void setAdminConnectionContext(ConnectionContext adminConnectionContext); /** * @return the temp data store */ PListStore getTempDataStore(); /** * @return the URI that can be used to connect to the local Broker */ URI getVmConnectorURI(); /** * called when the brokerService starts */ void brokerServiceStarted(); /** * @return the BrokerService */ BrokerService getBrokerService(); /** * Ensure we get the Broker at the top of the Stack * * @return the broker at the top of the Stack */ Broker getRoot(); /** * Determine if a message has expired -allows default behaviour to be * overriden - as the timestamp set by the producer can be out of sync with * the broker * * @param messageReference * @return true if the message is expired */ boolean isExpired(MessageReference messageReference); /** * A Message has Expired * * @param context * @param messageReference * @param subscription (may be null) */ void messageExpired(ConnectionContext context, MessageReference messageReference, Subscription subscription); /** * A message needs to go the a DLQ * * * @param context * @param messageReference * @param poisonCause reason for dlq submission, may be null * @return true if Message was placed in a DLQ false if discarded. */ boolean sendToDeadLetterQueue(ConnectionContext context, MessageReference messageReference, Subscription subscription, Throwable poisonCause); /** * @return the broker sequence id */ long getBrokerSequenceId(); /** * called when message is consumed * @param context * @param messageReference */ void messageConsumed(ConnectionContext context, MessageReference messageReference); /** * Called when message is delivered to the broker * @param context * @param messageReference */ void messageDelivered(ConnectionContext context, MessageReference messageReference); /** * Called when a message is discarded - e.g. running low on memory * This will happen only if the policy is enabled - e.g. non durable topics * @param context * @param sub * @param messageReference */ void messageDiscarded(ConnectionContext context, Subscription sub, MessageReference messageReference); /** * Called when there is a slow consumer * @param context * @param destination * @param subs */ void slowConsumer(ConnectionContext context,Destination destination, Subscription subs); /** * Called to notify a producer is too fast * @param context * @param producerInfo * @param destination */ void fastProducer(ConnectionContext context,ProducerInfo producerInfo,ActiveMQDestination destination); /** * Called when a Usage reaches a limit * @param context * @param destination * @param usage */ void isFull(ConnectionContext context,Destination destination,Usage<?> usage); void virtualDestinationAdded(ConnectionContext context, VirtualDestination virtualDestination); void virtualDestinationRemoved(ConnectionContext context, VirtualDestination virtualDestination); /** * called when the broker becomes the master in a master/slave * configuration */ void nowMasterBroker(); Scheduler getScheduler(); ThreadPoolExecutor getExecutor(); void networkBridgeStarted(BrokerInfo brokerInfo, boolean createdByDuplex, String remoteIp); void networkBridgeStopped(BrokerInfo brokerInfo); }