Ejemplo n.º 1
0
 public Object objectFromByteBuffer(byte[] buf, int offset, int length) throws Exception {
   if (buf == null || (offset == 0 && length == buf.length))
     return marshaller.objectFromByteBuffer(buf);
   byte[] tmp = new byte[length];
   System.arraycopy(buf, offset, tmp, 0, length);
   return marshaller.objectFromByteBuffer(tmp);
 }
Ejemplo n.º 2
0
  /**
   * Message contains MethodCall. Execute it against *this* object and return result. Use
   * MethodCall.invoke() to do this. Return result.
   */
  public Object handle(Message req) throws Exception {
    if (server_obj == null) {
      log.error(Util.getMessage("NoMethodHandlerIsRegisteredDiscardingRequest"));
      return null;
    }

    if (req == null || req.getLength() == 0) {
      log.error(Util.getMessage("MessageOrMessageBufferIsNull"));
      return null;
    }

    Object body =
        req_marshaller != null
            ? req_marshaller.objectFromBuffer(req.getRawBuffer(), req.getOffset(), req.getLength())
            : req.getObject();

    if (!(body instanceof MethodCall))
      throw new IllegalArgumentException("message does not contain a MethodCall object");

    MethodCall method_call = (MethodCall) body;

    if (log.isTraceEnabled()) log.trace("[sender=%s], method_call: %s", req.getSrc(), method_call);

    if (method_call.getMode() == MethodCall.ID) {
      if (method_lookup == null)
        throw new Exception(
            String.format(
                "MethodCall uses ID=%d, but method_lookup has not been set", method_call.getId()));
      Method m = method_lookup.findMethod(method_call.getId());
      if (m == null) throw new Exception("no method found for " + method_call.getId());
      method_call.setMethod(m);
    }

    return method_call.invoke(server_obj);
  }
Ejemplo n.º 3
0
  /**
   * Invokes a method in all members and expects responses from members contained in dests (or all
   * members if dests is null).
   *
   * @param dests A list of addresses. If null, we'll wait for responses from all cluster members
   * @param method_call The method (plus args) to be invoked
   * @param options A collection of call options, e.g. sync versus async, timeout etc
   * @param listener A FutureListener which will be registered (if non null) with the future
   *     <em>before</em> the call is invoked
   * @return NotifyingFuture A future from which the results can be fetched
   * @throws Exception If the sending of the message threw an exception. Note that <em>no</em>
   *     exception will be thrown if any of the target members threw an exception; such an exception
   *     will be in the Rsp element for the particular member in the RspList
   */
  public <T> NotifyingFuture<RspList<T>> callRemoteMethodsWithFuture(
      Collection<Address> dests,
      MethodCall method_call,
      RequestOptions options,
      FutureListener<RspList<T>> listener)
      throws Exception {
    if (dests != null && dests.isEmpty()) { // don't send if dest list is empty
      if (log.isTraceEnabled())
        log.trace(
            "destination list of %s() is empty: no need to send message", method_call.getName());
      return new NullFuture<>(new RspList());
    }

    if (log.isTraceEnabled())
      log.trace("dests=%s, method_call=%s, options=%s", dests, method_call, options);

    Buffer buf =
        req_marshaller != null
            ? req_marshaller.objectToBuffer(method_call)
            : Util.objectToBuffer(method_call);
    Message msg = new Message().setBuffer(buf);

    NotifyingFuture<RspList<T>> retval = super.castMessageWithFuture(dests, msg, options, listener);
    if (log.isTraceEnabled()) log.trace("responses: %s", retval);
    return retval;
  }
Ejemplo n.º 4
0
 /**
  * Invokes a method in a cluster member and - if blocking - returns the result
  *
  * @param dest The target member on which to invoke the method
  * @param call The call to be invoked, including method are arguments
  * @param options The options (e.g. blocking, timeout etc)
  * @param listener A FutureListener which will be registered (if non null) with the future
  *     <em>before</em> the call is invoked
  * @return A future from which the result can be fetched. If the callee threw an invocation, an
  *     ExecutionException will be thrown on calling Future.get().
  * @throws Exception Thrown if the method invocation threw an exception
  */
 public <T> NotifyingFuture<T> callRemoteMethodWithFuture(
     Address dest, MethodCall call, RequestOptions options, FutureListener<T> listener)
     throws Exception {
   if (log.isTraceEnabled()) log.trace("dest=%s, method_call=%s, options=%s", dest, call, options);
   Buffer buf =
       req_marshaller != null ? req_marshaller.objectToBuffer(call) : Util.objectToBuffer(call);
   Message msg = new Message(dest, null, null).setBuffer(buf);
   return super.sendMessageWithFuture(msg, options, listener);
 }
Ejemplo n.º 5
0
  /**
   * Invokes a method in a cluster member and - if blocking - returns the result
   *
   * @param dest The target member on which to invoke the method
   * @param call The call to be invoked, including method are arguments
   * @param options The options (e.g. blocking, timeout etc)
   * @return The result
   * @throws Exception Thrown if the method invocation threw an exception, either at the caller or
   *     the callee
   */
  public <T> T callRemoteMethod(Address dest, MethodCall call, RequestOptions options)
      throws Exception {
    if (log.isTraceEnabled()) log.trace("dest=%s, method_call=%s, options=%s", dest, call, options);

    Buffer buf =
        req_marshaller != null ? req_marshaller.objectToBuffer(call) : Util.objectToBuffer(call);
    Message msg = new Message(dest, null, null).setBuffer(buf);

    T retval = super.sendMessage(msg, options);
    if (log.isTraceEnabled()) log.trace("retval: %s", retval);
    return retval;
  }
Ejemplo n.º 6
0
 public Buffer objectToBuffer(Object obj) throws Exception {
   byte[] buf = marshaller.objectToByteBuffer(obj);
   return new Buffer(buf, 0, buf.length);
 }
Ejemplo n.º 7
0
 public Object objectFromByteBuffer(byte[] buf) throws Exception {
   return buf == null ? null : marshaller.objectFromByteBuffer(buf);
 }
Ejemplo n.º 8
0
 public byte[] objectToByteBuffer(Object obj) throws Exception {
   return marshaller.objectToByteBuffer(obj);
 }