You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ha...@apache.org on 2002/01/02 00:12:47 UTC
cvs commit: jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common ProblemReply.java NotPublishedReply.java RequestFailedReply.java TryLaterReply.java
hammant 02/01/01 15:12:47
Modified: armi/src/java/org/apache/commons/armi/client
ArmiFactory.java
armi/src/java/org/apache/commons/armi/client/impl
AbstractArmiHostContext.java
ObjectStreamInvocationHandler.java
armi/src/java/org/apache/commons/armi/client/impl/direct
DirectArmiHostContext.java
DirectInvocationHandler.java
armi/src/java/org/apache/commons/armi/client/impl/piped
PipedInvocationHandler.java
armi/src/java/org/apache/commons/armi/client/impl/rmi
RmiInvocationHandler.java
armi/src/java/org/apache/commons/armi/client/impl/socket
PlainSocketInvocationHandler.java
armi/src/java/org/apache/commons/armi/common
NotPublishedReply.java RequestFailedReply.java
TryLaterReply.java
Added: armi/src/java/org/apache/commons/armi/client
ArmiConnectionListener.java
armi/src/java/org/apache/commons/armi/client/impl
ArmiClientInvocationHandler.java
DefaultArmiConnectionListener.java
armi/src/java/org/apache/commons/armi/common
ProblemReply.java
Log:
Recovering connection and Event API.
Revision Changes Path
1.4 +5 -4 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiFactory.java
Index: ArmiFactory.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiFactory.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ArmiFactory.java 31 Dec 2001 12:07:31 -0000 1.3
+++ ArmiFactory.java 1 Jan 2002 23:12:46 -0000 1.4
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiFactory.java,v 1.3 2001/12/31 12:07:31 hammant Exp $
- * $Revision: 1.3 $
- * $Date: 2001/12/31 12:07:31 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiFactory.java,v 1.4 2002/01/01 23:12:46 hammant Exp $
+ * $Revision: 1.4 $
+ * $Date: 2002/01/01 23:12:46 $
*
* ====================================================================
*
@@ -72,7 +72,7 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.3 $
+ * @version $Revision: 1.4 $
*/
public abstract class ArmiFactory {
@@ -91,4 +91,5 @@
*/
public abstract Object lookup(ArmiHostContext hostContext, String publishedServiceName)
throws ArmiConnectionException;
+
}
1.1 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiConnectionListener.java
Index: ArmiConnectionListener.java
===================================================================
/*
* $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/ArmiConnectionListener.java,v 1.1 2002/01/01 23:12:46 hammant Exp $
* $Revision: 1.1 $
* $Date: 2002/01/01 23:12:46 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.armi.client;
import org.apache.commons.armi.common.ArmiInvocationHandler;
import org.apache.commons.armi.common.ArmiRequest;
/**
* Interface ArmiConnectionListener
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
* @version * $Revision: 1.1 $
*/
public interface ArmiConnectionListener {
/**
* Method methodCalled
*
*
* @return
*
*/
void armiMethodCalled(String methodSignature, long duration);
/**
* Method armiServiceSuspended
*
*
* @return
*
*/
void armiServiceSuspended(ArmiRequest armiRequest, int attempt, int suggestedWaitMillis);
/**
* Method armiServiceAbend
*
*
* @return
*
*/
void armiServiceAbend(int attempt);
}
1.2 +22 -8 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/AbstractArmiHostContext.java
Index: AbstractArmiHostContext.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/AbstractArmiHostContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractArmiHostContext.java 28 Dec 2001 18:08:37 -0000 1.1
+++ AbstractArmiHostContext.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/AbstractArmiHostContext.java,v 1.1 2001/12/28 18:08:37 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/28 18:08:37 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/AbstractArmiHostContext.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -65,6 +65,7 @@
import org.apache.commons.armi.common.ArmiInvocationHandler;
import org.apache.commons.armi.client.ArmiHostContext;
+import org.apache.commons.armi.client.ArmiConnectionListener;
/**
@@ -72,11 +73,11 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class AbstractArmiHostContext implements ArmiHostContext {
- private final ArmiInvocationHandler mArmiInvocationHandler;
+ private final ArmiClientInvocationHandler mArmiClientInvocationHandler;
/**
* Constructor AbstractArmiHostContext
@@ -85,8 +86,8 @@
* @param armiInvocationHandler
*
*/
- public AbstractArmiHostContext(ArmiInvocationHandler armiInvocationHandler) {
- this.mArmiInvocationHandler = armiInvocationHandler;
+ public AbstractArmiHostContext(ArmiClientInvocationHandler armiClientInvocationHandler) {
+ this.mArmiClientInvocationHandler = armiClientInvocationHandler;
}
/**
@@ -97,6 +98,19 @@
*
*/
public ArmiInvocationHandler getInvocationHandler() {
- return mArmiInvocationHandler;
+ return mArmiClientInvocationHandler;
}
+
+ /**
+ * Method setArmiConnectionListener
+ *
+ *
+ * @param armiInvocationHandler
+ * @return
+ *
+ */
+ public void setArmiConnectionListener(ArmiConnectionListener armiConnectionListener) {
+ mArmiClientInvocationHandler.setArmiConnectionListener(armiConnectionListener);
+ }
+
}
1.5 +38 -19 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ObjectStreamInvocationHandler.java
Index: ObjectStreamInvocationHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ObjectStreamInvocationHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ObjectStreamInvocationHandler.java 1 Jan 2002 17:53:06 -0000 1.4
+++ ObjectStreamInvocationHandler.java 1 Jan 2002 23:12:47 -0000 1.5
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ObjectStreamInvocationHandler.java,v 1.4 2002/01/01 17:53:06 hammant Exp $
- * $Revision: 1.4 $
- * $Date: 2002/01/01 17:53:06 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ObjectStreamInvocationHandler.java,v 1.5 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.5 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -72,10 +72,12 @@
import org.apache.commons.armi.common.NotPublishedReply;
import org.apache.commons.armi.common.NotPublishedException;
import org.apache.commons.armi.common.PublishedNameRequest;
+import org.apache.commons.armi.common.ProblemReply;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
+import java.net.SocketException;
/**
@@ -83,9 +85,9 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
-public class ObjectStreamInvocationHandler implements ArmiInvocationHandler {
+public abstract class ObjectStreamInvocationHandler extends ArmiClientInvocationHandler {
ObjectInputStream mOIS;
ObjectOutputStream mOOS;
@@ -129,26 +131,43 @@
while (true) {
boolean again = true;
ArmiReply reply = null;
+ int tries = 0;
+ long start = System.currentTimeMillis();
while (again) {
+ tries++;
again = false;
- mOOS.writeObject(request);
- mOOS.flush();
- reply = (ArmiReply) mOIS.readObject();
- if (reply instanceof TryLaterReply) {
- int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
- try {
- Thread.sleep(millis);
- } catch (InterruptedException ie) {}
- again = true;
- } else if (reply instanceof NotPublishedReply) {
- throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ try {
+ mOOS.writeObject(request);
+ mOOS.flush();
+ reply = (ArmiReply) mOIS.readObject();
+ if (!(reply instanceof ProblemReply)) {
+ // speed?
+ if (reply instanceof TryLaterReply) {
+ int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
+ mArmiConnectionListener.armiServiceSuspended(request,tries,millis);
+ again = true;
+ } else if (reply instanceof NotPublishedReply) {
+ throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ }
+ }
+ } catch (IOException ioe) {
+ if (ioe instanceof SocketException) {
+ int retryConnectTries = 0;
+ while (!tryReconnect()) {
+ mArmiConnectionListener.armiServiceAbend(retryConnectTries);
+ retryConnectTries++;
+ }
+ } else {
+ throw new ArmiInvocationException("IO Exception during invocation to server"
+ + ioe.getMessage());
+ }
}
}
+ if (request instanceof MethodRequest) {
+ mArmiConnectionListener.armiMethodCalled(((MethodRequest) request).getMethodSignature(), System.currentTimeMillis() - start);
+ }
return reply;
}
- } catch (IOException e) {
- throw new ArmiInvocationException("IO Exception during invocation to server"
- + e.getMessage());
} catch (ClassNotFoundException e) {
throw new ArmiInvocationException("Class definition missing on Deserialization"
+ e.getMessage());
1.1 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ArmiClientInvocationHandler.java
Index: ArmiClientInvocationHandler.java
===================================================================
/*
* $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/ArmiClientInvocationHandler.java,v 1.1 2002/01/01 23:12:47 hammant Exp $
* $Revision: 1.1 $
* $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.armi.client.impl;
import org.apache.commons.armi.common.ArmiInvocationHandler;
import org.apache.commons.armi.client.ArmiConnectionListener;
/**
* Class ArmiClientInvocationHandler
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
* @version $Revision: 1.1 $
*/
public abstract class ArmiClientInvocationHandler implements ArmiInvocationHandler {
protected ArmiConnectionListener mArmiConnectionListener =
new DefaultArmiConnectionListener();
/**
* Method setArmiConnectionListener
*
*
* @param armiConnectionListener
*
*/
public void setArmiConnectionListener(ArmiConnectionListener armiConnectionListener) {
mArmiConnectionListener = armiConnectionListener;
}
protected abstract boolean tryReconnect();
}
1.1 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/DefaultArmiConnectionListener.java
Index: DefaultArmiConnectionListener.java
===================================================================
/*
* $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/DefaultArmiConnectionListener.java,v 1.1 2002/01/01 23:12:47 hammant Exp $
* $Revision: 1.1 $
* $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.armi.client.impl;
import org.apache.commons.armi.common.ArmiInvocationHandler;
import org.apache.commons.armi.common.ArmiInvocationException;
import org.apache.commons.armi.common.ArmiRequest;
import org.apache.commons.armi.client.ArmiConnectionListener;
/**
* Interface ArmiConnectionListener
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
* @version * $Revision: 1.1 $
*/
public class DefaultArmiConnectionListener implements ArmiConnectionListener {
/**
* Method methodCalled
*
*
* @return
*
*/
public void armiMethodCalled(final String methodSignature, final long duration) {
// do mothing in default impl, could do logging.
}
/**
* Method armiServiceSuspended
*
*
* @return
*
*/
public void armiServiceSuspended(final ArmiRequest armiRequest, final int attempt, final int suggestedWaitMillis) {
// Lets say that ten retries is too many.
if (attempt == 10) {
throw new ArmiInvocationException("Too many retries on suspended service");
}
System.out.println("ARMI service suspended, Trying to reconnect (attempt "+attempt+", waiting for "+suggestedWaitMillis/1000+" seconds)");
// We are quite happy with the recommended wait time.
try {
Thread.sleep(suggestedWaitMillis);
} catch (InterruptedException ie) {
// TODO ?
}
}
/**
* Method armiServiceAbend
*
*
* @return
*
*/
public void armiServiceAbend(int attempt) {
// Lets say that ten retries is too many.
if (attempt == 3) {
throw new ArmiInvocationException("Too many retries on abended service");
}
System.out.println("ARMI service abnormally ended, Trying to reconnect (attempt "+attempt+")");
// Increasing wait time.
try {
Thread.sleep((2^attempt) * 500);
} catch (InterruptedException ie) {
// TODO ?
}
}
}
1.2 +9 -4 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectArmiHostContext.java
Index: DirectArmiHostContext.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectArmiHostContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DirectArmiHostContext.java 28 Dec 2001 18:08:37 -0000 1.1
+++ DirectArmiHostContext.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectArmiHostContext.java,v 1.1 2001/12/28 18:08:37 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/28 18:08:37 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectArmiHostContext.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -64,6 +64,7 @@
import org.apache.commons.armi.client.impl.AbstractArmiHostContext;
+import org.apache.commons.armi.client.ArmiConnectionListener;
import org.apache.commons.armi.common.ArmiInvocationHandler;
import org.apache.commons.armi.common.ArmiConnectionException;
@@ -73,7 +74,7 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class DirectArmiHostContext extends AbstractArmiHostContext {
@@ -90,4 +91,8 @@
throws ArmiConnectionException {
super(new DirectInvocationHandler(armiInvocationHandler));
}
+
+ public void setArmiConnectionListener(ArmiConnectionListener armiConnectionListener) {
+ }
+
}
1.5 +30 -13 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectInvocationHandler.java
Index: DirectInvocationHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectInvocationHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DirectInvocationHandler.java 1 Jan 2002 17:53:06 -0000 1.4
+++ DirectInvocationHandler.java 1 Jan 2002 23:12:47 -0000 1.5
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectInvocationHandler.java,v 1.4 2002/01/01 17:53:06 hammant Exp $
- * $Revision: 1.4 $
- * $Date: 2002/01/01 17:53:06 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/direct/DirectInvocationHandler.java,v 1.5 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.5 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -71,6 +71,10 @@
import org.apache.commons.armi.common.NotPublishedReply;
import org.apache.commons.armi.common.NotPublishedException;
import org.apache.commons.armi.common.PublishedNameRequest;
+import org.apache.commons.armi.common.ArmiInvocationException;
+import org.apache.commons.armi.common.ProblemReply;
+import org.apache.commons.armi.common.MethodRequest;
+import org.apache.commons.armi.client.impl.ArmiClientInvocationHandler;
/**
@@ -78,9 +82,9 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
-public final class DirectInvocationHandler implements ArmiInvocationHandler {
+public final class DirectInvocationHandler extends ArmiClientInvocationHandler {
ArmiInvocationHandler mArmiInvocationHandler;
@@ -110,19 +114,32 @@
public ArmiReply handleInvocation(ArmiRequest request) {
boolean again = true;
ArmiReply reply = null;
+ int tries = 0;
+ long start = System.currentTimeMillis();
while (again) {
+ tries++;
again = false;
reply = mArmiInvocationHandler.handleInvocation(request);
- if (reply instanceof TryLaterReply) {
- int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
- try {
- Thread.sleep(millis);
- } catch (InterruptedException ie) {}
- again = true;
- } else if (reply instanceof NotPublishedReply) {
- throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ if (!(reply instanceof ProblemReply)) {
+ // speed?
+ if (reply instanceof TryLaterReply) {
+ int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
+ mArmiConnectionListener.armiServiceSuspended(request,tries,millis);
+ again = true;
+ } else if (reply instanceof NotPublishedReply) {
+ throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ }
}
}
+ if (request instanceof MethodRequest) {
+ mArmiConnectionListener.armiMethodCalled(((MethodRequest) request).getMethodSignature(), System.currentTimeMillis() - start);
+ }
return reply;
}
+
+ protected boolean tryReconnect() {
+ // blimey how do we reconnect this?
+ throw new ArmiInvocationException("Direct connection broken, unable to reconnect.");
+ }
+
}
1.2 +10 -4 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/piped/PipedInvocationHandler.java
Index: PipedInvocationHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/piped/PipedInvocationHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PipedInvocationHandler.java 28 Dec 2001 18:08:37 -0000 1.1
+++ PipedInvocationHandler.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/piped/PipedInvocationHandler.java,v 1.1 2001/12/28 18:08:37 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/28 18:08:37 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/piped/PipedInvocationHandler.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -66,6 +66,7 @@
import org.apache.commons.armi.client.impl.ObjectStreamInvocationHandler;
import org.apache.commons.armi.common.ArmiConnectionException;
import org.apache.commons.armi.common.ArmiPipeConnector;
+import org.apache.commons.armi.common.ArmiInvocationException;
import java.io.PipedOutputStream;
import java.io.PipedInputStream;
@@ -79,7 +80,7 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public final class PipedInvocationHandler extends ObjectStreamInvocationHandler {
@@ -106,5 +107,10 @@
throw new ArmiConnectionException("Cannot bind the pipes together :"
+ ioe.getMessage());
}
+ }
+
+ protected boolean tryReconnect() {
+ // blimey how do we reconnect this?
+ throw new ArmiInvocationException("Piped connection broken, unable to reconnect.");
}
}
1.5 +62 -25 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/rmi/RmiInvocationHandler.java
Index: RmiInvocationHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/rmi/RmiInvocationHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- RmiInvocationHandler.java 1 Jan 2002 17:53:06 -0000 1.4
+++ RmiInvocationHandler.java 1 Jan 2002 23:12:47 -0000 1.5
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/rmi/RmiInvocationHandler.java,v 1.4 2002/01/01 17:53:06 hammant Exp $
- * $Revision: 1.4 $
- * $Date: 2002/01/01 17:53:06 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/rmi/RmiInvocationHandler.java,v 1.5 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.5 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -73,10 +73,15 @@
import org.apache.commons.armi.common.NotPublishedReply;
import org.apache.commons.armi.common.NotPublishedException;
import org.apache.commons.armi.common.PublishedNameRequest;
+import org.apache.commons.armi.common.MethodRequest;
+import org.apache.commons.armi.common.ProblemReply;
+import org.apache.commons.armi.client.impl.ArmiClientInvocationHandler;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
+import java.rmi.ConnectException;
+import java.rmi.ConnectIOException;
import java.net.MalformedURLException;
@@ -86,11 +91,12 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
-public final class RmiInvocationHandler implements ArmiInvocationHandler {
+public final class RmiInvocationHandler extends ArmiClientInvocationHandler {
- RmiArmiInvocationHandler mRmiArmiInvocationHandler;
+ private RmiArmiInvocationHandler mRmiArmiInvocationHandler;
+ private String mURL;
/**
* Constructor RmiInvocationHandler
@@ -104,11 +110,11 @@
*/
public RmiInvocationHandler(String host, int port) throws ArmiConnectionException {
- String url = "rmi://" + host + ":" + port + "/"
+ mURL = "rmi://" + host + ":" + port + "/"
+ RmiArmiInvocationHandler.class.getName();
try {
- mRmiArmiInvocationHandler = (RmiArmiInvocationHandler) Naming.lookup(url);
+ mRmiArmiInvocationHandler = (RmiArmiInvocationHandler) Naming.lookup(mURL);
} catch (NotBoundException nbe) {
throw new ArmiConnectionException(
"Cannot bind to the remote RMI service. Either an IP or RMI issue.");
@@ -121,6 +127,21 @@
}
/**
+ * Method tryReconnect
+ *
+ * @return
+ *
+ */
+ protected boolean tryReconnect() {
+ try {
+ mRmiArmiInvocationHandler = (RmiArmiInvocationHandler) Naming.lookup(mURL);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ /**
* Method handleInvocation
*
*
@@ -131,26 +152,42 @@
*/
public ArmiReply handleInvocation(ArmiRequest request) {
- try {
- boolean again = true;
- ArmiReply reply = null;
- while (again) {
- again = false;
+ boolean again = true;
+ ArmiReply reply = null;
+ int tries = 0;
+ long start = System.currentTimeMillis();
+ while (again) {
+ tries++;
+ again = false;
+ try {
+
reply = mRmiArmiInvocationHandler.handleInvocation(request);
- if (reply instanceof TryLaterReply) {
- int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
- try {
- Thread.sleep(millis);
- } catch (InterruptedException ie) {}
- again = true;
- } else if (reply instanceof NotPublishedReply) {
- throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ if (!(reply instanceof ProblemReply)) {
+ // speed?
+ if (reply instanceof TryLaterReply) {
+ int millis = ((TryLaterReply) reply).getSuggestedDelayMillis();
+ mArmiConnectionListener.armiServiceSuspended(request,tries,millis);
+ again = true;
+ } else if (reply instanceof NotPublishedReply) {
+ throw new NotPublishedException(((PublishedNameRequest) request).getPublishedObjectName());
+ }
+ }
+ } catch (RemoteException re) {
+ if (re instanceof ConnectException | re instanceof ConnectIOException) {
+ int retryConnectTries = 0;
+ mRmiArmiInvocationHandler = null;
+ while (!tryReconnect()) {
+ mArmiConnectionListener.armiServiceAbend(retryConnectTries);
+ retryConnectTries++;
+ }
+ } else {
+ throw new ArmiInvocationException("Unknown RMI problem : " + re.getMessage());
}
}
- return reply;
- } catch (RemoteException re) {
- // should impl so automagic try again here (for n times at least).
- throw new ArmiInvocationException("Unknown RMI problem : " + re.getMessage());
}
+ if (request instanceof MethodRequest) {
+ mArmiConnectionListener.armiMethodCalled(((MethodRequest) request).getMethodSignature(), System.currentTimeMillis() - start);
+ }
+ return reply;
}
}
1.2 +32 -11 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/socket/PlainSocketInvocationHandler.java
Index: PlainSocketInvocationHandler.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/socket/PlainSocketInvocationHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PlainSocketInvocationHandler.java 28 Dec 2001 18:08:38 -0000 1.1
+++ PlainSocketInvocationHandler.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/socket/PlainSocketInvocationHandler.java,v 1.1 2001/12/28 18:08:38 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/28 18:08:38 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/client/impl/socket/PlainSocketInvocationHandler.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -61,28 +61,27 @@
*/
package org.apache.commons.armi.client.impl.socket;
-
-
import org.apache.commons.armi.client.impl.ObjectStreamInvocationHandler;
import org.apache.commons.armi.common.ArmiConnectionException;
+import java.net.Socket;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
-import java.net.Socket;
-import java.net.MalformedURLException;
-
/**
* Class PlainSocketInvocationHandler
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public final class PlainSocketInvocationHandler extends ObjectStreamInvocationHandler {
+ private String mHost;
+ private int mPort;
+
/**
* Constructor PlainSocketInvocationHandler
*
@@ -94,16 +93,38 @@
*
*/
public PlainSocketInvocationHandler(String host, int port) throws ArmiConnectionException {
-
+ mHost = host;
+ mPort = port;
try {
Socket socket = new Socket(host, port);
ObjectOutputStream oOS = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream oIS = new ObjectInputStream(socket.getInputStream());
-
setObjectInputStream(oIS);
setObjectOutputStream(oOS);
} catch (IOException ioe) {
throw new ArmiConnectionException("Cannot open Stream(s) for socket");
+ }
+
+
+ }
+
+ /**
+ * Method tryReconnect
+ *
+ *
+ * @return connected or not.
+ */
+ protected boolean tryReconnect() {
+ try {
+ Socket socket = new Socket(mHost, mPort);
+ ObjectOutputStream oOS = new ObjectOutputStream(socket.getOutputStream());
+ ObjectInputStream oIS = new ObjectInputStream(socket.getInputStream());
+
+ setObjectInputStream(oIS);
+ setObjectOutputStream(oOS);
+ return true;
+ } catch (IOException ioe) {
+ return false;
}
}
}
1.2 +3 -3 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/NotPublishedReply.java
Index: NotPublishedReply.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/NotPublishedReply.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- NotPublishedReply.java 31 Dec 2001 13:48:21 -0000 1.1
+++ NotPublishedReply.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/NotPublishedReply.java,v 1.1 2001/12/31 13:48:21 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/31 13:48:21 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/NotPublishedReply.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -66,9 +66,9 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
-public class NotPublishedReply extends ArmiReply {
+public class NotPublishedReply extends ProblemReply {
/**
1.2 +3 -3 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/RequestFailedReply.java
Index: RequestFailedReply.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/RequestFailedReply.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RequestFailedReply.java 30 Dec 2001 00:42:10 -0000 1.1
+++ RequestFailedReply.java 1 Jan 2002 23:12:47 -0000 1.2
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/RequestFailedReply.java,v 1.1 2001/12/30 00:42:10 hammant Exp $
- * $Revision: 1.1 $
- * $Date: 2001/12/30 00:42:10 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/RequestFailedReply.java,v 1.2 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.2 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -68,9 +68,9 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
-public class RequestFailedReply extends ArmiReply {
+public class RequestFailedReply extends ProblemReply {
private final String mFailureReason;
1.3 +5 -5 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/TryLaterReply.java
Index: TryLaterReply.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/TryLaterReply.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TryLaterReply.java 1 Jan 2002 17:53:06 -0000 1.2
+++ TryLaterReply.java 1 Jan 2002 23:12:47 -0000 1.3
@@ -1,8 +1,8 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/TryLaterReply.java,v 1.2 2002/01/01 17:53:06 hammant Exp $
- * $Revision: 1.2 $
- * $Date: 2002/01/01 17:53:06 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/TryLaterReply.java,v 1.3 2002/01/01 23:12:47 hammant Exp $
+ * $Revision: 1.3 $
+ * $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
@@ -68,9 +68,9 @@
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
-public class TryLaterReply extends ArmiReply {
+public class TryLaterReply extends ProblemReply {
private final int mSuggestedDelayMillis;
1.1 jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/ProblemReply.java
Index: ProblemReply.java
===================================================================
/*
* $Header: /home/cvs/jakarta-commons-sandbox/armi/src/java/org/apache/commons/armi/common/ProblemReply.java,v 1.1 2002/01/01 23:12:47 hammant Exp $
* $Revision: 1.1 $
* $Date: 2002/01/01 23:12:47 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.armi.common;
/**
* Class ProblemReply
*
*
* @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
* @version $Revision: 1.1 $
*/
public class ProblemReply extends ArmiReply {
/**
* Constructor ProblemReply
*
*/
public ProblemReply() {
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>