Description
In RPC.java, the field named CLIENT should be neither static, nor a field of RPC. It should be (a) a private nonstatic field of InvocationHandler(),and (just further down), (b) a local variable in the RPC.call() method below. The comment above the declaration was a bit of giveaway:
//TODO mb@media-style.com: static client or non-static client?
private static Client CLIENT;
private static class Invoker implements InvocationHandler {
private InetSocketAddress address;
public Invoker(InetSocketAddress address, Configuration conf) {
this.address = address;
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null)
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
}
/** Construct a client-side proxy object that implements the named protocol,
- talking to a server at the named address. */
public static Object getProxy(Class protocol, InetSocketAddress addr, Configuration conf)Unknown macro: { return Proxy.newProxyInstance(protocol.getClassLoader(), new Class[] { protocol }, new Invoker(addr, conf)); }
/** Expert: Make multiple, parallel calls to a set of servers. */
public static Object[] call(Method method, Object[][] params,
InetSocketAddress[] addrs, Configuration conf)
throws IOException {
Invocation[] invocations = new Invocation[params.length];
for (int i = 0; i < params.length; i++)
invocations[i] = new Invocation(method, params[i]);
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null)
Writable[] wrappedValues = CLIENT.call(invocations, addrs);
if (method.getReturnType() == Void.TYPE)
{ return null; } Object[] values =
(Object[])Array.newInstance(method.getReturnType(),wrappedValues.length);
for (int i = 0; i < values.length; i++)
if (wrappedValues[i] != null)
values[i] = ((ObjectWritable)wrappedValues[i]).get();
return values;
}.