Hello all,
As I understand, each time a server receives an xmlrpc invocation a new
object is created for the class registered to handle this. I do not wish to
have this happen as it produces problems for me to map the invocations to
any non-static objects especially if I have more than one xml-rpc server.
>From browsing some discussion earlier this month on the mailing list I
gather that there is not much control provided in apache xmlrpc over this
behaviour. In any case, I managed to hack something that seems to work and
this is how I managed to address the issue, maybe it is of some help to
anyone else who needs something similar..
when starting the xmlrpc server I need to register a handler mapping that is
used to find the classes to create and the methods to invoke:
xmlRpcServer.setHandlerMapping(mapping);
to have some control over object creation I then use my own handler mapping
like this
public class XmlRpcFooHandlerMapping implements XmlRpcHandlerMapping {
//this is set in the constructor and gets as a parameter the non-static
object I wish to use..
private final XmlRpcFooHandler handler;
public XmlRpcFooHandlerMapping(XmlRpcFooHandler handler) {
this.handler = handler;
}
public XmlRpcHandler getHandler(String name) throws
XmlRpcNoSuchHandlerException, XmlRpcException {
//.. here some simple checks on the name like it contains "Foo"..
return handler;
}
}
and the handler..
public class XmlRpcFooHandler implements XmlRpcHandler {
//set this in the constructor and use in any way you like, it should be
the same obejct for all invocations..
private final Foo foo;
public XmlRpcFooHandler(Foo foo) {
this.foo = foo;
}
//here I inspire from the default implementation and use the TypeConverter
class to conver the parameters..
//since I know exactly the class (Foo.class) I wish to use, I can do lots of
shortcuts such as expect method matching with just method names to be
enough...
}
So thats it.. I hope it helps someone.
If someone can suggest something more elegant, point out some flaws in it
or whatever I am happy to hear..
Teemu