Index: POP3Handler.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/pop3server/POP3Handler.java,v
retrieving revision 1.13
diff -u -r1.13 POP3Handler.java
--- POP3Handler.java	2 Oct 2002 06:12:02 -0000	1.13
+++ POP3Handler.java	13 Oct 2002 04:32:35 -0000
@@ -87,8 +87,24 @@
      */
     private UsersRepository users;
 
-    private TimeScheduler scheduler;    // The scheduler used to handle timeouts for the
-                                        // POP3 interaction
+    /** there should be a single scheduler for all pop3 handlers. 
+     * this helps ensure uniqueness
+     */
+    private static final Object SCHEDULER_LOCK = new int[0];
+
+    /** scheduler counter. int operations are atomic */
+    private static int schedulerUniqueID;
+
+    /** there is one scheduler key for each handler */
+    private String schedulerKey;
+
+    /** 
+     * The scheduler used to handle timeouts for the
+     * POP3 interaction
+     * there is a single scheduler for all pop3 handlers.
+     * this provides a very lightweight mechanism
+     */
+    private static TimeScheduler scheduler; 
 
     /**
      * The mail server's copy of the user's inbox
@@ -142,8 +158,14 @@
         UsersStore usersStore = (UsersStore)componentManager.
             lookup( "org.apache.james.services.UsersStore" );
         users = usersStore.getRepository("LocalUsers");
-        scheduler = (TimeScheduler)componentManager.
-            lookup( "org.apache.avalon.cornerstone.services.scheduler.TimeScheduler" );
+        if ( scheduler == null ) {
+            synchronized ( SCHEDULER_LOCK ) {
+                if ( scheduler == null )
+                    scheduler = (TimeScheduler)componentManager.
+                        lookup( "org.apache.avalon.cornerstone.services.scheduler.TimeScheduler" );
+            }
+        }
+        schedulerKey = (schedulerUniqueID++)+"";
     }
 
     /**
@@ -199,7 +221,7 @@
 
         try {
             final PeriodicTimeTrigger trigger = new PeriodicTimeTrigger( timeout, -1 );
-            scheduler.addTrigger( this.toString(), trigger, this );
+            scheduler.addTrigger( schedulerKey, trigger, this );
             state = AUTHENTICATION_READY;
             user = "unknown";
             StringBuffer responseBuffer =
@@ -212,9 +234,9 @@
                         .append(") ready ");
             out.println(responseBuffer.toString());
             while (parseCommand(in.readLine())) {
-                scheduler.resetTrigger(this.toString());
+                scheduler.resetTrigger(schedulerKey);
             }
-            scheduler.removeTrigger(this.toString());
+            scheduler.removeTrigger(schedulerKey);
             if (getLogger().isInfoEnabled()) {
                 StringBuffer logBuffer =
                     new StringBuffer(128)
@@ -775,7 +797,7 @@
                     OutputStream nouts =
                             new ExtraDotOutputStream(
                             new SchedulerNotifyOutputStream(outs, scheduler,
-                            this.toString(), lengthReset));
+                            schedulerKey, lengthReset));
                     mc.writeMessageTo(nouts);
                     out.println();
                     out.println(".");
@@ -853,7 +875,7 @@
                     OutputStream nouts =
                             new ExtraDotOutputStream(
                             new SchedulerNotifyOutputStream(outs, scheduler,
-                            this.toString(), lengthReset));
+                            schedulerKey, lengthReset));
                     mc.writeContentTo(nouts, lines);
                     out.println(".");
                 } else {
