Author: asmuts
Date: Mon Aug 29 18:10:34 2005
New Revision: 264665
URL: http://svn.apache.org/viewcvs?rev=264665&view=rev
Log:
Fixed shutdown for lateral.
Added shutdown observer framework.
Changed listener thread to a daemon.
Made executor on listener use a daemon setting thread factory.
1.2.6.7 was compiled under jdk 1.4. The new jgroups jar forces a 1.4
compilation.
I will move jgroups to the 1.4 extension build later so we can continue with
1.3.
Added:
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar (with props)
Modified:
jakarta/jcs/trunk/project.xml
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
jakarta/jcs/trunk/src/scripts/ (props changed)
jakarta/jcs/trunk/xdocs/changes.xml
Modified: jakarta/jcs/trunk/project.xml
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/project.xml?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- jakarta/jcs/trunk/project.xml (original)
+++ jakarta/jcs/trunk/project.xml Mon Aug 29 18:10:34 2005
@@ -5,7 +5,7 @@
<pomVersion>3</pomVersion>
<name>JCS</name>
<id>jcs</id>
- <currentVersion>1.2.6.6</currentVersion>
+ <currentVersion>1.2.6.7</currentVersion>
<organization>
<name>Apache Software Foundation</name>
<url>http://jakarta.apache.org/</url>
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
Mon Aug 29 18:10:34 2005
@@ -1,8 +1,8 @@
package org.apache.jcs.auxiliary.javagroups;
-/*
+/*
* Copyright 2001-2004 The Apache Software Foundation.
- *
+ *
* Licensed 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
@@ -43,7 +43,7 @@
import org.jgroups.blocks.GroupRequest;
import org.jgroups.blocks.MessageDispatcher;
import org.jgroups.blocks.RequestHandler;
-import org.jgroups.util.RspList;
+import org.jgroups.util.RspList;
/**
* Auxiliary cache using javagroups. Expects to be created with a Channel, the
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
Mon Aug 29 18:10:34 2005
@@ -1,6 +1,6 @@
package org.apache.jcs.auxiliary.javagroups;
-
-/*
+
+/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License")
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
Mon Aug 29 18:10:34 2005
@@ -37,6 +37,7 @@
import org.apache.jcs.engine.control.CompositeCacheManager;
import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
+import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
/**
* Listens for connections from other TCP lateral caches and handles them.
@@ -65,15 +66,15 @@
private int port;
- private PooledExecutor pooledExecutor = new PooledExecutor();
+ private PooledExecutor pooledExecutor;
private int putCnt = 0;
private int removeCnt = 0;
/**
- * Use the vmid by default. This can be set for testing.
- * If we ever need to run more than one per vm, then we need a new
technique.
+ * Use the vmid by default. This can be set for testing. If we ever need to
+ * run more than one per vm, then we need a new technique.
*/
private long listenerId = LateralCacheInfo.listenerId;
@@ -132,8 +133,12 @@
this.port = ilca.getTcpListenerPort();
receiver = new ListenerThread();
-
+ receiver.setDaemon( true );
receiver.start();
+
+ pooledExecutor = new PooledExecutor();
+ pooledExecutor.setThreadFactory( new MyThreadFactory() );
+
}
catch ( Exception ex )
{
@@ -288,8 +293,8 @@
/**
* Gets the cacheManager attribute of the LateralCacheTCPListener object.
* <p>
- * Normally this is set by the factory. If it wasn't set the listener
defaults
- * to the expected singleton behavior of the cache amanger.
+ * Normally this is set by the factory. If it wasn't set the listener
+ * defaults to the expected singleton behavior of the cache amanger.
*
* @param name
* @return CompositeCache
@@ -520,5 +525,30 @@
}
}
}
+ }
+
+ /**
+ * Allows us to set the daemon status on the executor threads
+ *
+ * @author aaronsm
+ *
+ */
+ class MyThreadFactory
+ implements ThreadFactory
+ {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ public Thread newThread( Runnable runner )
+ {
+ Thread t = new Thread( runner );
+ t.setDaemon( true );
+ t.setPriority( Thread.MIN_PRIORITY );
+ return t;
+ }
+
}
}
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
Mon Aug 29 18:10:34 2005
@@ -33,6 +33,7 @@
import org.apache.jcs.auxiliary.lateral.LateralCacheNoWait;
import org.apache.jcs.engine.behavior.ICache;
import org.apache.jcs.engine.behavior.ICompositeCacheManager;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
@@ -42,7 +43,7 @@
* Receives UDP Discovery messages.
*/
public class UDPDiscoveryReceiver
- implements Runnable
+ implements Runnable, ShutdownObserver
{
private final static Log log = LogFactory.getLog(
UDPDiscoveryReceiver.class );
@@ -59,7 +60,7 @@
// number of messages received.
private int cnt = 0;
-
+
/**
* Service to get cache names and hande request broadcasts
*/
@@ -71,6 +72,8 @@
private ICompositeCacheManager cacheMgr;
+ private boolean shutdown = false;
+
/**
* Constructor for the LateralUDPReceiver object.
* <p>
@@ -170,7 +173,7 @@
try
{
- while ( true )
+ while ( !shutdown )
{
Object obj = waitForMessage();
@@ -215,7 +218,18 @@
catch ( Exception e )
{
log.error( "Unexpected exception in UDP receiver.", e );
+ try
+ {
+ Thread.sleep( 100 );
+ // TODO consider some failure count so we don't do this
+ // forever.
+ }
+ catch ( Exception e2 )
+ {
+ log.error( "Problem sleeping", e2 );
+ }
}
+ return;
}
/**
@@ -378,6 +392,23 @@
return t;
}
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jcs.engine.behavior.ShutdownObserver#shutdown()
+ */
+ public void shutdown()
+ {
+ try
+ {
+ shutdown = true;
+ m_socket.close();
+ pooledExecutor.shutdownNow();
+ }
+ catch ( Exception e )
+ {
+ log.error( "Problem closing socket" );
+ }
}
}
// end class
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
Mon Aug 29 18:10:34 2005
@@ -14,6 +14,8 @@
import org.apache.jcs.auxiliary.lateral.LateralCacheNoWait;
import org.apache.jcs.auxiliary.lateral.LateralCacheNoWaitFacade;
import org.apache.jcs.engine.behavior.ICompositeCacheManager;
+import org.apache.jcs.engine.behavior.ShutdownObservable;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
import EDU.oswego.cs.dl.util.concurrent.ClockDaemon;
import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
@@ -31,24 +33,25 @@
* @author Aaron Smuts
*
*/
-public class UDPDiscoveryService
+public class UDPDiscoveryService implements ShutdownObserver
{
private final static Log log = LogFactory.getLog(
UDPDiscoveryService.class );
- /**
- * The background broadcaster.
- */
- private static ClockDaemon daemon;
+ //The background broadcaster.
+ private static ClockDaemon senderDaemon;
+ // thread that listens for messages
private Thread udpReceiverThread;
+ // the runanble that the receiver thread runs
private UDPDiscoveryReceiver receiver;
private Map facades = new HashMap();
private LateralCacheAttributes lca = null;
+ // the runanble that sends messages via the clock daemon
private UDPDiscoverySenderThread sender = null;
private String hostAddress = "unknown";
@@ -62,8 +65,8 @@
*/
public UDPDiscoveryService( LateralCacheAttributes lca,
ICompositeCacheManager cacheMgr )
{
- //LateralCacheNoWaitFacade facade,
- //this.facade = facade;
+ // register for shutdown notification
+ ((ShutdownObservable)cacheMgr).registerShutdownObserver( this );
this.setLca( lca );
@@ -84,8 +87,6 @@
try
{
// todo need some kind of recovery here.
- //receiver = new UDPDiscoveryReceiver( facade,
- // lca.getUdpDiscoveryAddr(), lca.getUdpDiscoveryPort() );
receiver = new UDPDiscoveryReceiver( this,
lca.getUdpDiscoveryAddr(), lca.getUdpDiscoveryPort(), cacheMgr );
udpReceiverThread = new Thread(receiver);
udpReceiverThread.setDaemon(true);
@@ -99,17 +100,17 @@
// todo only do the passive if receive is inenabled, perhaps set the
// myhost to null or something on the request
- if ( daemon == null )
+ if ( senderDaemon == null )
{
- daemon = new ClockDaemon();
- daemon.setThreadFactory( new MyThreadFactory() );
+ senderDaemon = new ClockDaemon();
+ senderDaemon.setThreadFactory( new MyThreadFactory() );
}
// create a sender thread
sender = new UDPDiscoverySenderThread( lca.getUdpDiscoveryAddr(), lca
.getUdpDiscoveryPort(), hostAddress,
lca.getTcpListenerPort(), this.getCacheNames() );
- daemon.executePeriodically( 30 * 1000, sender, false );
+ senderDaemon.executePeriodically( 30 * 1000, sender, false );
}
/**
@@ -280,5 +281,43 @@
return t;
}
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jcs.engine.behavior.ShutdownObserver#shutdown()
+ */
+ public void shutdown()
+ {
+ if ( log.isInfoEnabled() )
+ {
+ log.info( "Shutting down UDP discovery service receiver." );
+ }
+
+ try
+ {
+ // no good way to do this right now.
+ receiver.shutdown();
+ udpReceiverThread.interrupt();
+ }
+ catch ( Exception e )
+ {
+ log.error( "Problem interrupting UDP receiver thread." );
+ }
+
+ if ( log.isInfoEnabled() )
+ {
+ log.info( "Shutting down UDP discovery service sender." );
+ }
+
+ try
+ {
+ // interrupt all the threads.
+ senderDaemon.shutDown();
+ }
+ catch ( Exception e )
+ {
+ log.error( "Problem shutting down UDP sender." );
+ }
+
}
}
Added:
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java?rev=264665&view=auto
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
(added)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
Mon Aug 29 18:10:34 2005
@@ -0,0 +1,53 @@
+package org.apache.jcs.engine.behavior;
+
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * ShutdownObservers can observer ShutdownObservable objects.
+ * The CacheManager is the primary observable that this is intended for.
+ * <p>
+ * Most shutdown operations will occur outside this framework for now. The
initial
+ * goal is to allow background threads that are not reachable through any
reference
+ * that the cahe manager maintains to be killed on shutdown.
+ * <p>
+ * Perhaps the composite cache itself should be the observable object.
+ * It doesn't make much of a difference. There are some problems with
+ * region by region shutdown. Some auxiliaries are glocal. They will
+ * need to track when every region has shutdown before doing things like
+ * closing the socket with a lateral.
+ *
+ * @author Aaron Smuts
+ *
+ */
+public interface ShutdownObservable
+{
+
+ /**
+ * Registers an observer with the observable object.
+ * @param observer
+ */
+ abstract void registerShutdownObserver( ShutdownObserver observer );
+
+ /**
+ * Deregisters the observer with the observable.
+ *
+ * @param observer
+ */
+ abstract void deregisterShutdownObserver( ShutdownObserver observer );
+
+}
Added:
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java?rev=264665&view=auto
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
(added)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
Mon Aug 29 18:10:34 2005
@@ -0,0 +1,40 @@
+package org.apache.jcs.engine.behavior;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * This interface is required of all shutdown observers. These observers
+ * can observer ShutdownObservable objects. The CacheManager is the primary
+ * observable that this is intended for.
+ * <p>
+ * Most shutdown operations will occur outside this framework for now. The
initial
+ * goal is to allow background threads that are not reachable through any
reference
+ * that the cahe manager maintains to be killed on shutdown.
+ *
+ * @author Aaron Smuts
+ *
+ */
+public interface ShutdownObserver
+{
+
+ /**
+ * Tells the observer that the observable has received a shutdown command.
+ *
+ */
+ abstract void shutdown();
+
+}
Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
Mon Aug 29 18:10:34 2005
@@ -21,6 +21,7 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
@@ -38,13 +39,18 @@
import org.apache.jcs.engine.behavior.ICompositeCacheAttributes;
import org.apache.jcs.engine.behavior.ICompositeCacheManager;
import org.apache.jcs.engine.behavior.IElementAttributes;
+import org.apache.jcs.engine.behavior.ShutdownObservable;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
import org.apache.jcs.engine.stats.CacheStats;
import org.apache.jcs.engine.stats.behavior.ICacheStats;
import org.apache.jcs.utils.threadpool.ThreadPoolManager;
-/** Manages a composite cache. */
+/**
+ * Manages a composite cache. This provides access to caches and is the primary
+ * way to shutdown the caching system as a whole.
+ */
public class CompositeCacheManager
- implements IRemoteCacheConstants, Serializable, ICompositeCacheManager
+ implements IRemoteCacheConstants, Serializable, ICompositeCacheManager,
ShutdownObservable
{
private final static Log log = LogFactory.getLog(
CompositeCacheManager.class );
@@ -82,11 +88,14 @@
private static final boolean DEFAULT_USE_SYSTEM_PROPERTIES = true;
+ private Set shutdownObservers = new HashSet();
+
/**
* Gets the CacheHub instance. For backward compatibility, if this creates
* the instance it will attempt to configure it with the default
* configuration. If you want to configure from your own source, use
* [EMAIL PROTECTED] #getUnconfiguredInstance}and then call [EMAIL
PROTECTED] #configure}
+ *
* @return
*/
public static synchronized CompositeCacheManager getInstance()
@@ -124,6 +133,7 @@
/**
* Get a CacheHub instance which is not configured. If an instance already
* exists, it will be returned.
+ *
* @return
*/
public static synchronized CompositeCacheManager getUnconfiguredInstance()
@@ -401,6 +411,21 @@
*/
public void shutDown()
{
+ // notify any observers
+ synchronized ( shutdownObservers )
+ {
+ // We don't need to worry about lcoking the set.
+ // since this is a shutdown command, nor do we need
+ // to queue these up.
+ Iterator it = shutdownObservers.iterator();
+ while ( it.hasNext() )
+ {
+ ShutdownObserver observer = (ShutdownObserver)it.next();
+ observer.shutdown();
+ }
+ }
+
+ // do the traditional shutdown of the regions.
String[] names = getCacheNames();
int len = names.length;
for ( int i = 0; i < len; i++ )
@@ -534,6 +559,39 @@
}
ICacheStats[] stats = (ICacheStats[]) cacheStats.toArray( new
CacheStats[0] );
return stats;
+ }
+
+ /**
+ * Perhaps the composite cache itself should be the observable object. It
+ * doesn't make much of a difference. There are some problems with region
by
+ * region shutdown. Some auxiliaries are glocal. They will need to track
+ * when every region has shutdown before doing things like closing the
+ * socket with a lateral.
+ *
+ * @param observer
+ */
+ public void registerShutdownObserver( ShutdownObserver observer )
+ {
+ // synchronized to take care of iteration safety
+ // during shutdown.
+ synchronized ( shutdownObservers )
+ {
+ // the set will take care of duplication protection
+ shutdownObservers.add( observer );
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.apache.jcs.engine.behavior.ShutdownObservable#deregisterShutdownObserver(org.apache.jcs.engine.behavior.ShutdownObserver)
+ */
+ public void deregisterShutdownObserver( ShutdownObserver observer )
+ {
+ synchronized ( shutdownObservers )
+ {
+ shutdownObservers.remove( observer );
+ }
}
}
Propchange: jakarta/jcs/trunk/src/scripts/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Aug 29 18:10:34 2005
@@ -0,0 +1,3 @@
+
[EMAIL PROTECTED]@
+target
Added: jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar?rev=264665&view=auto
==============================================================================
Binary file - no diff available.
Propchange: jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: jakarta/jcs/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/xdocs/changes.xml?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- jakarta/jcs/trunk/xdocs/changes.xml (original)
+++ jakarta/jcs/trunk/xdocs/changes.xml Mon Aug 29 18:10:34 2005
@@ -6,6 +6,11 @@
<body>
<release version="1.2.6.7" date="in CVS">
+ <action dev="asmuts" type="fix" due-to="Adam Siefker">
+ Fixed shutdown for lateral. Added shutdown observer framework.
Changed listener thread
+ to a daemon. Made executor on listener use a daemon setting
+ thread factory.
+ </action>
<action dev="asmuts" type="fix" due-to="">
Fixed abstract inner class references for Jikes.
</action>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]