Проблема с библиотекой Apache Java XMLRPC - PullRequest
2 голосов
/ 28 октября 2009

Итак, я пытаюсь заставить мою клиентско-серверную реализацию Apache xmlrpc играть в мяч. Все работает отлично, за исключением одного важного вопроса:

мой класс обработчика (сопоставленный через файл свойств org.apache.xmlrpc.webserver.XmlRpcServlet.properties) реагирует должным образом, но его конструктор вызывается при каждом вызове метода. Казалось бы, класс обработчика создается при каждом вызове, что плохо, потому что у меня есть данные, хранящиеся в переменных экземпляра, которые мне нужно сохранять между вызовами.

Как сохранить ссылку на экземплярный обработчик, чтобы я мог получить доступ к его переменным экземпляра?

Ответы [ 3 ]

1 голос
/ 23 марта 2010

Итак, для тех, кто еще хочет использовать XMLRPC, вот как я исправил эту проблему:

http://xmlrpc.sourceforge.net/

, на мой взгляд, намного превосходит apache xmlrpc.

1 голос
/ 06 февраля 2013

Это стандартное поведение Apache XMLRPC 3.x. http://ws.apache.org/xmlrpc/handlerCreation.html:

По умолчанию Apache XML-RPC создает новый объект для обработки каждого запрос получен на стороне сервера.

Однако вы можете эмулировать поведение XMLRPC 2.x, где вы регистрировали объекты-обработчики вместо классов-обработчиков, используя RequestProcessorFactoryFactory. Я написал пользовательский 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());
0 голосов
/ 28 октября 2009

Может быть, что-то делать с javax.xml.rpc.session.maintain, установленным в true?

...