view src/main/java/net/borgac/clusterrpc/client/Request.java @ 10:b99a9821115c

Implement high-level functionality for Client and Request
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 25 Sep 2016 15:18:18 +0200
parents 0c24a0ee0c34
children
line wrap: on
line source

package net.borgac.clusterrpc.client;

import com.google.protobuf.ByteString;
import com.google.protobuf.Message;
import java.time.Instant;
import java.util.Random;
import proto.Rpc;

/**
 *
 * @author lbo
 */
public class Request {

    private static final Random ID_GENERATOR = new Random(
            Instant.now().getEpochSecond() + Instant.now().getNano());

    private Rpc.RPCRequest.Builder requestBuilder;
    private long timeoutMillis;
    private final Client outer;

    Request(String service, String method, final Client outer) {
        this.outer = outer;
        this.requestBuilder = Rpc.RPCRequest.newBuilder();
        requestBuilder.setCallerId(outer.getCallerId())
                .setSrvc(service)
                .setProcedure(method)
                .setRpcId(Long.toHexString(ID_GENERATOR.nextLong()).toUpperCase());
    }

    public Request setPayload(byte[] payload) {
        requestBuilder.setData(ByteString.copyFrom(payload));
        return this;
    }

    public Request setPayload(Message proto) {
        requestBuilder.setData(proto.toByteString());
        return this;
    }

    public Request setTimeout(long millis) {
        timeoutMillis = millis;
        return this;
    }

    public void setTraceEnabled(boolean enabled) {
        requestBuilder.setWantTrace(enabled);
    }

    public void send() throws RpcException {
        outer.sendRequest(this);
    }

    Rpc.RPCRequest buildRequest() {
        if (timeoutMillis > 0) {
            Instant now = Instant.now();
            long nowMicros = now.getEpochSecond() * 1_000_000 + now.getNano() / 1000;
            requestBuilder.setDeadline(nowMicros + 1000 * timeoutMillis);
        }
        return requestBuilder.build();
    }

}