所以我试图让我的Apache xmlrpc客户端/服务器实现来玩球。除了一个关键问题外,一切正常:
我的处理程序类(通过属性文件org.apache.xmlrpc.webserver.XmlRpcServlet.properties
映射)应该响应,但它的构造函数在每次方法调用时都会被调用。似乎处理程序类在每次调用时都被实例化,这是不好的,因为我有数据存储在我需要在调用之间保存的实例变量中。
如何保存对实例化处理程序的引用,以便我可以访问它的实例变量?
答案 0 :(得分:1)
答案 1 :(得分:1)
这是Apache XMLRPC 3.x的标准行为。 http://ws.apache.org/xmlrpc/handlerCreation.html:
默认情况下,Apache XML-RPC会创建一个新对象来处理每个对象 在服务器端收到的请求。
但是,您可以使用RequestProcessorFactoryFactory模拟XMLRPC 2.x的行为,其中您注册了处理程序对象而不是处理程序类。我编写了一个可以使用的自定义RequestProcessorFactoryFactory:
public class CustomHandler implements RequestProcessorFactoryFactory {
Map<Class<?>, RequestProcessorFactory> handlers =
Collections.synchronizedMap(
new HashMap<Class<?>, RequestProcessorFactory>());
@Override
public RequestProcessorFactory getRequestProcessorFactory(Class pClass)
throws XmlRpcException {
return handlers.get(pClass);
}
public void addHandler(final Object handler) {
handlers.put(handler.getClass(), new RequestProcessorFactory() {
@Override
public Object getRequestProcessor(XmlRpcRequest pRequest)
throws XmlRpcException {
return handler;
}
});
}
}
然后可以将其用于例如像这样的XMLRPC WebServer
WebServer server = ...
PropertyHandlerMapping phm = new PropertyHandlerMapping();
server.getXmlRpcServer().setHandlerMapping(phm);
Custom sh = new CustomHandler();
phm.setRequestProcessorFactoryFactory(sh);
Object handler = ... /** The object you want to expose via XMLRPC */
sh.addHandler(handler);
phm.addHandler(serverName, handler.getClass());
答案 2 :(得分:0)
也许与javax.xml.rpc.session.maintain
设置为true有关?