blob: 35a312b238e0ec4a6d5862f5c1ff78093e1cec7f [file] [log] [blame]
/*
* 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 flex.messaging.cluster;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.w3c.dom.Element;
import flex.messaging.config.ConfigMap;
import flex.messaging.log.LogCategories;
/**
* Base interface for cluster implementations.
*/
public abstract class Cluster {
/**
* Default log category for clustering.
*/
public static final String LOG_CATEGORY = LogCategories.SERVICE_CLUSTER;
/**
* Listeners to be notified when a node is removed from the cluster.
*/
List removeNodeListeners = Collections.synchronizedList(new ArrayList());
/**
* Cluster properties file.
*/
Element clusterPropertiesFile;
/**
* Specifies whether or not this is the default cluster.
*/
boolean def;
/**
* Specifies if this cluster is enabled for URL load balancing.
*/
boolean urlLoadBalancing;
/**
* Because destinations are the constructs which become clustered, clusters
* are identified by a unique name composed in the format
* "serviceType:destinationId".
*
* @param serviceType The name of the service for this destination.
* @param destinationName The original name of the destination.
* @return The unique name for the clustered destination.
*/
static String getClusterDestinationKey(String serviceType, String destinationName) {
StringBuffer sb = new StringBuffer();
sb.append(serviceType);
sb.append(':');
sb.append(destinationName);
return sb.toString();
}
/**
* Add a listener for remove cluster node notification.
*
* @param listener the RemoveNodeListener to add
*/
public void addRemoveNodeListener(RemoveNodeListener listener) {
removeNodeListeners.add(listener);
}
/**
* Send notification to remove node listeners that a node has
* been removed from the cluster.
*
* @param address The node that was removed from the cluster.
*/
protected void sendRemoveNodeListener(Object address) {
synchronized (removeNodeListeners) {
for (int i = 0; i < removeNodeListeners.size(); i++)
((RemoveNodeListener) removeNodeListeners.get(i)).removeClusterNode(address);
}
}
/**
* Initializes the Cluster with id and the map of properties. The default
* implementation is no-op.
*
* @param id The cluster id.
* @param properties The map of properties.
*/
public void initialize(String id, ConfigMap properties) {
// No-op.
}
/**
* Returns the cluster properties file.
*
* @return The cluster properties file.
*/
public Element clusterPropertiesFile() {
return clusterPropertiesFile;
}
/**
* Sets the cluster properties file.
*
* @param value The cluster properties file.
*/
public void setClusterPropertiesFile(Element value) {
this.clusterPropertiesFile = value;
}
/**
* Returns true if this is the default cluster for any destination that does not
* specify a clustered destination.
*
* @return Returns true if this is the default cluster.
*/
public boolean isDefault() {
return def;
}
/**
* When true, this is the default cluster for any destination that does not
* specify a clustered destination.
*
* @param d true if this is the default cluster
*/
public void setDefault(boolean d) {
this.def = d;
}
/**
* When true, this cluster is enabled for URL load balancing.
*
* @return true if this cluster enabled for load balancing.
*/
public boolean getURLLoadBalancing() {
return urlLoadBalancing;
}
/**
* When true, the cluster is enabled for URL load balancing.
*
* @param u the flag to enable the URL load balancing
*/
public void setURLLoadBalancing(boolean u) {
urlLoadBalancing = u;
}
/**
* Shutdown the cluster.
*/
public abstract void destroy();
/**
* Retrieve a List of Maps, where each Map contains channel id keys
* mapped to endpoint URLs for the given service type and destination name.
* There is exactly one endpoint URL for each
* channel id. This List represents all of the known endpoint URLs
* for all of the channels in the Cluster.
*
* @param serviceType the service type
* @param destName the destination name
* @return List of maps of channel ids to endpoint URLs for each node in
* the cluster.
*/
public abstract List getAllEndpoints(String serviceType, String destName);
/**
* Returns a list of all of the nodes of this cluster.
*
* @return List a list of member IP addresses in the cluster
*/
public abstract List getMemberAddresses();
/**
* Returns the local cluster node.
*
* @return Object the Local Address object
*/
public abstract Object getLocalAddress();
/**
* Broadcast a service-related operation, which usually includes a Message as a method parameter. This method
* allows a local service to process a Message and then send the Message to the services on all peer nodes
* so that they may perform the same processing.
*
* @param serviceOperation The operation to broadcast.
* @param params Parameters for the operation.
*/
public abstract void broadcastServiceOperation(String serviceOperation, Object[] params);
/**
* Send a service-related operation in point-to-point fashion to one and only one member of the cluster.
* This is similar to the broadcastServiceOperation except that this invocation is sent to the first
* node among the cluster members that does not have the local node's address.
*
* @param serviceOperation The operation to send.
* @param params Parameters for the operation.
* @param targetAddress the target address of a remote node in the cluster
*/
public abstract void sendPointToPointServiceOperation(String serviceOperation, Object[] params, Object targetAddress);
/**
* Add a local endpoint URL for a local channel. After doing so, broadcast the information to
* peers so that they will be aware of the URL.
*
* @param serviceType the service type of the endpoint
* @param destName the destination name
* @param channelId the Channel ID
* @param endpointUrl the endpoint URL
* @param endpointPort the endpoint port
*/
public abstract void addLocalEndpointForChannel(String serviceType, String destName,
String channelId, String endpointUrl, int endpointPort);
}