mirror of https://github.com/grpc/grpc-java.git
cronet: allow application to provide all threads
This commit is contained in:
parent
7c69c3a867
commit
ca55b6f7e7
|
|
@ -17,6 +17,7 @@
|
||||||
package io.grpc.cronet;
|
package io.grpc.cronet;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
|
import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
@ -73,6 +74,9 @@ public final class CronetChannelBuilder extends
|
||||||
throw new UnsupportedOperationException("call forAddress(String, int, CronetEngine) instead");
|
throw new UnsupportedOperationException("call forAddress(String, int, CronetEngine) instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private ScheduledExecutorService scheduledExecutorService;
|
||||||
|
|
||||||
private final CronetEngine cronetEngine;
|
private final CronetEngine cronetEngine;
|
||||||
|
|
||||||
private boolean alwaysUsePut = false;
|
private boolean alwaysUsePut = false;
|
||||||
|
|
@ -161,12 +165,30 @@ public final class CronetChannelBuilder extends
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a custom scheduled executor service.
|
||||||
|
*
|
||||||
|
* <p>It's an optional parameter. If the user has not provided a scheduled executor service when
|
||||||
|
* the channel is built, the builder will use a static cached thread pool.
|
||||||
|
*
|
||||||
|
* @return this
|
||||||
|
*
|
||||||
|
* @since 1.12.0
|
||||||
|
*/
|
||||||
|
public final CronetChannelBuilder scheduledExecutorService(
|
||||||
|
ScheduledExecutorService scheduledExecutorService) {
|
||||||
|
this.scheduledExecutorService =
|
||||||
|
checkNotNull(scheduledExecutorService, "scheduledExecutorService");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final ClientTransportFactory buildTransportFactory() {
|
protected final ClientTransportFactory buildTransportFactory() {
|
||||||
return new CronetTransportFactory(
|
return new CronetTransportFactory(
|
||||||
new TaggingStreamFactory(
|
new TaggingStreamFactory(
|
||||||
cronetEngine, trafficStatsTagSet, trafficStatsTag, trafficStatsUidSet, trafficStatsUid),
|
cronetEngine, trafficStatsTagSet, trafficStatsTag, trafficStatsUidSet, trafficStatsUid),
|
||||||
MoreExecutors.directExecutor(),
|
MoreExecutors.directExecutor(),
|
||||||
|
scheduledExecutorService,
|
||||||
maxMessageSize,
|
maxMessageSize,
|
||||||
alwaysUsePut,
|
alwaysUsePut,
|
||||||
transportTracerFactory.create());
|
transportTracerFactory.create());
|
||||||
|
|
@ -180,20 +202,24 @@ public final class CronetChannelBuilder extends
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static class CronetTransportFactory implements ClientTransportFactory {
|
static class CronetTransportFactory implements ClientTransportFactory {
|
||||||
private final ScheduledExecutorService timeoutService =
|
private final ScheduledExecutorService timeoutService;
|
||||||
SharedResourceHolder.get(GrpcUtil.TIMER_SERVICE);
|
|
||||||
private final Executor executor;
|
private final Executor executor;
|
||||||
private final int maxMessageSize;
|
private final int maxMessageSize;
|
||||||
private final boolean alwaysUsePut;
|
private final boolean alwaysUsePut;
|
||||||
private final StreamBuilderFactory streamFactory;
|
private final StreamBuilderFactory streamFactory;
|
||||||
private final TransportTracer transportTracer;
|
private final TransportTracer transportTracer;
|
||||||
|
private final boolean usingSharedScheduler;
|
||||||
|
|
||||||
private CronetTransportFactory(
|
private CronetTransportFactory(
|
||||||
StreamBuilderFactory streamFactory,
|
StreamBuilderFactory streamFactory,
|
||||||
Executor executor,
|
Executor executor,
|
||||||
|
@Nullable ScheduledExecutorService timeoutService,
|
||||||
int maxMessageSize,
|
int maxMessageSize,
|
||||||
boolean alwaysUsePut,
|
boolean alwaysUsePut,
|
||||||
TransportTracer transportTracer) {
|
TransportTracer transportTracer) {
|
||||||
|
usingSharedScheduler = timeoutService == null;
|
||||||
|
this.timeoutService = usingSharedScheduler
|
||||||
|
? SharedResourceHolder.get(GrpcUtil.TIMER_SERVICE) : timeoutService;
|
||||||
this.maxMessageSize = maxMessageSize;
|
this.maxMessageSize = maxMessageSize;
|
||||||
this.alwaysUsePut = alwaysUsePut;
|
this.alwaysUsePut = alwaysUsePut;
|
||||||
this.streamFactory = streamFactory;
|
this.streamFactory = streamFactory;
|
||||||
|
|
@ -216,9 +242,11 @@ public final class CronetChannelBuilder extends
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
if (usingSharedScheduler) {
|
||||||
SharedResourceHolder.release(GrpcUtil.TIMER_SERVICE, timeoutService);
|
SharedResourceHolder.release(GrpcUtil.TIMER_SERVICE, timeoutService);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced.
|
* StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced.
|
||||||
|
|
|
||||||
|
|
@ -16,15 +16,21 @@
|
||||||
|
|
||||||
package io.grpc.cronet;
|
package io.grpc.cronet;
|
||||||
|
|
||||||
|
import static io.grpc.internal.GrpcUtil.TIMER_SERVICE;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
import io.grpc.CallOptions;
|
import io.grpc.CallOptions;
|
||||||
import io.grpc.Metadata;
|
import io.grpc.Metadata;
|
||||||
import io.grpc.MethodDescriptor;
|
import io.grpc.MethodDescriptor;
|
||||||
import io.grpc.cronet.CronetChannelBuilder.CronetTransportFactory;
|
import io.grpc.cronet.CronetChannelBuilder.CronetTransportFactory;
|
||||||
|
import io.grpc.internal.ClientTransportFactory;
|
||||||
|
import io.grpc.internal.SharedResourceHolder;
|
||||||
import io.grpc.testing.TestMethodDescriptors;
|
import io.grpc.testing.TestMethodDescriptors;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import org.chromium.net.ExperimentalCronetEngine;
|
import org.chromium.net.ExperimentalCronetEngine;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -73,4 +79,31 @@ public final class CronetChannelBuilderTest {
|
||||||
|
|
||||||
assertFalse(stream.idempotent);
|
assertFalse(stream.idempotent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void scheduledExecutorService_default() {
|
||||||
|
CronetChannelBuilder builder = CronetChannelBuilder.forAddress("address", 1234, mockEngine);
|
||||||
|
ClientTransportFactory clientTransportFactory = builder.buildTransportFactory();
|
||||||
|
assertSame(
|
||||||
|
SharedResourceHolder.get(TIMER_SERVICE),
|
||||||
|
clientTransportFactory.getScheduledExecutorService());
|
||||||
|
|
||||||
|
SharedResourceHolder.release(
|
||||||
|
TIMER_SERVICE, clientTransportFactory.getScheduledExecutorService());
|
||||||
|
clientTransportFactory.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void scheduledExecutorService_custom() {
|
||||||
|
CronetChannelBuilder builder = CronetChannelBuilder.forAddress("address", 1234, mockEngine);
|
||||||
|
ScheduledExecutorService scheduledExecutorService = mock(ScheduledExecutorService.class);
|
||||||
|
|
||||||
|
CronetChannelBuilder builder1 = builder.scheduledExecutorService(scheduledExecutorService);
|
||||||
|
assertSame(builder, builder1);
|
||||||
|
|
||||||
|
ClientTransportFactory clientTransportFactory = builder1.buildTransportFactory();
|
||||||
|
assertSame(scheduledExecutorService, clientTransportFactory.getScheduledExecutorService());
|
||||||
|
|
||||||
|
clientTransportFactory.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue