3

だから私は、Apache xmlrpc クライアント/サーバーの実装でボールをプレイしようとしています。1 つの重大な問題を除いて、すべて正常に動作します。

私のハンドラー クラス (プロパティ ファイルを介してマップorg.apache.xmlrpc.webserver.XmlRpcServlet.properties) は正常に反応しますが、そのコンストラクターはメソッド呼び出しのたびに呼び出されます。呼び出し間で保存する必要があるインスタンス変数にデータが格納されているため、呼び出しごとにハンドラー クラスがインスタンス化されているように見えますが、これは悪いことです。

インスタンス変数にアクセスできるように、インスタンス化されたハンドラーへの参照を保存するにはどうすればよいですか?

4

4 に答える 4

1

これは、ApacheXMLRPC3.xの標準的な動作です。http://ws.apache.org/xmlrpc/handlerCreation.html

デフォルトでは、Apache XML-RPCは、サーバー側で受信した各リクエストを処理するための新しいオブジェクトを作成します。

ただし、RequestProcessorFactoryFactoryを使用して、ハンドラークラスの代わりにハンドラーオブジェクトを登録したXMLRPC2.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;
      }
    });
  }

}

これは、たとえば次のようなXMLRPCWebサーバーで使用できます。

  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());
于 2013-02-06T13:58:04.003 に答える
1

したがって、まだ XMLRPC を使用したい人のために、私がこの問題をどのように修正したかを以下に示します。

http://xmlrpc.sourceforge.net/

私の意見では、Apache xmlrpc よりもはるかに優れています。

于 2010-03-23T10:32:14.787 に答える
0

たぶんjavax.xml.rpc.session.maintain、trueに設定することと関係がありますか?

于 2009-10-28T12:33:46.790 に答える