Have the PlaceRegistry handle shutting down all places when the server shuts

down. Inject same.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5158 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2008-06-08 10:07:41 +00:00
parent 3e73a1666e
commit 3404d14e7b
2 changed files with 47 additions and 36 deletions
@@ -24,6 +24,7 @@ package com.threerings.crowd.server;
import java.util.Iterator; import java.util.Iterator;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Singleton; import com.google.inject.Singleton;
@@ -43,8 +44,7 @@ import com.threerings.crowd.data.BodyObject;
import static com.threerings.crowd.Log.log; import static com.threerings.crowd.Log.log;
/** /**
* The crowd server extends the presents server by configuring it to use the * Extends the Presents server configuring extensions for Crowd services.
* extensions provided by the crowd layer to support crowd services.
*/ */
@Singleton @Singleton
public class CrowdServer extends PresentsServer public class CrowdServer extends PresentsServer
@@ -72,6 +72,9 @@ public class CrowdServer extends PresentsServer
{ {
super.init(injector); super.init(injector);
// LEGACY: set up our legacy static references
plreg = _plreg;
// configure the client manager to use our bits // configure the client manager to use our bits
clmgr.setClientFactory(new ClientFactory() { clmgr.setClientFactory(new ClientFactory() {
public PresentsClient createClient (AuthRequest areq) { public PresentsClient createClient (AuthRequest areq) {
@@ -85,9 +88,6 @@ public class CrowdServer extends PresentsServer
// create our body locator // create our body locator
_lookup = createBodyLocator(); _lookup = createBodyLocator();
// create our place registry
plreg = createPlaceRegistry(invmgr, omgr);
// initialize the body services // initialize the body services
BodyProvider.init(invmgr); BodyProvider.init(invmgr);
@@ -97,17 +97,7 @@ public class CrowdServer extends PresentsServer
} }
/** /**
* Allow derived instances to create a custom {@link PlaceRegistry}. * Creates the {@link ChatProvider} we'll use to handle chat (or a derivation).
*/
protected PlaceRegistry createPlaceRegistry (
InvocationManager invmgr, RootDObjectManager omgr)
{
return new PlaceRegistry(invmgr, omgr);
}
/**
* Creates the {@link ChatProvider} we'll use to handle chat (or a
* derivation).
*/ */
protected ChatProvider createChatProvider () protected ChatProvider createChatProvider ()
{ {
@@ -115,9 +105,9 @@ public class CrowdServer extends PresentsServer
} }
/** /**
* Allow derived instances to create a custom {@link BodyLocator}. If the * Allow derived instances to create a custom {@link BodyLocator}. If the system opts not to
* system opts not to use {@link BodyObject#username} as a user's visible * use {@link BodyObject#username} as a user's visible name, it will need to provide a custom
* name, it will need to provide a custom {@link BodyLocator}. * {@link BodyLocator}.
*/ */
protected BodyLocator createBodyLocator () protected BodyLocator createBodyLocator ()
{ {
@@ -130,10 +120,9 @@ public class CrowdServer extends PresentsServer
} }
/** /**
* Enumerates the body objects for all active users on the server. * Enumerates the body objects for all active users on the server. This should only be called
* This should only be called from the dobjmgr thread. The caller had * from the dobjmgr thread. The caller had best be certain they know what they're doing, since
* best be certain they know what they're doing, since this should * this should only be necessary for use in rather special circumstances.
* only be necessary for use in rather special circumstances.
*/ */
public static Iterator enumerateBodies () public static Iterator enumerateBodies ()
{ {
@@ -141,9 +130,8 @@ public class CrowdServer extends PresentsServer
} }
/** /**
* Looks up the {@link BodyObject} for the user with the specified visible * Looks up the {@link BodyObject} for the user with the specified visible name, returns null
* name, returns null if they are not online. This should only be called * if they are not online. This should only be called from the dobjmgr thread.
* from the dobjmgr thread.
*/ */
public static BodyObject lookupBody (Name visibleName) public static BodyObject lookupBody (Name visibleName)
{ {
@@ -162,18 +150,19 @@ public class CrowdServer extends PresentsServer
} }
} }
/** An interface that allows server extensions to reconfigure the body /** An interface that allows server extensions to reconfigure the body lookup process. See
* lookup process. See {@link #lookupBody}, {@link #createBodyLocator}. */ * {@link #lookupBody}, {@link #createBodyLocator}. */
protected static interface BodyLocator protected static interface BodyLocator
{ {
/** Returns the body object for the user with the specified visible /** Returns the body object for the user with the specified visible name, or null if they
* name, or null if they are not online. This will only be called from * are not online. This will only be called from the dobjmgr thread. */
* the dobjmgr thread. */
public BodyObject get (Name visibleName); public BodyObject get (Name visibleName);
} }
/** Used to look up {@link BodyObject} instance for online users. See /** Handles the creation and tracking of place managers. */
* {@link #lookupBody}. */ @Inject protected PlaceRegistry _plreg;
/** Used to look up {@link BodyObject} instance for online users. See {@link #lookupBody}. */
protected static BodyLocator _lookup; protected static BodyLocator _lookup;
/** The config key for our list of invocation provider mappings. */ /** The config key for our list of invocation provider mappings. */
@@ -24,11 +24,15 @@ package com.threerings.crowd.server;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import com.samskivert.util.HashIntMap; import com.google.inject.Inject;
import com.samskivert.util.IntMap;
import com.samskivert.util.IntMaps;
import com.threerings.presents.dobj.RootDObjectManager; import com.threerings.presents.dobj.RootDObjectManager;
import com.threerings.presents.server.InvocationException; import com.threerings.presents.server.InvocationException;
import com.threerings.presents.server.InvocationManager; import com.threerings.presents.server.InvocationManager;
import com.threerings.presents.server.ShutdownManager;
import com.threerings.crowd.data.CrowdCodes; import com.threerings.crowd.data.CrowdCodes;
import com.threerings.crowd.data.Place; import com.threerings.crowd.data.Place;
@@ -43,6 +47,7 @@ import static com.threerings.crowd.Log.log;
* manage newly created places. * manage newly created places.
*/ */
public class PlaceRegistry public class PlaceRegistry
implements ShutdownManager.Shutdowner
{ {
/** Used in conjunction with {@link #createPlace}. */ /** Used in conjunction with {@link #createPlace}. */
public static interface PreStartupHook public static interface PreStartupHook
@@ -58,8 +63,11 @@ public class PlaceRegistry
* Creates and initializes the place registry. This is called by the server during its * Creates and initializes the place registry. This is called by the server during its
* initialization phase. * initialization phase.
*/ */
public PlaceRegistry (InvocationManager invmgr, RootDObjectManager omgr) @Inject public PlaceRegistry (ShutdownManager shutmgr, InvocationManager invmgr,
RootDObjectManager omgr)
{ {
shutmgr.registerShutdowner(this);
// create and register our location provider // create and register our location provider
locprov = new LocationProvider(invmgr, omgr, this); locprov = new LocationProvider(invmgr, omgr, this);
invmgr.registerDispatcher(new LocationDispatcher(locprov), CrowdCodes.CROWD_GROUP); invmgr.registerDispatcher(new LocationDispatcher(locprov), CrowdCodes.CROWD_GROUP);
@@ -171,6 +179,20 @@ public class PlaceRegistry
return _pmgrs.values().iterator(); return _pmgrs.values().iterator();
} }
// from interface ShutdownManager.Shutdowner
public void shutdown ()
{
// shut down all active places
for (Iterator<PlaceManager> iter = enumeratePlaceManagers(); iter.hasNext(); ) {
PlaceManager pmgr = iter.next();
try {
pmgr.shutdown();
} catch (Exception e) {
log.warning("Place manager failed shutting down [where=" + pmgr.where() + "].", e);
}
}
}
/** /**
* Creates a place manager using the supplied config, adds the supplied list of delegates, runs * Creates a place manager using the supplied config, adds the supplied list of delegates, runs
* the supplied pre-startup hook and finally returns it. * the supplied pre-startup hook and finally returns it.
@@ -255,5 +277,5 @@ public class PlaceRegistry
protected RootDObjectManager _omgr; protected RootDObjectManager _omgr;
/** A mapping from place object id to place manager. */ /** A mapping from place object id to place manager. */
protected HashIntMap<PlaceManager> _pmgrs = new HashIntMap<PlaceManager>(); protected IntMap<PlaceManager> _pmgrs = IntMaps.newHashIntMap();
} }