Java Client-Server per XML-RPC - Servershutdown ?

Hallo alle miteinander,

ich habe mich einmal an eine XML-RPC Client-Server Verbindung gesetzt.
Anbei der Code:
Server

package my.xmlrpcServer;



import org.apache.xmlrpc.server.\*;
import org.apache.xmlrpc.webserver.WebServer;


public class Server {

 //the port to run on
 private static final int port = 8080;
 private static WebServer webServer;



 public static void main(String[] args) throws Exception {

 webServer = new WebServer(port);

 //xml rpc server aus webserver kreieren
 XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();

 //Handling für die rpc object calls
 PropertyHandlerMapping phm = new PropertyHandlerMapping();

 //calls korrek verstanden: wenn calc reinkommt wird die klasse Calc aufgerufen.
 phm.addHandler("calc", my.xmlrpcServer.Calc.class);
 phm.addHandler("stopServer", my.xmlrpcServer.Server.class);

 //propertyhandler auf xml server draufhauen
 xmlRpcServer.setHandlerMapping(phm);

 XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
 serverConfig.setEnabledForExtensions(true);
 serverConfig.setContentLengthOptional(false);
 System.out.println("starting webserver");
 webServer.start();

 }//main

 public boolean end() {
 webServer.shutdown();
 System.out.println("stopping webserver");
 return Boolean.TRUE;
 }


}//class

Dazu die Calc-Klasse

package my.xmlrpcServer;

public class Calc {

 public Calc() {

 }

 public int add(int i, int j) {
 System.out.println("called add");
 return i+j;
 }

}

Und mein Client dazu:

package my.XMLRPCClient;

import java.net.URL;
import java.util.Vector;

import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;

public class Client {

 public static void main(String[] args) throws Exception {

 XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();

 config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
 config.setEnabledForExceptions(true);
 config.setConnectionTimeout(60\*100);
 config.setReplyTimeout(60 \* 1000);

 XmlRpcClient client = new XmlRpcClient();
 client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
 client.setConfig(config);

 Object[] params = new Object[] { new Integer(2), new Integer(3) };

 Integer result = (Integer) client.execute("calc.add", params); 

 System.out.println("2 + 3 = " + result);

 client.execute("stopServer.end",new Vector());


 }//main


}//class

Nun zu meinen Fragen:
Ist es normal, dass sich keine Handler auf Funktionen ohne return-Wert bilden lassen? Ohne das boolean im Return liefert die Funktion vom Server end() immer einen Java Fehler.
Dazu finde ich es auch etwas befremdlich, dass ich „einfach irgendwas“ beim client.execute() als zweiten Paramter für eine Funktion ohne Parameter anhängen muss - ist das denn auch so gewollt oder geht es schöner?

Nach etwas gefrickel funktioniert es nun auch, daß der Client den Server beendet. Aber ich habe ein paar unschöne Fehlermeldungen mit denen ich nichts anzufangen weiss:

11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server 127.0.0.1 failed to respond
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server 127.0.0.1 failed to respond
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
Exception in thread "main" org.apache.xmlrpc.XmlRpcException: I/O error while communicating with HTTP server: Connection refused: connect
 at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:244)
 at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:151)
 at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:115)
 at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:158)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:147)
 at my.XMLRPCClient.Client.main(Client.java:31)
Caused by: java.net.ConnectException: Connection refused: connect
 at java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.net.PlainSocketImpl.doConnect(Unknown Source)
 at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
 at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
 at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
 at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
 at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
 at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:227)
 ... 7 more
Caused by:
java.net.ConnectException: Connection refused: connect
 at java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.net.PlainSocketImpl.doConnect(Unknown Source)
 at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
 at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
 at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
 at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
 at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
 at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:227)
 at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:151)
 at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:115)
 at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:158)
 at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:147)
 at my.XMLRPCClient.Client.main(Client.java:31)

Weiss jemand wie ich diese wegbekomme? Oder kann mir kurz erklären, was ich da für einen Murks fabriziert habe? :wink:
Oder gibt es vielleicht eine schönere Methode den Server abzuschalten?

Besten Dank und viele Grüße

Björn