You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by da...@apache.org on 2002/03/01 16:58:40 UTC
cvs commit: jakarta-james/src/java/org/apache/james/transport/mailets RemoteDelivery.java
danny 02/03/01 07:58:40
Modified: src/java/org/apache/james/mailrepository
AvalonMailRepository.java
AvalonSpoolRepository.java
src/java/org/apache/james/remotemanager RemoteManager.java
src/java/org/apache/james/smtpserver SMTPServer.java
src/java/org/apache/james/transport JamesSpoolManager.java
LinearProcessor.java
src/java/org/apache/james/transport/mailets
RemoteDelivery.java
Log:
patches suplied by Steve Short [Steve.Short@PostX.com] toAdd mailet shutdown. Prevent tight loop in RemoteDelivery on unexpected exceptions, removes message from outgoing queue. Prevent ConcurrentModificationException in AvalonMailRepository by cloning key sey before returning iterator. Added the dispose method to SMTPServer.java and RemoteManager.java for NT socket release issue. Changed JamesSpoolManager to throw instead of system.exit for bad init mailet. Thanks Steve :-)
Revision Changes Path
1.13 +5 -1 jakarta-james/src/java/org/apache/james/mailrepository/AvalonMailRepository.java
Index: AvalonMailRepository.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/mailrepository/AvalonMailRepository.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- AvalonMailRepository.java 18 Jan 2002 02:48:36 -0000 1.12
+++ AvalonMailRepository.java 1 Mar 2002 15:58:39 -0000 1.13
@@ -242,6 +242,10 @@
}
public Iterator list() {
- return keys.iterator();
+// Fix ConcurrentModificationException by cloning the keyset before getting an iterator
+// return keys.iterator();
+ final HashSet clone = new HashSet();
+ clone.addAll( keys );
+ return clone.iterator();
}
}
1.5 +4 -1 jakarta-james/src/java/org/apache/james/mailrepository/AvalonSpoolRepository.java
Index: AvalonSpoolRepository.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/mailrepository/AvalonSpoolRepository.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AvalonSpoolRepository.java 18 Jan 2002 02:48:36 -0000 1.4
+++ AvalonSpoolRepository.java 1 Mar 2002 15:58:39 -0000 1.5
@@ -56,6 +56,7 @@
wait();
} catch (InterruptedException ignored) {
} catch (ConcurrentModificationException ignoredAlso) {
+ // Should never get here now that list methods clones keyset for iterator
}
}
}
@@ -107,7 +108,9 @@
wait(youngest - System.currentTimeMillis());
}
} catch (InterruptedException ignored) {
+ } catch (ConcurrentModificationException ignoredAlso) {
+ // Should never get here now that list methods clones keyset for iterator
}
- }
+}
}
}
1.4 +12 -1 jakarta-james/src/java/org/apache/james/remotemanager/RemoteManager.java
Index: RemoteManager.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/remotemanager/RemoteManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- RemoteManager.java 27 Feb 2002 05:06:35 -0000 1.3
+++ RemoteManager.java 1 Mar 2002 15:58:39 -0000 1.4
@@ -67,5 +67,16 @@
super.initialize();
getLogger().info("RemoteManager ...init end");
}
-}
+ public void dispose()
+ {
+ getLogger().info( "RemoteManager dispose..." );
+ getLogger().info( "RemoteManager dispose..." + m_connectionName);
+ super.dispose();
+
+ // This is needed to make sure that sockets are released promptly on Windows 2000
+ System.gc();
+
+ getLogger().info( "RemoteManager ...dispose end" );
+ }
+}
1.4 +12 -0 jakarta-james/src/java/org/apache/james/smtpserver/SMTPServer.java
Index: SMTPServer.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/smtpserver/SMTPServer.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SMTPServer.java 27 Feb 2002 05:06:47 -0000 1.3
+++ SMTPServer.java 1 Mar 2002 15:58:40 -0000 1.4
@@ -63,5 +63,17 @@
getLogger().info("SMTPServer ...init end");
System.out.println("Started SMTP Server "+m_connectionName);
}
+
+ public void dispose()
+ {
+ getLogger().info( "SMTPServer dispose..." );
+ getLogger().info( "SMTPServer dispose..." + m_connectionName);
+ super.dispose();
+
+ // This is needed to make sure sockets are promptly closed on Windows 2000
+ System.gc();
+
+ getLogger().info( "SMTPServer ...dispose end" );
+ }
}
1.9 +21 -9 jakarta-james/src/java/org/apache/james/transport/JamesSpoolManager.java
Index: JamesSpoolManager.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/transport/JamesSpoolManager.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JamesSpoolManager.java 18 Jan 2002 02:48:37 -0000 1.8
+++ JamesSpoolManager.java 1 Mar 2002 15:58:40 -0000 1.9
@@ -30,13 +30,14 @@
import javax.mail.MessagingException;
import java.util.HashMap;
+import java.util.Iterator;
/**
* @author Serge Knystautas <se...@lokitech.com>
* @author Federico Barbieri <sc...@systemy.it>
*
- * This is $Revision: 1.8 $
- * Committed on $Date: 2002/01/18 02:48:37 $ by: $Author: darrell $
+ * This is $Revision: 1.9 $
+ * Committed on $Date: 2002/03/01 15:58:40 $ by: $Author: danny $
*/
public class JamesSpoolManager
extends AbstractLogEnabled
@@ -142,9 +143,9 @@
+ matcherName + ": " + ex.toString(), ex );
System.err.println("Unable to init mailet " + matcherName);
System.err.println("Check spool manager logs for more details.");
- //ex.printStackTrace();
- System.exit(1);
- //throw ex;
+ ex.printStackTrace();
+ //System.exit(1);
+ throw ex;
}
try {
mailet = mailetLoader.getMailet(mailetClassName,
@@ -157,9 +158,9 @@
+ mailetClassName + ": " + ex.getMessage());
System.err.println("Unable to init mailet " + mailetClassName);
System.err.println("Check spool manager logs for more details.");
- //ex.printStackTrace();
- System.exit(1);
- //throw ex;
+ ex.printStackTrace();
+ //System.exit(1);
+ throw ex;
}
//Add this pair to the proces
processor.add(matcher, mailet);
@@ -263,5 +264,16 @@
}
}
- public void dispose() {}
+ // Shutdown processors
+ public void dispose() {
+ getLogger().info("JamesSpoolManager dispose...");
+ Iterator it = processors.keySet().iterator();
+ while (it.hasNext()) {
+ String processorName = (String)it.next();
+ getLogger().debug("Processor " + processorName);
+ LinearProcessor processor = (LinearProcessor)processors.get(processorName);
+ processor.dispose();
+ processors.remove(processor);
+ }
+ }
}
1.6 +12 -1 jakarta-james/src/java/org/apache/james/transport/LinearProcessor.java
Index: LinearProcessor.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/transport/LinearProcessor.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- LinearProcessor.java 18 Jan 2002 02:48:37 -0000 1.5
+++ LinearProcessor.java 1 Mar 2002 15:58:40 -0000 1.6
@@ -8,6 +8,7 @@
package org.apache.james.transport;
import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.Logger;
import org.apache.james.core.MailImpl;
@@ -21,6 +22,7 @@
import java.util.List;
import java.util.Random;
import java.util.Vector;
+import java.util.Iterator;
/**
* @author Serge Knystautas <se...@lokitech.com>
@@ -40,7 +42,7 @@
*/
public class LinearProcessor
extends AbstractLogEnabled
- implements Initializable {
+ implements Initializable, Disposable {
private List mailets;
private List matchers;
@@ -63,6 +65,15 @@
random = new Random();
}
+ // Shutdown mailets
+ public void dispose() {
+ Iterator it = mailets.iterator();
+ while (it.hasNext()) {
+ Mailet mailet = (Mailet)it.next();
+ getLogger().debug("Shutdown mailet " + mailet.getMailetInfo());
+ mailet.destroy();
+ }
+ }
public void add(Matcher matcher, Mailet mailet) {
matchers.add(matcher);
1.14 +24 -14 jakarta-james/src/java/org/apache/james/transport/mailets/RemoteDelivery.java
Index: RemoteDelivery.java
===================================================================
RCS file: /home/cvs/jakarta-james/src/java/org/apache/james/transport/mailets/RemoteDelivery.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- RemoteDelivery.java 18 Jan 2002 02:48:38 -0000 1.13
+++ RemoteDelivery.java 1 Mar 2002 15:58:40 -0000 1.14
@@ -45,8 +45,8 @@
* @author Serge Knystautas <se...@lokitech.com>
* @author Federico Barbieri <sc...@pop.systemy.it>
*
- * This is $Revision: 1.13 $
- * Committed on $Date: 2002/01/18 02:48:38 $ by: $Author: darrell $
+ * This is $Revision: 1.14 $
+ * Committed on $Date: 2002/03/01 15:58:40 $ by: $Author: danny $
*/
public class RemoteDelivery extends GenericMailet implements Runnable {
@@ -306,6 +306,8 @@
getMailetContext().bounce(mail, sout.toString());
} catch (MessagingException me) {
log("encountered unexpected messaging exception while bouncing message: " + me.getMessage());
+ } catch (Exception e) {
+ log("encountered unexpected exception while bouncing message: " + e.getMessage());
}
}
@@ -359,7 +361,8 @@
mail.setState(Mail.GHOST);
}
- public void destroy() {
+ // Need to synchronize to get object monitor for notifyAll()
+ public synchronized void destroy() {
//Wake up all threads from waiting for an accept
notifyAll();
for (Iterator i = deliveryThreads.iterator(); i.hasNext(); ) {
@@ -390,17 +393,24 @@
while (!Thread.currentThread().interrupted()) {
try {
String key = outgoing.accept(delayTime);
- log(Thread.currentThread().getName() + " will process mail " + key);
- MailImpl mail = outgoing.retrieve(key);
- if (deliver(mail, session)) {
- //Message was successfully delivered/fully failed... delete it
- outgoing.remove(key);
- } else {
- //Something happened that will delay delivery. Store any updates
- outgoing.store(mail);
- }
- //Clear the object handle to make sure it recycles this object.
- mail = null;
+ try {
+ log(Thread.currentThread().getName() + " will process mail " + key);
+ MailImpl mail = outgoing.retrieve(key);
+ if (deliver(mail, session)) {
+ //Message was successfully delivered/fully failed... delete it
+ outgoing.remove(key);
+ } else {
+ //Something happened that will delay delivery. Store any updates
+ outgoing.store(mail);
+ }
+ //Clear the object handle to make sure it recycles this object.
+ mail = null;
+ } catch (Exception e) {
+ // Prevent unexpected exceptions from causing looping by removing
+ // message from outgoing.
+ outgoing.remove(key);
+ throw e;
+ }
} catch (Exception e) {
log("Exception caught in RemoteDelivery.run(): " + e);
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>