Class JsonRpcServer


public class JsonRpcServer extends StringRpcServer
JSON-RPC Server class.

Given a Java Class, representing an interface, and an implementation of that interface, JsonRpcServer will reflect on the class to construct the ServiceDescription, and will route incoming requests for methods on the interface to the implementation object while the mainloop() is running.

JsonRpcServer delegates JSON parsing and generating to a JsonRpcMapper.

See Also:
  • Field Details

    • LOGGER

      private static final org.slf4j.Logger LOGGER
    • mapper

      private final JsonRpcMapper mapper
    • serviceDescription

      private ServiceDescription serviceDescription
      Holds the JSON-RPC service description for this client.
    • interfaceInstance

      private Object interfaceInstance
      The instance backing this server.
  • Constructor Details

    • JsonRpcServer

      public JsonRpcServer(Channel channel, Class<?> interfaceClass, Object interfaceInstance, JsonRpcMapper mapper) throws IOException
      Throws:
      IOException
    • JsonRpcServer

      public JsonRpcServer(Channel channel, Class<?> interfaceClass, Object interfaceInstance) throws IOException
      Construct a server that talks to the outside world using the given channel, and constructs a fresh temporary queue. Use getQueueName() to discover the created queue name.
      Parameters:
      channel - AMQP channel to use
      interfaceClass - Java interface that this server is exposing to the world
      interfaceInstance - Java instance (of interfaceClass) that is being exposed
      Throws:
      IOException - if something goes wrong during an AMQP operation
    • JsonRpcServer

      public JsonRpcServer(Channel channel, String queueName, Class<?> interfaceClass, Object interfaceInstance, JsonRpcMapper mapper) throws IOException
      Throws:
      IOException
    • JsonRpcServer

      public JsonRpcServer(Channel channel, String queueName, Class<?> interfaceClass, Object interfaceInstance) throws IOException
      Construct a server that talks to the outside world using the given channel and queue name. Our superclass, RpcServer, expects the queue to exist at the time of construction.
      Parameters:
      channel - AMQP channel to use
      queueName - AMQP queue name to listen for requests on
      interfaceClass - Java interface that this server is exposing to the world
      interfaceInstance - Java instance (of interfaceClass) that is being exposed
      Throws:
      IOException - if something goes wrong during an AMQP operation
  • Method Details

    • init

      private void init(Class<?> interfaceClass, Object interfaceInstance)
    • handleStringCall

      public String handleStringCall(String requestBody, AMQP.BasicProperties replyProperties)
      Override our superclass' method, dispatching to doCall.
      Overrides:
      handleStringCall in class StringRpcServer
    • doCall

      public String doCall(String requestBody)
      Runs a single JSON-RPC request.
      Parameters:
      requestBody - the JSON-RPC request string (a JSON encoded value)
      Returns:
      a JSON-RPC response string (a JSON encoded value)
    • matchingMethod

      public Method matchingMethod(String methodName, Object[] params)
      Retrieves the best matching method for the given method name and parameters.

      Subclasses may override this if they have specialised dispatching requirements, so long as they continue to honour their ServiceDescription.

    • errorResponse

      private String errorResponse(Object id, int code, String message, Object errorArg)
      Construct and encode a JSON-RPC error response for the request ID given, using the code, message, and possible (JSON-encodable) argument passed in.
    • resultResponse

      private String resultResponse(Object id, Object result)
      Construct and encode a JSON-RPC success response for the request ID given, using the result value passed in.
    • response

      private String response(Object id, String label, Object value)
      Private API - used by errorResponse and resultResponse.
    • getServiceDescription

      public ServiceDescription getServiceDescription()
      Public API - gets the service description record that this service built from interfaceClass at construction time.