📄 simpletcpcluster.java
字号:
}
manager.setName(name);
manager.setCluster(this);
manager.setDistributable(true);
manager.setExpireSessionsOnShutdown(expireSessionsOnShutdown);
manager.setUseDirtyFlag(useDirtyFlag);
managers.put(name,manager);
return manager;
}
// ------------------------------------------------------ Lifecycle Methods
/**
* Add a lifecycle event listener to this component.
*
* @param listener The listener to add
*/
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
/**
* Get the lifecycle listeners associated with this lifecycle. If this
* Lifecycle has no listeners registered, a zero-length array is returned.
*/
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
/**
* Remove a lifecycle event listener from this component.
*
* @param listener The listener to remove
*/
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
/**
* Prepare for the beginning of active use of the public methods of this
* component. This method should be called after <code>configure()</code>,
* and before any of the public methods of the component are utilized.<BR>
* Starts the cluster communication channel, this will connect with the
* other nodes in the cluster, and request the current session state to
* be transferred to this node.
*
* @exception IllegalStateException if this component has already been
* started
* @exception LifecycleException if this component detects a fatal error
* that prevents this component from being used
*/
public void start()
throws LifecycleException {
if (started)
throw new LifecycleException
(sm.getString("cluster.alreadyStarted"));
log.info("Cluster is about to start");
try {
MethodUtils.invokeMethod(getContainer(), "addValve", valve);
clusterReceiver.setIsSenderSynchronized(clusterSender.getIsSenderSynchronized());
clusterReceiver.setCatalinaCluster(this);
clusterReceiver.start();
clusterSender.start();
membershipService.setLocalMemberProperties(clusterReceiver.getHost(),clusterReceiver.getPort());
membershipService.addMembershipListener(this);
membershipService.start();
this.started = true;
} catch ( Exception x ) {
log.error("Unable to start cluster.",x);
throw new LifecycleException(x);
}
}
public void send(SessionMessage msg, Member dest) {
try
{
msg.setAddress(membershipService.getLocalMember());
Member destination = dest;
if ( (destination == null) && (msg.getEventType() == SessionMessage.EVT_GET_ALL_SESSIONS) ) {
if (membershipService.getMembers().length > 0)
destination = membershipService.getMembers()[0];
}
msg.setTimestamp(System.currentTimeMillis());
java.io.ByteArrayOutputStream outs = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(outs);
out.writeObject(msg);
byte[] data = outs.toByteArray();
if(destination != null) {
Member tcpdest = dest;
if ( (tcpdest != null) && (!membershipService.getLocalMember().equals(tcpdest))) {
clusterSender.sendMessage(msg.getSessionID(), data, tcpdest);
}//end if
}
else {
clusterSender.sendMessage(msg.getSessionID(),data);
}
} catch ( Exception x ) {
log.error("Unable to send message through cluster sender.",x);
}
}
public void send(SessionMessage msg) {
send(msg,null);
}
/**
* Gracefully terminate the active use of the public methods of this
* component. This method should be the last one called on a given
* instance of this component.<BR>
* This will disconnect the cluster communication channel and stop
* the listener thread.
*
* @exception IllegalStateException if this component has not been started
* @exception LifecycleException if this component detects a fatal error
* that needs to be reported
*/
public void stop()
throws LifecycleException {
if (!started)
throw new IllegalStateException
(sm.getString("cluster.notStarted"));
membershipService.stop();
membershipService.removeMembershipListener();
try {
clusterSender.stop();
} catch (Exception x ) {
log.error("Unable to stop cluster sender.",x);
}
try {
clusterReceiver.stop();
clusterReceiver.setCatalinaCluster(null);
} catch (Exception x ) {
log.error("Unable to stop cluster receiver.",x);
}
started = false;
}
public void memberAdded(Member member) {
try {
log.info("Replication member added:" + member);
clusterSender.add(member);
} catch ( Exception x ) {
log.error("Unable to connect to replication system.",x);
}
}
public void memberDisappeared(Member member)
{
log.info("Received member disappeared:"+member);
try
{
clusterSender.remove(member);
}
catch ( Exception x )
{
log.error("Unable remove cluster node from replication system.",x);
}
}
public void setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown){
this.expireSessionsOnShutdown = expireSessionsOnShutdown;
}
public void setPrintToScreen(boolean printToScreen) {
this.printToScreen = printToScreen;
}
public void setUseDirtyFlag(boolean useDirtyFlag) {
this.useDirtyFlag = useDirtyFlag;
}
public void messageDataReceived(byte[] data) {
try {
ReplicationStream stream =
new ReplicationStream(new java.io.ByteArrayInputStream(data),
getClass().getClassLoader());
Object myobj = stream.readObject();
if ( myobj != null && myobj instanceof SessionMessage ) {
SessionMessage msg = (SessionMessage)myobj;
String ctxname = msg.getContextName();
//check if the message is a EVT_GET_ALL_SESSIONS,
//if so, wait until we are fully started up
if ( ctxname == null ) {
java.util.Iterator i = managers.keySet().iterator();
while ( i.hasNext() ) {
String key = (String)i.next();
ClusterManager mgr = (ClusterManager) managers.get(key);
if (mgr != null)
mgr.messageDataReceived(msg);
else {
//this happens a lot before the system has started up
log.debug("Context manager doesn't exist:" + key);
}
}//while
} else {
ClusterManager mgr = (ClusterManager) managers.get(ctxname);
if (mgr != null)
mgr.messageDataReceived(msg);
else
log.warn("Context manager doesn't exist:" + ctxname);
}//end if
} else
log.warn("Received invalid message myobj="+myobj);
} catch ( Exception x ) {
log.error("Unable to deserialize session message.",x);
}
}
public void lifecycleEvent(LifecycleEvent lifecycleEvent){
}
// --------------------------------------------------------- Cluster Wide Deployments
/**
* Start an existing web application, attached to the specified context
* path in all the other nodes in the cluster.
* Only starts a web application if it is not running.
*
* @param contextPath The context path of the application to be started
*
* @exception IllegalArgumentException if the specified context path
* is malformed (it must be "" or start with a slash)
* @exception IllegalArgumentException if the specified context path does
* not identify a currently installed web application
* @exception IOException if an input/output error occurs during
* startup
*/
public void startContext(String contextPath) throws IOException {
return;
}
/**
* Install a new web application, whose web application archive is at the
* specified URL, into this container with the specified context path.
* A context path of "" (the empty string) should be used for the root
* application for this container. Otherwise, the context path must
* start with a slash.
* <p>
* If this application is successfully installed, a ContainerEvent of type
* <code>PRE_INSTALL_EVENT</code> will be sent to registered listeners
* before the associated Context is started, and a ContainerEvent of type
* <code>INSTALL_EVENT</code> will be sent to all registered listeners
* after the associated Context is started, with the newly created
* <code>Context</code> as an argument.
*
* @param contextPath The context path to which this application should
* be installed (must be unique)
* @param war A URL of type "jar:" that points to a WAR file, or type
* "file:" that points to an unpacked directory structure containing
* the web application to be installed
*
* @exception IllegalArgumentException if the specified context path
* is malformed (it must be "" or start with a slash)
* @exception IllegalStateException if the specified context path
* is already attached to an existing web application
* @exception IOException if an input/output error was encountered
* during installation
*/
public void installContext(String contextPath, URL war) {
log.debug("\n\n\n\nCluster Install called for context:"+contextPath+"\n\n\n\n");
}
/**
* Stop an existing web application, attached to the specified context
* path. Only stops a web application if it is running.
*
* @param contextPath The context path of the application to be stopped
*
* @exception IllegalArgumentException if the specified context path
* is malformed (it must be "" or start with a slash)
* @exception IllegalArgumentException if the specified context path does
* not identify a currently installed web application
* @exception IOException if an input/output error occurs while stopping
* the web application
*/
public void stop(String contextPath) throws IOException {
return;
}
public Log getLogger() {
return log;
}
// --------------------------------------------- Inner Class
// --------------------------------------------- Performance
private void perfMessageRecvd(long timeSent) {
nrOfMsgsReceived++;
msgSendTime+=(System.currentTimeMillis()-timeSent);
if ( (System.currentTimeMillis() - lastChecked) > 5000 ) {
log.debug("Calc msg send time total="+msgSendTime+"ms num request="+nrOfMsgsReceived+" average per msg="+(msgSendTime/nrOfMsgsReceived)+"ms.");
}
}
public String getManagerClassName() {
return managerClassName;
}
public void setManagerClassName(String managerClassName) {
this.managerClassName = managerClassName;
}
public org.apache.catalina.cluster.ClusterSender getClusterSender() {
return clusterSender;
}
public void setClusterSender(org.apache.catalina.cluster.ClusterSender clusterSender) {
this.clusterSender = clusterSender;
}
public org.apache.catalina.cluster.ClusterReceiver getClusterReceiver() {
return clusterReceiver;
}
public void setClusterReceiver(org.apache.catalina.cluster.ClusterReceiver clusterReceiver) {
this.clusterReceiver = clusterReceiver;
}
public MembershipService getMembershipService() {
return membershipService;
}
public void setMembershipService(MembershipService membershipService) {
this.membershipService = membershipService;
}
public void addValve(Valve valve) {
this.valve = valve;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -