Mercurial > lbo > hg > clusterrpc-java
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(); } }