diff --git a/pom.xml b/pom.xml
index f92e32a3..2da45a41 100644
--- a/pom.xml
+++ b/pom.xml
@@ -174,6 +174,11 @@
${commons-logging.version}
true
+
+ net.devh
+ grpc-client-spring-boot-starter
+ 3.1.0.RELEASE
+
@@ -258,13 +263,13 @@
sign
-
-
-
- --pinentry-mode
- loopback
-
-
+
+
+
+
+
+
+
diff --git a/snail-job-client/snail-job-client-common/pom.xml b/snail-job-client/snail-job-client-common/pom.xml
index 91eb8296..d951eae9 100644
--- a/snail-job-client/snail-job-client-common/pom.xml
+++ b/snail-job-client/snail-job-client-common/pom.xml
@@ -86,6 +86,20 @@
log4j
true
+
+ net.devh
+ grpc-client-spring-boot-starter
+
+
+ io.grpc
+ grpc-netty-shaded
+ 1.63.0
+
+
+ net.devh
+ grpc-server-spring-boot-starter
+ 3.1.0.RELEASE
+
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcChannel.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcChannel.java
new file mode 100644
index 00000000..f1c47b6e
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcChannel.java
@@ -0,0 +1,196 @@
+package com.aizuda.snailjob.client.common.rpc.client;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.aizuda.snailjob.client.common.cache.GroupVersionCache;
+import com.aizuda.snailjob.client.common.config.SnailJobProperties;
+import com.aizuda.snailjob.client.common.exception.SnailJobRemoteException;
+import com.aizuda.snailjob.common.core.constant.SystemConstants;
+import com.aizuda.snailjob.common.core.context.SnailSpringContext;
+import com.aizuda.snailjob.common.core.enums.HeadersEnum;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.common.core.util.NetUtil;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.protobuf.Any;
+import com.google.protobuf.UnsafeByteOperations;
+import io.grpc.ManagedChannel;
+import io.grpc.MethodDescriptor;
+import io.grpc.protobuf.ProtoUtils;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+public final class GrpcChannel {
+
+ private static ManagedChannel channel;
+
+ public static void setChannel(ManagedChannel channel) {
+ GrpcChannel.channel = channel;
+ }
+
+ /**
+ * 服务端端口
+ */
+ private static final String SNAIL_JOB_SERVER_PORT = "snail-job.server.port";
+ /**
+ * 服务端host
+ */
+ private static final String SNAIL_JOB_SERVER_HOST = "snail-job.server.host";
+
+ /**
+ * 客户端端口
+ */
+ private static final String SNAIL_JOB_CLIENT_PORT = "snail-job.port";
+ /**
+ * 客户端host
+ */
+ private static final String SNAIL_JOB_CLIENT_HOST = "snail-job.host";
+
+ private static final String HOST_ID = IdUtil.getSnowflake().nextIdStr();
+ private static final int PORT;
+ private static final String HOST;
+
+ static {
+ PORT = Integer.parseInt(System.getProperty(SNAIL_JOB_CLIENT_PORT, String.valueOf(1789)));
+ HOST = System.getProperty(SNAIL_JOB_CLIENT_HOST, NetUtil.getLocalIpStr());
+ }
+
+ /**
+ * 获取服务端端口
+ *
+ * @return port
+ */
+ public static int getServerPort() {
+ SnailJobProperties snailJobProperties = SnailSpringContext.getContext().getBean(SnailJobProperties.class);
+ SnailJobProperties.ServerConfig serverConfig = snailJobProperties.getServer();
+
+ String port = System.getProperty(SNAIL_JOB_SERVER_PORT);
+ if (StrUtil.isBlank(port)) {
+ System.setProperty(SNAIL_JOB_SERVER_PORT, String.valueOf(serverConfig.getPort()));
+ }
+
+ return Integer.parseInt(System.getProperty(SNAIL_JOB_SERVER_PORT));
+ }
+
+ /**
+ * 获取服务端host
+ *
+ * @return host
+ */
+ public static String getServerHost() {
+ SnailJobProperties snailJobProperties = SnailSpringContext.getBean(SnailJobProperties.class);
+ SnailJobProperties.ServerConfig serverConfig = snailJobProperties.getServer();
+
+ String host = System.getProperty(SNAIL_JOB_SERVER_HOST);
+ if (StrUtil.isBlank(host)) {
+ System.setProperty(SNAIL_JOB_SERVER_HOST, serverConfig.getHost());
+ }
+
+ return System.getProperty(SNAIL_JOB_SERVER_HOST);
+ }
+
+ /**
+ * 获取指定的客户IP
+ *
+ * @return 客户端IP
+ */
+ public static String getClientHost() {
+ SnailJobProperties snailJobProperties = SnailSpringContext.getBean(SnailJobProperties.class);
+
+ String host = snailJobProperties.getHost();
+ // 获取客户端指定的IP地址
+ if (StrUtil.isBlank(host)) {
+ host = HOST;
+ }
+
+ return host;
+ }
+
+ /**
+ * 获取客户端端口
+ *
+ * @return port 端口
+ */
+ public static Integer getClientPort() {
+ SnailJobProperties snailJobProperties = SnailSpringContext.getBean(SnailJobProperties.class);
+ ServerProperties serverProperties = SnailSpringContext.getBean(ServerProperties.class);
+
+ Integer port = snailJobProperties.getPort();
+ // 获取客户端指定的端口
+ if (Objects.isNull(port)) {
+ port = Optional.ofNullable(serverProperties.getPort()).orElse(PORT);
+ }
+
+ return port;
+ }
+
+
+ public static ListenableFuture sendOfUnary(String path, String body) {
+ if (channel == null) {
+ return null;
+ }
+
+ SnailJobProperties snailJobProperties = SnailSpringContext.getBean(SnailJobProperties.class);
+
+ // server配置不能为空
+ SnailJobProperties.ServerConfig serverConfig = snailJobProperties.getServer();
+ if (Objects.isNull(serverConfig)) {
+ SnailJobLog.LOCAL.error("snail job server config is null");
+ return null;
+ }
+
+ Assert.notBlank(snailJobProperties.getGroup(),
+ () -> new SnailJobRemoteException("The group is null, please check if your configuration is correct."));
+
+ Map headersMap = new HashMap<>();
+
+ headersMap.put(HeadersEnum.HOST_ID.getKey(), HOST_ID);
+ headersMap.put(HeadersEnum.HOST_IP.getKey(), getClientHost());
+ headersMap.put(HeadersEnum.GROUP_NAME.getKey(), snailJobProperties.getGroup());
+ headersMap.put(HeadersEnum.HOST_PORT.getKey(), String.valueOf(getClientPort()));
+ headersMap.put(HeadersEnum.VERSION.getKey(), String.valueOf(GroupVersionCache.getVersion()));
+ headersMap.put(HeadersEnum.HOST.getKey(), serverConfig.getHost());
+ headersMap.put(HeadersEnum.NAMESPACE.getKey(), Optional.ofNullable(snailJobProperties.getNamespace()).orElse(
+ SystemConstants.DEFAULT_NAMESPACE));
+ headersMap.put(HeadersEnum.TOKEN.getKey(), Optional.ofNullable(snailJobProperties.getToken()).orElse(
+ SystemConstants.DEFAULT_TOKEN));
+
+ Metadata metadata = Metadata
+ .newBuilder()
+ .setUri(path)
+ .putAllHeaders(headersMap)
+ .build();
+ Any build = Any.newBuilder().setValue(UnsafeByteOperations.unsafeWrap(body.getBytes()))
+ .build();
+ GrpcSnailJobRequest snailJobRequest = GrpcSnailJobRequest
+ .newBuilder()
+ .setMetadata(metadata)
+ .setBody(build)
+ .build();
+
+ MethodDescriptor methodDescriptor =
+ MethodDescriptor.newBuilder()
+ .setType(MethodDescriptor.MethodType.UNARY)
+ .setFullMethodName(MethodDescriptor.generateFullMethodName("UnaryRequest", "unaryRequest"))
+ .setRequestMarshaller(ProtoUtils.marshaller(GrpcSnailJobRequest.getDefaultInstance()))
+ .setResponseMarshaller(ProtoUtils.marshaller(GrpcResult.getDefaultInstance()))
+ .build();
+
+ // 创建动态代理调用方法
+ return io.grpc.stub.ClientCalls.futureUnaryCall(
+ channel.newCall(methodDescriptor, io.grpc.CallOptions.DEFAULT),
+ snailJobRequest);
+ }
+
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient.java
new file mode 100644
index 00000000..89317315
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient.java
@@ -0,0 +1,36 @@
+package com.aizuda.snailjob.client.common.rpc.client;
+
+import com.aizuda.snailjob.client.common.Lifecycle;
+import com.aizuda.snailjob.client.common.config.SnailJobProperties;
+import com.aizuda.snailjob.client.common.config.SnailJobProperties.ServerConfig;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import lombok.RequiredArgsConstructor;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+@Component
+@RequiredArgsConstructor
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class GrpcClient implements Lifecycle {
+ private final SnailJobProperties snailJobProperties;
+ @Override
+ public void start() {
+ // 创建 gRPC 频道
+ ServerConfig server = snailJobProperties.getServer();
+ ManagedChannel channel = ManagedChannelBuilder.forAddress(server.getHost(), server.getPort())
+ .usePlaintext()
+ .build();
+ GrpcChannel.setChannel(channel);
+ }
+
+ @Override
+ public void close() {
+
+ }
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient2.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient2.java
new file mode 100644
index 00000000..c4440099
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClient2.java
@@ -0,0 +1,89 @@
+//package com.aizuda.snailjob.client.common.rpc.client;
+//
+//import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+//import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+//import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+//import com.google.common.util.concurrent.FutureCallback;
+//import com.google.common.util.concurrent.Futures;
+//import com.google.common.util.concurrent.ListenableFuture;
+//import com.google.protobuf.Any;
+//import com.google.protobuf.UnsafeByteOperations;
+//import io.grpc.Channel;
+//import io.grpc.ManagedChannel;
+//import io.grpc.ManagedChannelBuilder;
+//import io.grpc.MethodDescriptor;
+//import io.grpc.protobuf.ProtoUtils;
+//
+//import java.util.concurrent.LinkedBlockingDeque;
+//import java.util.concurrent.ScheduledThreadPoolExecutor;
+//import java.util.concurrent.ThreadPoolExecutor;
+//import java.util.concurrent.TimeUnit;
+//
+///**
+// * @author: shuguang.zhang
+// * @date : 2024-08-21
+// */
+//public class GrpcClient2 {
+// private final Channel channel;
+//
+// public GrpcClient2(Channel channel) {
+// this.channel = channel;
+// }
+//
+// public static void main(String[] args) {
+// // 创建 gRPC 频道
+// ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 1788)
+// .usePlaintext()
+// .build();
+//
+// // 实例化客户端
+// GrpcClient2 grpcClient = new GrpcClient2(channel);
+//
+// String s = "zsg";
+// Any build = Any.newBuilder().setValue(UnsafeByteOperations.unsafeWrap(s.getBytes())).build();
+// // 构造请求对象
+// Metadata metadata = Metadata
+// .newBuilder()
+// .setClientIp("11")
+// .setType("1")
+// .putHeaders("aa", "bb")
+// .build();
+// GrpcSnailJobRequest request = GrpcSnailJobRequest.newBuilder().setMetadata(metadata).setBody(build).build();
+//
+// // 动态调用方法并获取响应 "UnaryRequest", "unaryRequest",
+// ListenableFuture future = grpcClient.invokeMethod("unaryRequest", request);
+// ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
+// ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,2,1,TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+//// System.out.println("Response: " + response.getMessage());
+// Futures.addCallback(future, new FutureCallback() {
+// @Override
+// public void onSuccess(final GrpcResult result) {
+// System.out.println(result);
+// }
+//
+// @Override
+// public void onFailure(final Throwable t) {
+// System.out.println(t);
+// }
+// }, threadPoolExecutor);
+//
+// Futures.withTimeout(future, 5, TimeUnit.SECONDS, scheduledThreadPoolExecutor);
+// // 关闭频道
+// channel.shutdown();
+// }
+//
+// public ListenableFuture invokeMethod(String methodName, GrpcSnailJobRequest request) {
+// MethodDescriptor methodDescriptor =
+// MethodDescriptor.newBuilder()
+// .setType(MethodDescriptor.MethodType.UNARY)
+// .setFullMethodName(MethodDescriptor.generateFullMethodName("UnaryRequest", methodName))
+// .setRequestMarshaller(ProtoUtils.marshaller(GrpcSnailJobRequest.getDefaultInstance()))
+// .setResponseMarshaller(ProtoUtils.marshaller(GrpcResult.getDefaultInstance()))
+// .build();
+//
+// // 创建动态代理调用方法
+// return io.grpc.stub.ClientCalls.futureUnaryCall(
+// channel.newCall(methodDescriptor, io.grpc.CallOptions.DEFAULT),
+// request);
+// }
+//}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClientInvokeHandler.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClientInvokeHandler.java
new file mode 100644
index 00000000..1c83041c
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/GrpcClientInvokeHandler.java
@@ -0,0 +1,104 @@
+package com.aizuda.snailjob.client.common.rpc.client;
+
+import cn.hutool.core.date.StopWatch;
+import com.aizuda.snailjob.client.common.annotation.Mapping;
+import com.aizuda.snailjob.client.common.exception.SnailJobClientTimeOutException;
+import com.aizuda.snailjob.common.core.enums.HeadersEnum;
+import com.aizuda.snailjob.common.core.enums.StatusEnum;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.common.core.model.NettyResult;
+import com.aizuda.snailjob.common.core.model.Result;
+import com.aizuda.snailjob.common.core.util.JsonUtil;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.protobuf.Any;
+import com.google.protobuf.UnsafeByteOperations;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Consumer;
+
+/**
+ * 请求处理器
+ *
+ * @author: opensnail
+ * @date : 2023-05-11 21:45
+ * @since 1.3.0
+ */
+public class GrpcClientInvokeHandler> implements InvocationHandler {
+ private final Consumer consumer;
+ private final boolean async;
+ private final long timeout;
+ private final TimeUnit unit;
+ private static final ExecutorService executorService = Executors.newFixedThreadPool(10);
+ private static final ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(1);
+ public GrpcClientInvokeHandler(boolean async, long timeout, TimeUnit unit, Consumer consumer) {
+ this.consumer = consumer;
+ this.async = async;
+ this.timeout = timeout;
+ this.unit = unit;
+ }
+
+ @Override
+ public R invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
+ StopWatch sw = new StopWatch();
+ Mapping annotation = method.getAnnotation(Mapping.class);
+
+ ListenableFuture future = GrpcChannel.sendOfUnary(annotation.path(), JsonUtil.toJsonString(args));
+ SnailJobLog.LOCAL.debug("request complete requestId:[{}] 耗时:[{}ms]", sw.getTotalTimeMillis());
+
+ if (async) {
+ if (future == null) {
+ return null;
+ }
+
+ Futures.addCallback(future, new FutureCallback<>() {
+
+ @Override
+ public void onSuccess(final GrpcResult result) {
+
+ ByteBuffer byteBuffer = result.getData().getValue().asReadOnlyByteBuffer();
+ String str = JsonUtil.parseObject(new ByteBufferBackedInputStream(byteBuffer), String.class);
+ consumer.accept((R) new NettyResult(result.getStatus(), result.getMessage(), str, 0));
+ }
+
+ @Override
+ public void onFailure(final Throwable t) {
+ consumer.accept((R) new NettyResult(StatusEnum.NO.getStatus(), t.getMessage(), null, 1));
+ }
+ }, executorService);
+
+ Futures.withTimeout(future, timeout, unit, schedule);
+ return null;
+ } else {
+
+ try {
+ GrpcResult result = future.get(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
+ ByteBuffer byteBuffer = result.getData().getValue().asReadOnlyByteBuffer();
+ String str = JsonUtil.parseObject(new ByteBufferBackedInputStream(byteBuffer), String.class);
+ return (R) new Result(result.getStatus(), result.getMessage(), str);
+ } catch (ExecutionException e) {
+ throw e.getCause();
+ } catch (TimeoutException e) {
+ throw new SnailJobClientTimeOutException("Request to remote interface timed out. path:[{}]", annotation.path());
+ }
+ }
+
+ }
+
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/RequestBuilder.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/RequestBuilder.java
index 2529797b..f1e82d1c 100644
--- a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/RequestBuilder.java
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/client/RequestBuilder.java
@@ -67,10 +67,10 @@ public class RequestBuilder> {
throw new SnailJobClientException("class not found exception to: [{}]", clintInterface.getName());
}
- RpcClientInvokeHandler rpcClientInvokeHandler = new RpcClientInvokeHandler<>(async, timeout, unit, callback);
-
+// RpcClientInvokeHandler rpcClientInvokeHandler = new RpcClientInvokeHandler<>(async, timeout, unit, callback);
+ GrpcClientInvokeHandler invokeHandler = new GrpcClientInvokeHandler(async, timeout, unit, callback);
return (T) Proxy.newProxyInstance(clintInterface.getClassLoader(),
- new Class[]{clintInterface}, rpcClientInvokeHandler);
+ new Class[]{clintInterface}, invokeHandler);
}
}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcInterceptor.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcInterceptor.java
new file mode 100644
index 00000000..e02b2b2a
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcInterceptor.java
@@ -0,0 +1,33 @@
+package com.aizuda.snailjob.client.common.rpc.server;
+
+import io.grpc.Context;
+import io.grpc.Contexts;
+import io.grpc.Metadata;
+import io.grpc.ServerCall;
+import io.grpc.ServerCall.Listener;
+import io.grpc.ServerCallHandler;
+import io.grpc.ServerInterceptor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+@Slf4j
+public class GrpcInterceptor implements ServerInterceptor {
+
+ @Override
+ public Listener interceptCall(final ServerCall serverCall, final Metadata metadata,
+ final ServerCallHandler serverCallHandler) {
+ String fullMethodName = serverCall.getMethodDescriptor().getFullMethodName();
+ long start = System.currentTimeMillis();
+ Context context = Context.current();
+
+ try {
+ return Contexts.interceptCall(context, serverCall, metadata, serverCallHandler);
+ } finally {
+ log.info("method invoked: {} cast:{}ms", fullMethodName, System.currentTimeMillis() - start);
+ }
+ }
+
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcServerConsumerConfig.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcServerConsumerConfig.java
new file mode 100644
index 00000000..5b706923
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/GrpcServerConsumerConfig.java
@@ -0,0 +1,65 @@
+package com.aizuda.snailjob.client.common.rpc.server;
+
+import com.aizuda.snailjob.client.common.config.SnailJobProperties;
+import com.aizuda.snailjob.client.common.config.SnailJobProperties.DispatcherThreadPool;
+import com.aizuda.snailjob.client.common.rpc.supports.handler.SnailDispatcherRequestHandler;
+import com.aizuda.snailjob.client.common.rpc.supports.handler.UnaryRequestHandler;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import io.grpc.MethodDescriptor;
+import io.grpc.ServerBuilder;
+import io.grpc.ServerCallHandler;
+import io.grpc.ServerServiceDefinition;
+import io.grpc.protobuf.ProtoUtils;
+import io.grpc.stub.ServerCalls;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.server.serverfactory.GrpcServerConfigurer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@RequiredArgsConstructor
+public class GrpcServerConsumerConfig implements GrpcServerConfigurer {
+ private final SnailDispatcherRequestHandler handler;
+ private final SnailJobProperties snailJobProperties;
+
+ @Override
+ public void accept(ServerBuilder> serverBuilder) {
+ DispatcherThreadPool threadPool = snailJobProperties.getDispatcherThreadPool();
+ ThreadPoolExecutor dispatcherThreadPool = new ThreadPoolExecutor(
+ threadPool.getCorePoolSize(), threadPool.getMaximumPoolSize(), threadPool.getKeepAliveTime(),
+ threadPool.getTimeUnit(), new LinkedBlockingQueue<>(threadPool.getQueueCapacity()),
+ new CustomizableThreadFactory("snail-grpc-server-"));
+
+ // 创建服务定义
+ ServerServiceDefinition serviceDefinition = createServiceDefinition(
+ "UnaryRequest", "unaryRequest",
+ new UnaryRequestHandler(dispatcherThreadPool, handler));
+ serverBuilder.addService(serviceDefinition);
+ serverBuilder.intercept(new GrpcInterceptor());
+ }
+
+ public static ServerServiceDefinition createServiceDefinition(
+ String serviceName,
+ String methodName,
+ ServerCalls.UnaryMethod unaryMethod) {
+
+ MethodDescriptor methodDescriptor =
+ MethodDescriptor.newBuilder()
+ .setType(MethodDescriptor.MethodType.UNARY)
+ .setFullMethodName(MethodDescriptor.generateFullMethodName(serviceName, methodName))
+ .setRequestMarshaller(ProtoUtils.marshaller(GrpcSnailJobRequest.getDefaultInstance()))
+ .setResponseMarshaller(ProtoUtils.marshaller(GrpcResult.getDefaultInstance()))
+ .build();
+
+ ServerCallHandler callHandler = ServerCalls.asyncUnaryCall(unaryMethod);
+
+ return ServerServiceDefinition.builder(serviceName)
+ .addMethod(methodDescriptor, callHandler)
+ .build();
+ }
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/SnailNettyHttpServer.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/SnailNettyHttpServer.java
index dd24c992..d9260a1c 100644
--- a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/SnailNettyHttpServer.java
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/server/SnailNettyHttpServer.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
* @date : 2024-04-12 23:03
* @since 3.3.0
*/
-@Component
+//@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@RequiredArgsConstructor
@Getter
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/GrpcRequest.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/GrpcRequest.java
new file mode 100644
index 00000000..a7af771e
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/GrpcRequest.java
@@ -0,0 +1,26 @@
+package com.aizuda.snailjob.client.common.rpc.supports.handler;
+
+
+import com.aizuda.snailjob.client.common.rpc.supports.http.HttpRequest;
+import com.aizuda.snailjob.client.common.rpc.supports.http.HttpResponse;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import io.grpc.stub.StreamObserver;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * netty客户端请求模型
+ *
+ * @author: opensnail
+ * @date : 2023-07-24 09:32
+ */
+@Data
+@Builder
+public class GrpcRequest {
+
+ private GrpcSnailJobRequest snailJobRequest;
+ private final HttpResponse httpResponse;
+ private final HttpRequest httpRequest;
+
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/NettyHttpServerHandler.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/NettyHttpServerHandler.java
index d0bfa0f5..651fdb29 100644
--- a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/NettyHttpServerHandler.java
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/NettyHttpServerHandler.java
@@ -14,7 +14,9 @@ import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
+import java.util.HashMap;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -46,6 +48,12 @@ public class NettyHttpServerHandler extends SimpleChannelInboundHandler headerMap = new HashMap<>();
+
+ for (final Entry header : headers) {
+ headerMap.put(header.getKey(), header.getValue());
+ }
+
String uri = fullHttpRequest.uri();
NettyHttpRequest nettyHttpRequest = NettyHttpRequest.builder()
.keepAlive(HttpUtil.isKeepAlive(fullHttpRequest))
@@ -55,7 +63,7 @@ public class NettyHttpServerHandler extends SimpleChannelInboundHandler handlerInterceptors = handlerInterceptors();
+
+ GrpcSnailJobRequest snailJobRequest = request.getSnailJobRequest();
+ EndPointInfo endPointInfo = null;
+ Result resultObj = null;
+ Exception e = null;
+ try {
+ Metadata metadata = snailJobRequest.getMetadata();
+ Map headersMap = metadata.getHeadersMap();
+ String snailJobAuth = headersMap.get(SystemConstants.SNAIL_JOB_AUTH_TOKEN);
+ String configToken = Optional.ofNullable(snailJobProperties.getToken()).orElse(SystemConstants.DEFAULT_TOKEN);
+ if (!configToken.equals(snailJobAuth)) {
+ throw new SnailJobClientException("认证失败.【请检查配置的Token是否正确】");
+ }
+
+ UrlBuilder builder = UrlBuilder.ofHttp(httpRequest.getUri());
+ endPointInfo = EndPointInfoCache.get(builder.getPathStr(), RequestMethod.POST);
+ if (Objects.isNull(endPointInfo)) {
+ throw new SnailJobClientException("无法找到对应的处理请检查对应的包是否正确引入. " +
+ "path:[{}] requestMethod:[{}]", builder.getPathStr());
+ }
+
+ Class>[] paramTypes = endPointInfo.getMethod().getParameterTypes();
+ GrpcSnailJobRequest grpcSnailJobRequest = request.getSnailJobRequest();
+ Any body = grpcSnailJobRequest.getBody();
+ ByteBuffer byteBuffer = body.getValue().asReadOnlyByteBuffer();
+ Object[] args = JsonUtil.parseObject(new ByteBufferBackedInputStream(byteBuffer), Object[].class);
+
+ Object[] deSerialize = (Object[]) deSerialize(JsonUtil.toJsonString(args), endPointInfo.getMethod(),
+ httpRequest, httpResponse);
+
+ for (final HandlerInterceptor handlerInterceptor : handlerInterceptors) {
+ if (!handlerInterceptor.preHandle(httpRequest, httpResponse, endPointInfo)) {
+ return nettyResult;
+ }
+ }
+
+ if (paramTypes.length > 0) {
+ resultObj = (Result) ReflectionUtils.invokeMethod(endPointInfo.getMethod(),
+ endPointInfo.getExecutor(), deSerialize);
+ } else {
+ resultObj = (Result) ReflectionUtils.invokeMethod(endPointInfo.getMethod(),
+ endPointInfo.getExecutor());
+ }
+
+ for (final HandlerInterceptor handlerInterceptor : handlerInterceptors) {
+ handlerInterceptor.postHandle(httpRequest, httpResponse, endPointInfo);
+ }
+ } catch (Exception ex) {
+ SnailJobLog.LOCAL.error("http request error. [{}]", snailJobRequest, ex);
+ nettyResult.setMessage(ex.getMessage()).setStatus(StatusEnum.NO.getStatus());
+ e = ex;
+ } finally {
+ nettyResult.setReqId(0);
+ if (Objects.nonNull(resultObj)) {
+ nettyResult.setData(resultObj.getData())
+ .setMessage(resultObj.getMessage())
+ .setStatus(resultObj.getStatus());
+ }
+
+ for (final HandlerInterceptor handlerInterceptor : handlerInterceptors) {
+ handlerInterceptor.afterCompletion(httpRequest, httpResponse, endPointInfo, e);
+ }
+ }
+
+ return nettyResult;
+ }
+
private static List handlerInterceptors() {
List handlerInterceptors = ServiceLoaderUtil.loadList(HandlerInterceptor.class);
if (CollUtil.isEmpty(handlerInterceptors)) {
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/UnaryRequestHandler.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/UnaryRequestHandler.java
new file mode 100644
index 00000000..bc4dc22a
--- /dev/null
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/handler/UnaryRequestHandler.java
@@ -0,0 +1,70 @@
+package com.aizuda.snailjob.client.common.rpc.supports.handler;
+
+import cn.hutool.core.util.StrUtil;
+import com.aizuda.snailjob.client.common.rpc.supports.http.HttpRequest;
+import com.aizuda.snailjob.client.common.rpc.supports.http.HttpResponse;
+import com.aizuda.snailjob.common.core.enums.StatusEnum;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.common.core.model.NettyResult;
+import com.aizuda.snailjob.common.core.model.SnailJobRequest;
+import com.aizuda.snailjob.common.core.util.JsonUtil;
+import com.google.protobuf.Any;
+import com.google.protobuf.UnsafeByteOperations;
+import io.grpc.stub.ServerCalls;
+import io.grpc.stub.StreamObserver;
+import io.netty.handler.codec.http.HttpUtil;
+
+import java.util.Optional;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+public class UnaryRequestHandler implements ServerCalls.UnaryMethod{
+
+
+ private final ThreadPoolExecutor threadPoolExecutor;
+ private final SnailDispatcherRequestHandler dispatcher;
+ public UnaryRequestHandler(final ThreadPoolExecutor dispatcherThreadPool,
+ final SnailDispatcherRequestHandler handler) {
+ this.threadPoolExecutor = dispatcherThreadPool;
+ this.dispatcher = handler;
+ }
+
+ @Override
+ public void invoke(final GrpcSnailJobRequest snailJobRequest, final StreamObserver streamObserver) {
+
+ Metadata metadata = snailJobRequest.getMetadata();
+
+ GrpcRequest grpcRequest = GrpcRequest.builder()
+ .httpRequest(new HttpRequest( metadata.getHeadersMap(), metadata.getUri()))
+ .httpResponse(new HttpResponse())
+ .snailJobRequest(snailJobRequest)
+ .build();
+
+ // 执行任务
+ threadPoolExecutor.execute(() -> {
+ NettyResult nettyResult = null;
+ try {
+ nettyResult = dispatcher.dispatch(grpcRequest);
+ } catch (Exception e) {
+ nettyResult = new NettyResult(StatusEnum.NO.getStatus(), e.getMessage(), null, 0);
+ } finally {
+ GrpcResult grpcResult = GrpcResult.newBuilder()
+ .setStatus(nettyResult.getStatus())
+ .setMessage(Optional.ofNullable(nettyResult.getMessage()).orElse(StrUtil.EMPTY))
+ .setData(Any.newBuilder()
+ .setValue(UnsafeByteOperations.unsafeWrap(JsonUtil.toJsonString(nettyResult.getData()).getBytes()))
+ .build())
+ .build();
+
+ streamObserver.onNext(grpcResult);
+ streamObserver.onCompleted();
+ }
+ });
+
+ }
+}
diff --git a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/http/HttpRequest.java b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/http/HttpRequest.java
index 6ff13d35..abb7cea0 100644
--- a/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/http/HttpRequest.java
+++ b/snail-job-client/snail-job-client-common/src/main/java/com/aizuda/snailjob/client/common/rpc/supports/http/HttpRequest.java
@@ -1,8 +1,9 @@
package com.aizuda.snailjob.client.common.rpc.supports.http;
-import io.netty.handler.codec.http.HttpHeaders;
import lombok.Data;
+import java.util.Map;
+
/**
* @author: opensnail
* @date : 2024-04-12
@@ -10,10 +11,10 @@ import lombok.Data;
*/
@Data
public class HttpRequest {
- private final HttpHeaders headers;
+ private final Map headers;
private final String uri;
- public HttpRequest(HttpHeaders headers, String uri) {
+ public HttpRequest(Map headers, String uri) {
this.headers = headers;
this.uri = uri;
}
diff --git a/snail-job-common/snail-job-common-core/pom.xml b/snail-job-common/snail-job-common-core/pom.xml
index 30db4b0d..6a778025 100644
--- a/snail-job-common/snail-job-common-core/pom.xml
+++ b/snail-job-common/snail-job-common-core/pom.xml
@@ -69,10 +69,69 @@
io.netty
netty-common
+
+
+ io.grpc
+ grpc-protobuf
+ 1.63.0
+
+
+
+ io.grpc
+ grpc-stub
+ 1.63.0
+
+
+
+ com.google.protobuf
+ protobuf-java
+ 3.25.4
+
+
+ com.google.api.grpc
+ proto-google-common-protos
+ 2.43.0
+
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3.2
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.6.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResult.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResult.java
new file mode 100644
index 00000000..424a141d
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResult.java
@@ -0,0 +1,800 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+/**
+ * Protobuf type {@code GrpcResult}
+ */
+public final class GrpcResult extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:GrpcResult)
+ GrpcResultOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use GrpcResult.newBuilder() to construct.
+ private GrpcResult(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private GrpcResult() {
+ message_ = "";
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new GrpcResult();
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcResult_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcResult_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.class, com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.Builder.class);
+ }
+
+ private int bitField0_;
+ public static final int STATUS_FIELD_NUMBER = 1;
+ private int status_ = 0;
+ /**
+ * int32 status = 1;
+ * @return The status.
+ */
+ @java.lang.Override
+ public int getStatus() {
+ return status_;
+ }
+
+ public static final int MESSAGE_FIELD_NUMBER = 2;
+ @SuppressWarnings("serial")
+ private volatile java.lang.Object message_ = "";
+ /**
+ * string message = 2;
+ * @return The message.
+ */
+ @java.lang.Override
+ public java.lang.String getMessage() {
+ java.lang.Object ref = message_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ message_ = s;
+ return s;
+ }
+ }
+ /**
+ * string message = 2;
+ * @return The bytes for message.
+ */
+ @java.lang.Override
+ public com.google.protobuf.ByteString
+ getMessageBytes() {
+ java.lang.Object ref = message_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ message_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int DATA_FIELD_NUMBER = 3;
+ private com.google.protobuf.Any data_;
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return Whether the data field is set.
+ */
+ @java.lang.Override
+ public boolean hasData() {
+ return ((bitField0_ & 0x00000001) != 0);
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return The data.
+ */
+ @java.lang.Override
+ public com.google.protobuf.Any getData() {
+ return data_ == null ? com.google.protobuf.Any.getDefaultInstance() : data_;
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ @java.lang.Override
+ public com.google.protobuf.AnyOrBuilder getDataOrBuilder() {
+ return data_ == null ? com.google.protobuf.Any.getDefaultInstance() : data_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (status_ != 0) {
+ output.writeInt32(1, status_);
+ }
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 2, message_);
+ }
+ if (((bitField0_ & 0x00000001) != 0)) {
+ output.writeMessage(3, getData());
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (status_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(1, status_);
+ }
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, message_);
+ }
+ if (((bitField0_ & 0x00000001) != 0)) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(3, getData());
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof com.aizuda.snailjob.common.core.grpc.auto.GrpcResult)) {
+ return super.equals(obj);
+ }
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult other = (com.aizuda.snailjob.common.core.grpc.auto.GrpcResult) obj;
+
+ if (getStatus()
+ != other.getStatus()) return false;
+ if (!getMessage()
+ .equals(other.getMessage())) return false;
+ if (hasData() != other.hasData()) return false;
+ if (hasData()) {
+ if (!getData()
+ .equals(other.getData())) return false;
+ }
+ if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + STATUS_FIELD_NUMBER;
+ hash = (53 * hash) + getStatus();
+ hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+ hash = (53 * hash) + getMessage().hashCode();
+ if (hasData()) {
+ hash = (37 * hash) + DATA_FIELD_NUMBER;
+ hash = (53 * hash) + getData().hashCode();
+ }
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(com.aizuda.snailjob.common.core.grpc.auto.GrpcResult prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code GrpcResult}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:GrpcResult)
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResultOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcResult_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcResult_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.class, com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.Builder.class);
+ }
+
+ // Construct using com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ getDataFieldBuilder();
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ status_ = 0;
+ message_ = "";
+ data_ = null;
+ if (dataBuilder_ != null) {
+ dataBuilder_.dispose();
+ dataBuilder_ = null;
+ }
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcResult_descriptor;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcResult getDefaultInstanceForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcResult build() {
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcResult buildPartial() {
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult result = new com.aizuda.snailjob.common.core.grpc.auto.GrpcResult(this);
+ if (bitField0_ != 0) { buildPartial0(result); }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(com.aizuda.snailjob.common.core.grpc.auto.GrpcResult result) {
+ int from_bitField0_ = bitField0_;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.status_ = status_;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.message_ = message_;
+ }
+ int to_bitField0_ = 0;
+ if (((from_bitField0_ & 0x00000004) != 0)) {
+ result.data_ = dataBuilder_ == null
+ ? data_
+ : dataBuilder_.build();
+ to_bitField0_ |= 0x00000001;
+ }
+ result.bitField0_ |= to_bitField0_;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof com.aizuda.snailjob.common.core.grpc.auto.GrpcResult) {
+ return mergeFrom((com.aizuda.snailjob.common.core.grpc.auto.GrpcResult)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(com.aizuda.snailjob.common.core.grpc.auto.GrpcResult other) {
+ if (other == com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.getDefaultInstance()) return this;
+ if (other.getStatus() != 0) {
+ setStatus(other.getStatus());
+ }
+ if (!other.getMessage().isEmpty()) {
+ message_ = other.message_;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ }
+ if (other.hasData()) {
+ mergeData(other.getData());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 8: {
+ status_ = input.readInt32();
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 8
+ case 18: {
+ message_ = input.readStringRequireUtf8();
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 18
+ case 26: {
+ input.readMessage(
+ getDataFieldBuilder().getBuilder(),
+ extensionRegistry);
+ bitField0_ |= 0x00000004;
+ break;
+ } // case 26
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+ private int bitField0_;
+
+ private int status_ ;
+ /**
+ * int32 status = 1;
+ * @return The status.
+ */
+ @java.lang.Override
+ public int getStatus() {
+ return status_;
+ }
+ /**
+ * int32 status = 1;
+ * @param value The status to set.
+ * @return This builder for chaining.
+ */
+ public Builder setStatus(int value) {
+
+ status_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 status = 1;
+ * @return This builder for chaining.
+ */
+ public Builder clearStatus() {
+ bitField0_ = (bitField0_ & ~0x00000001);
+ status_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private java.lang.Object message_ = "";
+ /**
+ * string message = 2;
+ * @return The message.
+ */
+ public java.lang.String getMessage() {
+ java.lang.Object ref = message_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ message_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * string message = 2;
+ * @return The bytes for message.
+ */
+ public com.google.protobuf.ByteString
+ getMessageBytes() {
+ java.lang.Object ref = message_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ message_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * string message = 2;
+ * @param value The message to set.
+ * @return This builder for chaining.
+ */
+ public Builder setMessage(
+ java.lang.String value) {
+ if (value == null) { throw new NullPointerException(); }
+ message_ = value;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+ /**
+ * string message = 2;
+ * @return This builder for chaining.
+ */
+ public Builder clearMessage() {
+ message_ = getDefaultInstance().getMessage();
+ bitField0_ = (bitField0_ & ~0x00000002);
+ onChanged();
+ return this;
+ }
+ /**
+ * string message = 2;
+ * @param value The bytes for message to set.
+ * @return This builder for chaining.
+ */
+ public Builder setMessageBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) { throw new NullPointerException(); }
+ checkByteStringIsUtf8(value);
+ message_ = value;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.Any data_;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder> dataBuilder_;
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return Whether the data field is set.
+ */
+ public boolean hasData() {
+ return ((bitField0_ & 0x00000004) != 0);
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return The data.
+ */
+ public com.google.protobuf.Any getData() {
+ if (dataBuilder_ == null) {
+ return data_ == null ? com.google.protobuf.Any.getDefaultInstance() : data_;
+ } else {
+ return dataBuilder_.getMessage();
+ }
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public Builder setData(com.google.protobuf.Any value) {
+ if (dataBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ data_ = value;
+ } else {
+ dataBuilder_.setMessage(value);
+ }
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public Builder setData(
+ com.google.protobuf.Any.Builder builderForValue) {
+ if (dataBuilder_ == null) {
+ data_ = builderForValue.build();
+ } else {
+ dataBuilder_.setMessage(builderForValue.build());
+ }
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public Builder mergeData(com.google.protobuf.Any value) {
+ if (dataBuilder_ == null) {
+ if (((bitField0_ & 0x00000004) != 0) &&
+ data_ != null &&
+ data_ != com.google.protobuf.Any.getDefaultInstance()) {
+ getDataBuilder().mergeFrom(value);
+ } else {
+ data_ = value;
+ }
+ } else {
+ dataBuilder_.mergeFrom(value);
+ }
+ if (data_ != null) {
+ bitField0_ |= 0x00000004;
+ onChanged();
+ }
+ return this;
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public Builder clearData() {
+ bitField0_ = (bitField0_ & ~0x00000004);
+ data_ = null;
+ if (dataBuilder_ != null) {
+ dataBuilder_.dispose();
+ dataBuilder_ = null;
+ }
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public com.google.protobuf.Any.Builder getDataBuilder() {
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return getDataFieldBuilder().getBuilder();
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ public com.google.protobuf.AnyOrBuilder getDataOrBuilder() {
+ if (dataBuilder_ != null) {
+ return dataBuilder_.getMessageOrBuilder();
+ } else {
+ return data_ == null ?
+ com.google.protobuf.Any.getDefaultInstance() : data_;
+ }
+ }
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>
+ getDataFieldBuilder() {
+ if (dataBuilder_ == null) {
+ dataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>(
+ getData(),
+ getParentForChildren(),
+ isClean());
+ data_ = null;
+ }
+ return dataBuilder_;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:GrpcResult)
+ }
+
+ // @@protoc_insertion_point(class_scope:GrpcResult)
+ private static final com.aizuda.snailjob.common.core.grpc.auto.GrpcResult DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new com.aizuda.snailjob.common.core.grpc.auto.GrpcResult();
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcResult getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public GrpcResult parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e)
+ .setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcResult getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResultOrBuilder.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResultOrBuilder.java
new file mode 100644
index 00000000..1320a1f1
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcResultOrBuilder.java
@@ -0,0 +1,42 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+public interface GrpcResultOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:GrpcResult)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * int32 status = 1;
+ * @return The status.
+ */
+ int getStatus();
+
+ /**
+ * string message = 2;
+ * @return The message.
+ */
+ java.lang.String getMessage();
+ /**
+ * string message = 2;
+ * @return The bytes for message.
+ */
+ com.google.protobuf.ByteString
+ getMessageBytes();
+
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return Whether the data field is set.
+ */
+ boolean hasData();
+ /**
+ * .google.protobuf.Any data = 3;
+ * @return The data.
+ */
+ com.google.protobuf.Any getData();
+ /**
+ * .google.protobuf.Any data = 3;
+ */
+ com.google.protobuf.AnyOrBuilder getDataOrBuilder();
+}
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequest.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequest.java
new file mode 100644
index 00000000..2534320a
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequest.java
@@ -0,0 +1,783 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+/**
+ * Protobuf type {@code GrpcSnailJobRequest}
+ */
+public final class GrpcSnailJobRequest extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:GrpcSnailJobRequest)
+ GrpcSnailJobRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use GrpcSnailJobRequest.newBuilder() to construct.
+ private GrpcSnailJobRequest(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private GrpcSnailJobRequest() {
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new GrpcSnailJobRequest();
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcSnailJobRequest_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcSnailJobRequest_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.class, com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.Builder.class);
+ }
+
+ private int bitField0_;
+ public static final int METADATA_FIELD_NUMBER = 2;
+ private com.aizuda.snailjob.common.core.grpc.auto.Metadata metadata_;
+ /**
+ * .Metadata metadata = 2;
+ * @return Whether the metadata field is set.
+ */
+ @java.lang.Override
+ public boolean hasMetadata() {
+ return ((bitField0_ & 0x00000001) != 0);
+ }
+ /**
+ * .Metadata metadata = 2;
+ * @return The metadata.
+ */
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata getMetadata() {
+ return metadata_ == null ? com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance() : metadata_;
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder getMetadataOrBuilder() {
+ return metadata_ == null ? com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance() : metadata_;
+ }
+
+ public static final int BODY_FIELD_NUMBER = 3;
+ private com.google.protobuf.Any body_;
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return Whether the body field is set.
+ */
+ @java.lang.Override
+ public boolean hasBody() {
+ return ((bitField0_ & 0x00000002) != 0);
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return The body.
+ */
+ @java.lang.Override
+ public com.google.protobuf.Any getBody() {
+ return body_ == null ? com.google.protobuf.Any.getDefaultInstance() : body_;
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ @java.lang.Override
+ public com.google.protobuf.AnyOrBuilder getBodyOrBuilder() {
+ return body_ == null ? com.google.protobuf.Any.getDefaultInstance() : body_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (((bitField0_ & 0x00000001) != 0)) {
+ output.writeMessage(2, getMetadata());
+ }
+ if (((bitField0_ & 0x00000002) != 0)) {
+ output.writeMessage(3, getBody());
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (((bitField0_ & 0x00000001) != 0)) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(2, getMetadata());
+ }
+ if (((bitField0_ & 0x00000002) != 0)) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(3, getBody());
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest)) {
+ return super.equals(obj);
+ }
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest other = (com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest) obj;
+
+ if (hasMetadata() != other.hasMetadata()) return false;
+ if (hasMetadata()) {
+ if (!getMetadata()
+ .equals(other.getMetadata())) return false;
+ }
+ if (hasBody() != other.hasBody()) return false;
+ if (hasBody()) {
+ if (!getBody()
+ .equals(other.getBody())) return false;
+ }
+ if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ if (hasMetadata()) {
+ hash = (37 * hash) + METADATA_FIELD_NUMBER;
+ hash = (53 * hash) + getMetadata().hashCode();
+ }
+ if (hasBody()) {
+ hash = (37 * hash) + BODY_FIELD_NUMBER;
+ hash = (53 * hash) + getBody().hashCode();
+ }
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code GrpcSnailJobRequest}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:GrpcSnailJobRequest)
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequestOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcSnailJobRequest_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcSnailJobRequest_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.class, com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.Builder.class);
+ }
+
+ // Construct using com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.newBuilder()
+ private Builder() {
+ maybeForceBuilderInitialization();
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+ maybeForceBuilderInitialization();
+ }
+ private void maybeForceBuilderInitialization() {
+ if (com.google.protobuf.GeneratedMessageV3
+ .alwaysUseFieldBuilders) {
+ getMetadataFieldBuilder();
+ getBodyFieldBuilder();
+ }
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ metadata_ = null;
+ if (metadataBuilder_ != null) {
+ metadataBuilder_.dispose();
+ metadataBuilder_ = null;
+ }
+ body_ = null;
+ if (bodyBuilder_ != null) {
+ bodyBuilder_.dispose();
+ bodyBuilder_ = null;
+ }
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_GrpcSnailJobRequest_descriptor;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest getDefaultInstanceForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest build() {
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest buildPartial() {
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest result = new com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest(this);
+ if (bitField0_ != 0) { buildPartial0(result); }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest result) {
+ int from_bitField0_ = bitField0_;
+ int to_bitField0_ = 0;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.metadata_ = metadataBuilder_ == null
+ ? metadata_
+ : metadataBuilder_.build();
+ to_bitField0_ |= 0x00000001;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.body_ = bodyBuilder_ == null
+ ? body_
+ : bodyBuilder_.build();
+ to_bitField0_ |= 0x00000002;
+ }
+ result.bitField0_ |= to_bitField0_;
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest) {
+ return mergeFrom((com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest other) {
+ if (other == com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.getDefaultInstance()) return this;
+ if (other.hasMetadata()) {
+ mergeMetadata(other.getMetadata());
+ }
+ if (other.hasBody()) {
+ mergeBody(other.getBody());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 18: {
+ input.readMessage(
+ getMetadataFieldBuilder().getBuilder(),
+ extensionRegistry);
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 18
+ case 26: {
+ input.readMessage(
+ getBodyFieldBuilder().getBuilder(),
+ extensionRegistry);
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 26
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+ private int bitField0_;
+
+ private com.aizuda.snailjob.common.core.grpc.auto.Metadata metadata_;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata, com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder, com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder> metadataBuilder_;
+ /**
+ * .Metadata metadata = 2;
+ * @return Whether the metadata field is set.
+ */
+ public boolean hasMetadata() {
+ return ((bitField0_ & 0x00000001) != 0);
+ }
+ /**
+ * .Metadata metadata = 2;
+ * @return The metadata.
+ */
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata getMetadata() {
+ if (metadataBuilder_ == null) {
+ return metadata_ == null ? com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance() : metadata_;
+ } else {
+ return metadataBuilder_.getMessage();
+ }
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public Builder setMetadata(com.aizuda.snailjob.common.core.grpc.auto.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ metadata_ = value;
+ } else {
+ metadataBuilder_.setMessage(value);
+ }
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public Builder setMetadata(
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder builderForValue) {
+ if (metadataBuilder_ == null) {
+ metadata_ = builderForValue.build();
+ } else {
+ metadataBuilder_.setMessage(builderForValue.build());
+ }
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public Builder mergeMetadata(com.aizuda.snailjob.common.core.grpc.auto.Metadata value) {
+ if (metadataBuilder_ == null) {
+ if (((bitField0_ & 0x00000001) != 0) &&
+ metadata_ != null &&
+ metadata_ != com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance()) {
+ getMetadataBuilder().mergeFrom(value);
+ } else {
+ metadata_ = value;
+ }
+ } else {
+ metadataBuilder_.mergeFrom(value);
+ }
+ if (metadata_ != null) {
+ bitField0_ |= 0x00000001;
+ onChanged();
+ }
+ return this;
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public Builder clearMetadata() {
+ bitField0_ = (bitField0_ & ~0x00000001);
+ metadata_ = null;
+ if (metadataBuilder_ != null) {
+ metadataBuilder_.dispose();
+ metadataBuilder_ = null;
+ }
+ onChanged();
+ return this;
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder getMetadataBuilder() {
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return getMetadataFieldBuilder().getBuilder();
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ public com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder getMetadataOrBuilder() {
+ if (metadataBuilder_ != null) {
+ return metadataBuilder_.getMessageOrBuilder();
+ } else {
+ return metadata_ == null ?
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance() : metadata_;
+ }
+ }
+ /**
+ * .Metadata metadata = 2;
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata, com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder, com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder>
+ getMetadataFieldBuilder() {
+ if (metadataBuilder_ == null) {
+ metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata, com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder, com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder>(
+ getMetadata(),
+ getParentForChildren(),
+ isClean());
+ metadata_ = null;
+ }
+ return metadataBuilder_;
+ }
+
+ private com.google.protobuf.Any body_;
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder> bodyBuilder_;
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return Whether the body field is set.
+ */
+ public boolean hasBody() {
+ return ((bitField0_ & 0x00000002) != 0);
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return The body.
+ */
+ public com.google.protobuf.Any getBody() {
+ if (bodyBuilder_ == null) {
+ return body_ == null ? com.google.protobuf.Any.getDefaultInstance() : body_;
+ } else {
+ return bodyBuilder_.getMessage();
+ }
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public Builder setBody(com.google.protobuf.Any value) {
+ if (bodyBuilder_ == null) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ body_ = value;
+ } else {
+ bodyBuilder_.setMessage(value);
+ }
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public Builder setBody(
+ com.google.protobuf.Any.Builder builderForValue) {
+ if (bodyBuilder_ == null) {
+ body_ = builderForValue.build();
+ } else {
+ bodyBuilder_.setMessage(builderForValue.build());
+ }
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public Builder mergeBody(com.google.protobuf.Any value) {
+ if (bodyBuilder_ == null) {
+ if (((bitField0_ & 0x00000002) != 0) &&
+ body_ != null &&
+ body_ != com.google.protobuf.Any.getDefaultInstance()) {
+ getBodyBuilder().mergeFrom(value);
+ } else {
+ body_ = value;
+ }
+ } else {
+ bodyBuilder_.mergeFrom(value);
+ }
+ if (body_ != null) {
+ bitField0_ |= 0x00000002;
+ onChanged();
+ }
+ return this;
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public Builder clearBody() {
+ bitField0_ = (bitField0_ & ~0x00000002);
+ body_ = null;
+ if (bodyBuilder_ != null) {
+ bodyBuilder_.dispose();
+ bodyBuilder_ = null;
+ }
+ onChanged();
+ return this;
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public com.google.protobuf.Any.Builder getBodyBuilder() {
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return getBodyFieldBuilder().getBuilder();
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ public com.google.protobuf.AnyOrBuilder getBodyOrBuilder() {
+ if (bodyBuilder_ != null) {
+ return bodyBuilder_.getMessageOrBuilder();
+ } else {
+ return body_ == null ?
+ com.google.protobuf.Any.getDefaultInstance() : body_;
+ }
+ }
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ private com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>
+ getBodyFieldBuilder() {
+ if (bodyBuilder_ == null) {
+ bodyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+ com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>(
+ getBody(),
+ getParentForChildren(),
+ isClean());
+ body_ = null;
+ }
+ return bodyBuilder_;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:GrpcSnailJobRequest)
+ }
+
+ // @@protoc_insertion_point(class_scope:GrpcSnailJobRequest)
+ private static final com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest();
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public GrpcSnailJobRequest parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e)
+ .setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequestOrBuilder.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequestOrBuilder.java
new file mode 100644
index 00000000..b7e10aee
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/GrpcSnailJobRequestOrBuilder.java
@@ -0,0 +1,39 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+public interface GrpcSnailJobRequestOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:GrpcSnailJobRequest)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * .Metadata metadata = 2;
+ * @return Whether the metadata field is set.
+ */
+ boolean hasMetadata();
+ /**
+ * .Metadata metadata = 2;
+ * @return The metadata.
+ */
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata getMetadata();
+ /**
+ * .Metadata metadata = 2;
+ */
+ com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder getMetadataOrBuilder();
+
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return Whether the body field is set.
+ */
+ boolean hasBody();
+ /**
+ * .google.protobuf.Any body = 3;
+ * @return The body.
+ */
+ com.google.protobuf.Any getBody();
+ /**
+ * .google.protobuf.Any body = 3;
+ */
+ com.google.protobuf.AnyOrBuilder getBodyOrBuilder();
+}
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/Metadata.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/Metadata.java
new file mode 100644
index 00000000..25c36966
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/Metadata.java
@@ -0,0 +1,1092 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+/**
+ * Protobuf type {@code Metadata}
+ */
+public final class Metadata extends
+ com.google.protobuf.GeneratedMessageV3 implements
+ // @@protoc_insertion_point(message_implements:Metadata)
+ MetadataOrBuilder {
+private static final long serialVersionUID = 0L;
+ // Use Metadata.newBuilder() to construct.
+ private Metadata(com.google.protobuf.GeneratedMessageV3.Builder> builder) {
+ super(builder);
+ }
+ private Metadata() {
+ type_ = "";
+ clientIp_ = "";
+ uri_ = "";
+ }
+
+ @java.lang.Override
+ @SuppressWarnings({"unused"})
+ protected java.lang.Object newInstance(
+ UnusedPrivateParameter unused) {
+ return new Metadata();
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_descriptor;
+ }
+
+ @SuppressWarnings({"rawtypes"})
+ @java.lang.Override
+ protected com.google.protobuf.MapField internalGetMapField(
+ int number) {
+ switch (number) {
+ case 7:
+ return internalGetHeaders();
+ default:
+ throw new RuntimeException(
+ "Invalid map field number: " + number);
+ }
+ }
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata.class, com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder.class);
+ }
+
+ public static final int TYPE_FIELD_NUMBER = 3;
+ @SuppressWarnings("serial")
+ private volatile java.lang.Object type_ = "";
+ /**
+ * string type = 3;
+ * @return The type.
+ */
+ @java.lang.Override
+ public java.lang.String getType() {
+ java.lang.Object ref = type_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ type_ = s;
+ return s;
+ }
+ }
+ /**
+ * string type = 3;
+ * @return The bytes for type.
+ */
+ @java.lang.Override
+ public com.google.protobuf.ByteString
+ getTypeBytes() {
+ java.lang.Object ref = type_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ type_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int HEADERS_FIELD_NUMBER = 7;
+ private static final class HeadersDefaultEntryHolder {
+ static final com.google.protobuf.MapEntry<
+ java.lang.String, java.lang.String> defaultEntry =
+ com.google.protobuf.MapEntry
+ .newDefaultInstance(
+ com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_HeadersEntry_descriptor,
+ com.google.protobuf.WireFormat.FieldType.STRING,
+ "",
+ com.google.protobuf.WireFormat.FieldType.STRING,
+ "");
+ }
+ @SuppressWarnings("serial")
+ private com.google.protobuf.MapField<
+ java.lang.String, java.lang.String> headers_;
+ private com.google.protobuf.MapField
+ internalGetHeaders() {
+ if (headers_ == null) {
+ return com.google.protobuf.MapField.emptyMapField(
+ HeadersDefaultEntryHolder.defaultEntry);
+ }
+ return headers_;
+ }
+ public int getHeadersCount() {
+ return internalGetHeaders().getMap().size();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public boolean containsHeaders(
+ java.lang.String key) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ return internalGetHeaders().getMap().containsKey(key);
+ }
+ /**
+ * Use {@link #getHeadersMap()} instead.
+ */
+ @java.lang.Override
+ @java.lang.Deprecated
+ public java.util.Map getHeaders() {
+ return getHeadersMap();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public java.util.Map getHeadersMap() {
+ return internalGetHeaders().getMap();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public /* nullable */
+java.lang.String getHeadersOrDefault(
+ java.lang.String key,
+ /* nullable */
+java.lang.String defaultValue) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ java.util.Map map =
+ internalGetHeaders().getMap();
+ return map.containsKey(key) ? map.get(key) : defaultValue;
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public java.lang.String getHeadersOrThrow(
+ java.lang.String key) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ java.util.Map map =
+ internalGetHeaders().getMap();
+ if (!map.containsKey(key)) {
+ throw new java.lang.IllegalArgumentException();
+ }
+ return map.get(key);
+ }
+
+ public static final int CLIENTIP_FIELD_NUMBER = 8;
+ @SuppressWarnings("serial")
+ private volatile java.lang.Object clientIp_ = "";
+ /**
+ * string clientIp = 8;
+ * @return The clientIp.
+ */
+ @java.lang.Override
+ public java.lang.String getClientIp() {
+ java.lang.Object ref = clientIp_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ clientIp_ = s;
+ return s;
+ }
+ }
+ /**
+ * string clientIp = 8;
+ * @return The bytes for clientIp.
+ */
+ @java.lang.Override
+ public com.google.protobuf.ByteString
+ getClientIpBytes() {
+ java.lang.Object ref = clientIp_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ clientIp_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int URI_FIELD_NUMBER = 9;
+ @SuppressWarnings("serial")
+ private volatile java.lang.Object uri_ = "";
+ /**
+ * string uri = 9;
+ * @return The uri.
+ */
+ @java.lang.Override
+ public java.lang.String getUri() {
+ java.lang.Object ref = uri_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ uri_ = s;
+ return s;
+ }
+ }
+ /**
+ * string uri = 9;
+ * @return The bytes for uri.
+ */
+ @java.lang.Override
+ public com.google.protobuf.ByteString
+ getUriBytes() {
+ java.lang.Object ref = uri_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ uri_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 3, type_);
+ }
+ com.google.protobuf.GeneratedMessageV3
+ .serializeStringMapTo(
+ output,
+ internalGetHeaders(),
+ HeadersDefaultEntryHolder.defaultEntry,
+ 7);
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(clientIp_)) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 8, clientIp_);
+ }
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+ com.google.protobuf.GeneratedMessageV3.writeString(output, 9, uri_);
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, type_);
+ }
+ for (java.util.Map.Entry entry
+ : internalGetHeaders().getMap().entrySet()) {
+ com.google.protobuf.MapEntry
+ headers__ = HeadersDefaultEntryHolder.defaultEntry.newBuilderForType()
+ .setKey(entry.getKey())
+ .setValue(entry.getValue())
+ .build();
+ size += com.google.protobuf.CodedOutputStream
+ .computeMessageSize(7, headers__);
+ }
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(clientIp_)) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, clientIp_);
+ }
+ if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+ size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, uri_);
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof com.aizuda.snailjob.common.core.grpc.auto.Metadata)) {
+ return super.equals(obj);
+ }
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata other = (com.aizuda.snailjob.common.core.grpc.auto.Metadata) obj;
+
+ if (!getType()
+ .equals(other.getType())) return false;
+ if (!internalGetHeaders().equals(
+ other.internalGetHeaders())) return false;
+ if (!getClientIp()
+ .equals(other.getClientIp())) return false;
+ if (!getUri()
+ .equals(other.getUri())) return false;
+ if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + TYPE_FIELD_NUMBER;
+ hash = (53 * hash) + getType().hashCode();
+ if (!internalGetHeaders().getMap().isEmpty()) {
+ hash = (37 * hash) + HEADERS_FIELD_NUMBER;
+ hash = (53 * hash) + internalGetHeaders().hashCode();
+ }
+ hash = (37 * hash) + CLIENTIP_FIELD_NUMBER;
+ hash = (53 * hash) + getClientIp().hashCode();
+ hash = (37 * hash) + URI_FIELD_NUMBER;
+ hash = (53 * hash) + getUri().hashCode();
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessageV3
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(com.aizuda.snailjob.common.core.grpc.auto.Metadata prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code Metadata}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessageV3.Builder implements
+ // @@protoc_insertion_point(builder_implements:Metadata)
+ com.aizuda.snailjob.common.core.grpc.auto.MetadataOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_descriptor;
+ }
+
+ @SuppressWarnings({"rawtypes"})
+ protected com.google.protobuf.MapField internalGetMapField(
+ int number) {
+ switch (number) {
+ case 7:
+ return internalGetHeaders();
+ default:
+ throw new RuntimeException(
+ "Invalid map field number: " + number);
+ }
+ }
+ @SuppressWarnings({"rawtypes"})
+ protected com.google.protobuf.MapField internalGetMutableMapField(
+ int number) {
+ switch (number) {
+ case 7:
+ return internalGetMutableHeaders();
+ default:
+ throw new RuntimeException(
+ "Invalid map field number: " + number);
+ }
+ }
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata.class, com.aizuda.snailjob.common.core.grpc.auto.Metadata.Builder.class);
+ }
+
+ // Construct using com.aizuda.snailjob.common.core.grpc.auto.Metadata.newBuilder()
+ private Builder() {
+
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+ super(parent);
+
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ type_ = "";
+ internalGetMutableHeaders().clear();
+ clientIp_ = "";
+ uri_ = "";
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.internal_static_Metadata_descriptor;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata getDefaultInstanceForType() {
+ return com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata build() {
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata buildPartial() {
+ com.aizuda.snailjob.common.core.grpc.auto.Metadata result = new com.aizuda.snailjob.common.core.grpc.auto.Metadata(this);
+ if (bitField0_ != 0) { buildPartial0(result); }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(com.aizuda.snailjob.common.core.grpc.auto.Metadata result) {
+ int from_bitField0_ = bitField0_;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.type_ = type_;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.headers_ = internalGetHeaders();
+ result.headers_.makeImmutable();
+ }
+ if (((from_bitField0_ & 0x00000004) != 0)) {
+ result.clientIp_ = clientIp_;
+ }
+ if (((from_bitField0_ & 0x00000008) != 0)) {
+ result.uri_ = uri_;
+ }
+ }
+
+ @java.lang.Override
+ public Builder clone() {
+ return super.clone();
+ }
+ @java.lang.Override
+ public Builder setField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.setField(field, value);
+ }
+ @java.lang.Override
+ public Builder clearField(
+ com.google.protobuf.Descriptors.FieldDescriptor field) {
+ return super.clearField(field);
+ }
+ @java.lang.Override
+ public Builder clearOneof(
+ com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+ return super.clearOneof(oneof);
+ }
+ @java.lang.Override
+ public Builder setRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ int index, java.lang.Object value) {
+ return super.setRepeatedField(field, index, value);
+ }
+ @java.lang.Override
+ public Builder addRepeatedField(
+ com.google.protobuf.Descriptors.FieldDescriptor field,
+ java.lang.Object value) {
+ return super.addRepeatedField(field, value);
+ }
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof com.aizuda.snailjob.common.core.grpc.auto.Metadata) {
+ return mergeFrom((com.aizuda.snailjob.common.core.grpc.auto.Metadata)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(com.aizuda.snailjob.common.core.grpc.auto.Metadata other) {
+ if (other == com.aizuda.snailjob.common.core.grpc.auto.Metadata.getDefaultInstance()) return this;
+ if (!other.getType().isEmpty()) {
+ type_ = other.type_;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ }
+ internalGetMutableHeaders().mergeFrom(
+ other.internalGetHeaders());
+ bitField0_ |= 0x00000002;
+ if (!other.getClientIp().isEmpty()) {
+ clientIp_ = other.clientIp_;
+ bitField0_ |= 0x00000004;
+ onChanged();
+ }
+ if (!other.getUri().isEmpty()) {
+ uri_ = other.uri_;
+ bitField0_ |= 0x00000008;
+ onChanged();
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 26: {
+ type_ = input.readStringRequireUtf8();
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 26
+ case 58: {
+ com.google.protobuf.MapEntry
+ headers__ = input.readMessage(
+ HeadersDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+ internalGetMutableHeaders().getMutableMap().put(
+ headers__.getKey(), headers__.getValue());
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 58
+ case 66: {
+ clientIp_ = input.readStringRequireUtf8();
+ bitField0_ |= 0x00000004;
+ break;
+ } // case 66
+ case 74: {
+ uri_ = input.readStringRequireUtf8();
+ bitField0_ |= 0x00000008;
+ break;
+ } // case 74
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+ private int bitField0_;
+
+ private java.lang.Object type_ = "";
+ /**
+ * string type = 3;
+ * @return The type.
+ */
+ public java.lang.String getType() {
+ java.lang.Object ref = type_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ type_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * string type = 3;
+ * @return The bytes for type.
+ */
+ public com.google.protobuf.ByteString
+ getTypeBytes() {
+ java.lang.Object ref = type_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ type_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * string type = 3;
+ * @param value The type to set.
+ * @return This builder for chaining.
+ */
+ public Builder setType(
+ java.lang.String value) {
+ if (value == null) { throw new NullPointerException(); }
+ type_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * string type = 3;
+ * @return This builder for chaining.
+ */
+ public Builder clearType() {
+ type_ = getDefaultInstance().getType();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ onChanged();
+ return this;
+ }
+ /**
+ * string type = 3;
+ * @param value The bytes for type to set.
+ * @return This builder for chaining.
+ */
+ public Builder setTypeBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) { throw new NullPointerException(); }
+ checkByteStringIsUtf8(value);
+ type_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+
+ private com.google.protobuf.MapField<
+ java.lang.String, java.lang.String> headers_;
+ private com.google.protobuf.MapField
+ internalGetHeaders() {
+ if (headers_ == null) {
+ return com.google.protobuf.MapField.emptyMapField(
+ HeadersDefaultEntryHolder.defaultEntry);
+ }
+ return headers_;
+ }
+ private com.google.protobuf.MapField
+ internalGetMutableHeaders() {
+ if (headers_ == null) {
+ headers_ = com.google.protobuf.MapField.newMapField(
+ HeadersDefaultEntryHolder.defaultEntry);
+ }
+ if (!headers_.isMutable()) {
+ headers_ = headers_.copy();
+ }
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return headers_;
+ }
+ public int getHeadersCount() {
+ return internalGetHeaders().getMap().size();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public boolean containsHeaders(
+ java.lang.String key) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ return internalGetHeaders().getMap().containsKey(key);
+ }
+ /**
+ * Use {@link #getHeadersMap()} instead.
+ */
+ @java.lang.Override
+ @java.lang.Deprecated
+ public java.util.Map getHeaders() {
+ return getHeadersMap();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public java.util.Map getHeadersMap() {
+ return internalGetHeaders().getMap();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public /* nullable */
+java.lang.String getHeadersOrDefault(
+ java.lang.String key,
+ /* nullable */
+java.lang.String defaultValue) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ java.util.Map map =
+ internalGetHeaders().getMap();
+ return map.containsKey(key) ? map.get(key) : defaultValue;
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ @java.lang.Override
+ public java.lang.String getHeadersOrThrow(
+ java.lang.String key) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ java.util.Map map =
+ internalGetHeaders().getMap();
+ if (!map.containsKey(key)) {
+ throw new java.lang.IllegalArgumentException();
+ }
+ return map.get(key);
+ }
+ public Builder clearHeaders() {
+ bitField0_ = (bitField0_ & ~0x00000002);
+ internalGetMutableHeaders().getMutableMap()
+ .clear();
+ return this;
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ public Builder removeHeaders(
+ java.lang.String key) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ internalGetMutableHeaders().getMutableMap()
+ .remove(key);
+ return this;
+ }
+ /**
+ * Use alternate mutation accessors instead.
+ */
+ @java.lang.Deprecated
+ public java.util.Map
+ getMutableHeaders() {
+ bitField0_ |= 0x00000002;
+ return internalGetMutableHeaders().getMutableMap();
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ public Builder putHeaders(
+ java.lang.String key,
+ java.lang.String value) {
+ if (key == null) { throw new NullPointerException("map key"); }
+ if (value == null) { throw new NullPointerException("map value"); }
+ internalGetMutableHeaders().getMutableMap()
+ .put(key, value);
+ bitField0_ |= 0x00000002;
+ return this;
+ }
+ /**
+ * map<string, string> headers = 7;
+ */
+ public Builder putAllHeaders(
+ java.util.Map values) {
+ internalGetMutableHeaders().getMutableMap()
+ .putAll(values);
+ bitField0_ |= 0x00000002;
+ return this;
+ }
+
+ private java.lang.Object clientIp_ = "";
+ /**
+ * string clientIp = 8;
+ * @return The clientIp.
+ */
+ public java.lang.String getClientIp() {
+ java.lang.Object ref = clientIp_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ clientIp_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * string clientIp = 8;
+ * @return The bytes for clientIp.
+ */
+ public com.google.protobuf.ByteString
+ getClientIpBytes() {
+ java.lang.Object ref = clientIp_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ clientIp_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * string clientIp = 8;
+ * @param value The clientIp to set.
+ * @return This builder for chaining.
+ */
+ public Builder setClientIp(
+ java.lang.String value) {
+ if (value == null) { throw new NullPointerException(); }
+ clientIp_ = value;
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+ /**
+ * string clientIp = 8;
+ * @return This builder for chaining.
+ */
+ public Builder clearClientIp() {
+ clientIp_ = getDefaultInstance().getClientIp();
+ bitField0_ = (bitField0_ & ~0x00000004);
+ onChanged();
+ return this;
+ }
+ /**
+ * string clientIp = 8;
+ * @param value The bytes for clientIp to set.
+ * @return This builder for chaining.
+ */
+ public Builder setClientIpBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) { throw new NullPointerException(); }
+ checkByteStringIsUtf8(value);
+ clientIp_ = value;
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+
+ private java.lang.Object uri_ = "";
+ /**
+ * string uri = 9;
+ * @return The uri.
+ */
+ public java.lang.String getUri() {
+ java.lang.Object ref = uri_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs =
+ (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ uri_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+ /**
+ * string uri = 9;
+ * @return The bytes for uri.
+ */
+ public com.google.protobuf.ByteString
+ getUriBytes() {
+ java.lang.Object ref = uri_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b =
+ com.google.protobuf.ByteString.copyFromUtf8(
+ (java.lang.String) ref);
+ uri_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+ /**
+ * string uri = 9;
+ * @param value The uri to set.
+ * @return This builder for chaining.
+ */
+ public Builder setUri(
+ java.lang.String value) {
+ if (value == null) { throw new NullPointerException(); }
+ uri_ = value;
+ bitField0_ |= 0x00000008;
+ onChanged();
+ return this;
+ }
+ /**
+ * string uri = 9;
+ * @return This builder for chaining.
+ */
+ public Builder clearUri() {
+ uri_ = getDefaultInstance().getUri();
+ bitField0_ = (bitField0_ & ~0x00000008);
+ onChanged();
+ return this;
+ }
+ /**
+ * string uri = 9;
+ * @param value The bytes for uri to set.
+ * @return This builder for chaining.
+ */
+ public Builder setUriBytes(
+ com.google.protobuf.ByteString value) {
+ if (value == null) { throw new NullPointerException(); }
+ checkByteStringIsUtf8(value);
+ uri_ = value;
+ bitField0_ |= 0x00000008;
+ onChanged();
+ return this;
+ }
+ @java.lang.Override
+ public final Builder setUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.setUnknownFields(unknownFields);
+ }
+
+ @java.lang.Override
+ public final Builder mergeUnknownFields(
+ final com.google.protobuf.UnknownFieldSet unknownFields) {
+ return super.mergeUnknownFields(unknownFields);
+ }
+
+
+ // @@protoc_insertion_point(builder_scope:Metadata)
+ }
+
+ // @@protoc_insertion_point(class_scope:Metadata)
+ private static final com.aizuda.snailjob.common.core.grpc.auto.Metadata DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new com.aizuda.snailjob.common.core.grpc.auto.Metadata();
+ }
+
+ public static com.aizuda.snailjob.common.core.grpc.auto.Metadata getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public Metadata parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e)
+ .setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.aizuda.snailjob.common.core.grpc.auto.Metadata getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+}
+
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/MetadataOrBuilder.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/MetadataOrBuilder.java
new file mode 100644
index 00000000..f50d4433
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/MetadataOrBuilder.java
@@ -0,0 +1,79 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+public interface MetadataOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:Metadata)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * string type = 3;
+ * @return The type.
+ */
+ java.lang.String getType();
+ /**
+ * string type = 3;
+ * @return The bytes for type.
+ */
+ com.google.protobuf.ByteString
+ getTypeBytes();
+
+ /**
+ * map<string, string> headers = 7;
+ */
+ int getHeadersCount();
+ /**
+ * map<string, string> headers = 7;
+ */
+ boolean containsHeaders(
+ java.lang.String key);
+ /**
+ * Use {@link #getHeadersMap()} instead.
+ */
+ @java.lang.Deprecated
+ java.util.Map
+ getHeaders();
+ /**
+ * map<string, string> headers = 7;
+ */
+ java.util.Map
+ getHeadersMap();
+ /**
+ * map<string, string> headers = 7;
+ */
+ /* nullable */
+java.lang.String getHeadersOrDefault(
+ java.lang.String key,
+ /* nullable */
+java.lang.String defaultValue);
+ /**
+ * map<string, string> headers = 7;
+ */
+ java.lang.String getHeadersOrThrow(
+ java.lang.String key);
+
+ /**
+ * string clientIp = 8;
+ * @return The clientIp.
+ */
+ java.lang.String getClientIp();
+ /**
+ * string clientIp = 8;
+ * @return The bytes for clientIp.
+ */
+ com.google.protobuf.ByteString
+ getClientIpBytes();
+
+ /**
+ * string uri = 9;
+ * @return The uri.
+ */
+ java.lang.String getUri();
+ /**
+ * string uri = 9;
+ * @return The bytes for uri.
+ */
+ com.google.protobuf.ByteString
+ getUriBytes();
+}
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/RequestGrpc.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/RequestGrpc.java
new file mode 100644
index 00000000..4df1f626
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/RequestGrpc.java
@@ -0,0 +1,293 @@
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+
+/**
+ */
+@javax.annotation.Generated(
+ value = "by gRPC proto compiler (version 1.63.0)",
+ comments = "Source: snail_job_grpc_service.proto")
+@io.grpc.stub.annotations.GrpcGenerated
+public final class RequestGrpc {
+
+ private RequestGrpc() {}
+
+ public static final java.lang.String SERVICE_NAME = "Request";
+
+ // Static method descriptors that strictly reflect the proto.
+ private static volatile io.grpc.MethodDescriptor getRequestMethod;
+
+ @io.grpc.stub.annotations.RpcMethod(
+ fullMethodName = SERVICE_NAME + '/' + "request",
+ requestType = com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.class,
+ responseType = com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.class,
+ methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+ public static io.grpc.MethodDescriptor getRequestMethod() {
+ io.grpc.MethodDescriptor getRequestMethod;
+ if ((getRequestMethod = RequestGrpc.getRequestMethod) == null) {
+ synchronized (RequestGrpc.class) {
+ if ((getRequestMethod = RequestGrpc.getRequestMethod) == null) {
+ RequestGrpc.getRequestMethod = getRequestMethod =
+ io.grpc.MethodDescriptor.newBuilder()
+ .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+ .setFullMethodName(generateFullMethodName(SERVICE_NAME, "request"))
+ .setSampledToLocalTracing(true)
+ .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest.getDefaultInstance()))
+ .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult.getDefaultInstance()))
+ .setSchemaDescriptor(new RequestMethodDescriptorSupplier("request"))
+ .build();
+ }
+ }
+ }
+ return getRequestMethod;
+ }
+
+ /**
+ * Creates a new async stub that supports all call types for the service
+ */
+ public static RequestStub newStub(io.grpc.Channel channel) {
+ io.grpc.stub.AbstractStub.StubFactory factory =
+ new io.grpc.stub.AbstractStub.StubFactory() {
+ @java.lang.Override
+ public RequestStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestStub(channel, callOptions);
+ }
+ };
+ return RequestStub.newStub(factory, channel);
+ }
+
+ /**
+ * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+ */
+ public static RequestBlockingStub newBlockingStub(
+ io.grpc.Channel channel) {
+ io.grpc.stub.AbstractStub.StubFactory factory =
+ new io.grpc.stub.AbstractStub.StubFactory() {
+ @java.lang.Override
+ public RequestBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestBlockingStub(channel, callOptions);
+ }
+ };
+ return RequestBlockingStub.newStub(factory, channel);
+ }
+
+ /**
+ * Creates a new ListenableFuture-style stub that supports unary calls on the service
+ */
+ public static RequestFutureStub newFutureStub(
+ io.grpc.Channel channel) {
+ io.grpc.stub.AbstractStub.StubFactory factory =
+ new io.grpc.stub.AbstractStub.StubFactory() {
+ @java.lang.Override
+ public RequestFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestFutureStub(channel, callOptions);
+ }
+ };
+ return RequestFutureStub.newStub(factory, channel);
+ }
+
+ /**
+ */
+ public interface AsyncService {
+
+ /**
+ */
+ default void request(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest request,
+ io.grpc.stub.StreamObserver responseObserver) {
+ io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRequestMethod(), responseObserver);
+ }
+ }
+
+ /**
+ * Base class for the server implementation of the service Request.
+ */
+ public static abstract class RequestImplBase
+ implements io.grpc.BindableService, AsyncService {
+
+ @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+ return RequestGrpc.bindService(this);
+ }
+ }
+
+ /**
+ * A stub to allow clients to do asynchronous rpc calls to service Request.
+ */
+ public static final class RequestStub
+ extends io.grpc.stub.AbstractAsyncStub {
+ private RequestStub(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ super(channel, callOptions);
+ }
+
+ @java.lang.Override
+ protected RequestStub build(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestStub(channel, callOptions);
+ }
+
+ /**
+ */
+ public void request(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest request,
+ io.grpc.stub.StreamObserver responseObserver) {
+ io.grpc.stub.ClientCalls.asyncUnaryCall(
+ getChannel().newCall(getRequestMethod(), getCallOptions()), request, responseObserver);
+ }
+ }
+
+ /**
+ * A stub to allow clients to do synchronous rpc calls to service Request.
+ */
+ public static final class RequestBlockingStub
+ extends io.grpc.stub.AbstractBlockingStub {
+ private RequestBlockingStub(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ super(channel, callOptions);
+ }
+
+ @java.lang.Override
+ protected RequestBlockingStub build(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestBlockingStub(channel, callOptions);
+ }
+
+ /**
+ */
+ public com.aizuda.snailjob.common.core.grpc.auto.GrpcResult request(com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest request) {
+ return io.grpc.stub.ClientCalls.blockingUnaryCall(
+ getChannel(), getRequestMethod(), getCallOptions(), request);
+ }
+ }
+
+ /**
+ * A stub to allow clients to do ListenableFuture-style rpc calls to service Request.
+ */
+ public static final class RequestFutureStub
+ extends io.grpc.stub.AbstractFutureStub {
+ private RequestFutureStub(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ super(channel, callOptions);
+ }
+
+ @java.lang.Override
+ protected RequestFutureStub build(
+ io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+ return new RequestFutureStub(channel, callOptions);
+ }
+
+ /**
+ */
+ public com.google.common.util.concurrent.ListenableFuture request(
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest request) {
+ return io.grpc.stub.ClientCalls.futureUnaryCall(
+ getChannel().newCall(getRequestMethod(), getCallOptions()), request);
+ }
+ }
+
+ private static final int METHODID_REQUEST = 0;
+
+ private static final class MethodHandlers implements
+ io.grpc.stub.ServerCalls.UnaryMethod,
+ io.grpc.stub.ServerCalls.ServerStreamingMethod,
+ io.grpc.stub.ServerCalls.ClientStreamingMethod,
+ io.grpc.stub.ServerCalls.BidiStreamingMethod {
+ private final AsyncService serviceImpl;
+ private final int methodId;
+
+ MethodHandlers(AsyncService serviceImpl, int methodId) {
+ this.serviceImpl = serviceImpl;
+ this.methodId = methodId;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("unchecked")
+ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) {
+ switch (methodId) {
+ case METHODID_REQUEST:
+ serviceImpl.request((com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest) request,
+ (io.grpc.stub.StreamObserver) responseObserver);
+ break;
+ default:
+ throw new AssertionError();
+ }
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("unchecked")
+ public io.grpc.stub.StreamObserver invoke(
+ io.grpc.stub.StreamObserver responseObserver) {
+ switch (methodId) {
+ default:
+ throw new AssertionError();
+ }
+ }
+ }
+
+ public static final io.grpc.ServerServiceDefinition bindService(AsyncService service) {
+ return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+ .addMethod(
+ getRequestMethod(),
+ io.grpc.stub.ServerCalls.asyncUnaryCall(
+ new MethodHandlers<
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest,
+ com.aizuda.snailjob.common.core.grpc.auto.GrpcResult>(
+ service, METHODID_REQUEST)))
+ .build();
+ }
+
+ private static abstract class RequestBaseDescriptorSupplier
+ implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+ RequestBaseDescriptorSupplier() {}
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+ return com.aizuda.snailjob.common.core.grpc.auto.SnailJobGrpcService.getDescriptor();
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+ return getFileDescriptor().findServiceByName("Request");
+ }
+ }
+
+ private static final class RequestFileDescriptorSupplier
+ extends RequestBaseDescriptorSupplier {
+ RequestFileDescriptorSupplier() {}
+ }
+
+ private static final class RequestMethodDescriptorSupplier
+ extends RequestBaseDescriptorSupplier
+ implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+ private final java.lang.String methodName;
+
+ RequestMethodDescriptorSupplier(java.lang.String methodName) {
+ this.methodName = methodName;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+ return getServiceDescriptor().findMethodByName(methodName);
+ }
+ }
+
+ private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+ public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+ io.grpc.ServiceDescriptor result = serviceDescriptor;
+ if (result == null) {
+ synchronized (RequestGrpc.class) {
+ result = serviceDescriptor;
+ if (result == null) {
+ serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+ .setSchemaDescriptor(new RequestFileDescriptorSupplier())
+ .addMethod(getRequestMethod())
+ .build();
+ }
+ }
+ }
+ return result;
+ }
+}
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/SnailJobGrpcService.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/SnailJobGrpcService.java
new file mode 100644
index 00000000..44c2b8d7
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/grpc/auto/SnailJobGrpcService.java
@@ -0,0 +1,96 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: snail_job_grpc_service.proto
+
+package com.aizuda.snailjob.common.core.grpc.auto;
+
+public final class SnailJobGrpcService {
+ private SnailJobGrpcService() {}
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_Metadata_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_Metadata_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_Metadata_HeadersEntry_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_Metadata_HeadersEntry_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_GrpcSnailJobRequest_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_GrpcSnailJobRequest_fieldAccessorTable;
+ static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_GrpcResult_descriptor;
+ static final
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+ internal_static_GrpcResult_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\034snail_job_grpc_service.proto\032\031google/p" +
+ "rotobuf/any.proto\032\037google/protobuf/times" +
+ "tamp.proto\"\220\001\n\010Metadata\022\014\n\004type\030\003 \001(\t\022\'\n" +
+ "\007headers\030\007 \003(\0132\026.Metadata.HeadersEntry\022\020" +
+ "\n\010clientIp\030\010 \001(\t\022\013\n\003uri\030\t \001(\t\032.\n\014Headers" +
+ "Entry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"V\n" +
+ "\023GrpcSnailJobRequest\022\033\n\010metadata\030\002 \001(\0132\t" +
+ ".Metadata\022\"\n\004body\030\003 \001(\0132\024.google.protobu" +
+ "f.Any\"Q\n\nGrpcResult\022\016\n\006status\030\001 \001(\005\022\017\n\007m" +
+ "essage\030\002 \001(\t\022\"\n\004data\030\003 \001(\0132\024.google.prot" +
+ "obuf.Any29\n\007Request\022.\n\007request\022\024.GrpcSna" +
+ "ilJobRequest\032\013.GrpcResult\"\000B-\n)com.aizud" +
+ "a.snailjob.common.core.grpc.autoP\001b\006prot" +
+ "o3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ com.google.protobuf.AnyProto.getDescriptor(),
+ com.google.protobuf.TimestampProto.getDescriptor(),
+ });
+ internal_static_Metadata_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_Metadata_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_Metadata_descriptor,
+ new java.lang.String[] { "Type", "Headers", "ClientIp", "Uri", });
+ internal_static_Metadata_HeadersEntry_descriptor =
+ internal_static_Metadata_descriptor.getNestedTypes().get(0);
+ internal_static_Metadata_HeadersEntry_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_Metadata_HeadersEntry_descriptor,
+ new java.lang.String[] { "Key", "Value", });
+ internal_static_GrpcSnailJobRequest_descriptor =
+ getDescriptor().getMessageTypes().get(1);
+ internal_static_GrpcSnailJobRequest_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_GrpcSnailJobRequest_descriptor,
+ new java.lang.String[] { "Metadata", "Body", });
+ internal_static_GrpcResult_descriptor =
+ getDescriptor().getMessageTypes().get(2);
+ internal_static_GrpcResult_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+ internal_static_GrpcResult_descriptor,
+ new java.lang.String[] { "Status", "Message", "Data", });
+ com.google.protobuf.AnyProto.getDescriptor();
+ com.google.protobuf.TimestampProto.getDescriptor();
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/util/JsonUtil.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/util/JsonUtil.java
index 45969174..fee8e070 100644
--- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/util/JsonUtil.java
+++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/util/JsonUtil.java
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
+import java.io.InputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -51,6 +52,13 @@ public class JsonUtil {
return JsonMapper.toJavaObject(jsonString, clazz);
}
+
+ public static T parseObject(InputStream inputStream, Class clazz) {
+ return JsonMapper.toJavaObject(inputStream, clazz);
+ }
+
+
+
/**
* 将JSON 数组字符串转Java 对象集合
*
@@ -265,6 +273,14 @@ public class JsonUtil {
}
}
+ public static T toJavaObject(InputStream inputStream, Class clazz) {
+ try {
+ return objectMapper.readValue(inputStream, clazz);
+ } catch (IOException e) {
+ throw new SnailJobCommonException("Json转对象失败", e);
+ }
+ }
+
/**
* Json 字符串转JAVA 对象
*
diff --git a/snail-job-common/snail-job-common-core/src/main/proto/snail_job_grpc_service.proto b/snail-job-common/snail-job-common-core/src/main/proto/snail_job_grpc_service.proto
new file mode 100644
index 00000000..05cb8e62
--- /dev/null
+++ b/snail-job-common/snail-job-common-core/src/main/proto/snail_job_grpc_service.proto
@@ -0,0 +1,53 @@
+
+/*
+ * Copyright 1999-2020 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+import "google/protobuf/timestamp.proto";
+
+option java_multiple_files = true;
+option java_package = "com.aizuda.snailjob.common.core.grpc.auto";
+
+message Metadata {
+ string type = 3;
+ map headers = 7;
+ string clientIp = 8;
+ string uri = 9;
+}
+
+message GrpcSnailJobRequest {
+ Metadata metadata = 2;
+ google.protobuf.Any body = 3;
+}
+
+message GrpcResult {
+ int32 status = 1;
+ string message = 2;
+ google.protobuf.Any data = 3;
+}
+
+service Request {
+ rpc request (GrpcSnailJobRequest) returns (GrpcResult) {
+ }
+}
+
+//service BiRequestStream {
+// // Sends a biStreamRequest
+// rpc requestBiStream (stream Payload) returns (stream Payload) {
+// }
+//}
diff --git a/snail-job-server/snail-job-server-common/pom.xml b/snail-job-server/snail-job-server-common/pom.xml
index c9525ba9..2dd9eee7 100644
--- a/snail-job-server/snail-job-server-common/pom.xml
+++ b/snail-job-server/snail-job-server-common/pom.xml
@@ -92,6 +92,20 @@
com.aizuda
snail-job-common-log
+
+ net.devh
+ grpc-client-spring-boot-starter
+
+
+ io.grpc
+ grpc-netty-shaded
+ 1.63.0
+
+
+ net.devh
+ grpc-server-spring-boot-starter
+ 3.1.0.RELEASE
+
org.scala-lang
scala-library
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/dto/GrpcRequest.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/dto/GrpcRequest.java
new file mode 100644
index 00000000..f36dce8f
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/dto/GrpcRequest.java
@@ -0,0 +1,26 @@
+package com.aizuda.snailjob.server.common.dto;
+
+
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import io.grpc.stub.StreamObserver;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * netty客户端请求模型
+ *
+ * @author: opensnail
+ * @date : 2023-07-24 09:32
+ */
+@Data
+@Builder
+public class GrpcRequest {
+
+ private GrpcSnailJobRequest snailJobRequest;
+
+ private StreamObserver streamObserver;
+
+ private String uri;
+
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcChannel.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcChannel.java
new file mode 100644
index 00000000..8d088bcc
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcChannel.java
@@ -0,0 +1,134 @@
+package com.aizuda.snailjob.server.common.rpc.client;
+
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.server.common.triple.Pair;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.protobuf.Any;
+import com.google.protobuf.UnsafeByteOperations;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.MethodDescriptor;
+import io.grpc.protobuf.ProtoUtils;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpMethod;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.ConnectException;
+import java.nio.channels.ClosedChannelException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author opensnail
+ * @date 2023-05-13
+ * @since 1.3.0
+ */
+@Slf4j
+public class GrpcChannel {
+ private GrpcChannel() {
+ }
+
+ private static ConcurrentHashMap, ManagedChannel> CHANNEL_MAP = new ConcurrentHashMap<>(16);
+
+ public static void setChannel(String hostId, String ip, ManagedChannel channel) {
+ CHANNEL_MAP.put(Pair.of(hostId, ip), channel);
+ }
+
+ public static void removeChannel(ManagedChannel channel) {
+ CHANNEL_MAP.forEach((key, value) -> {
+ if (value.equals(channel)) {
+ CHANNEL_MAP.remove(key);
+ }
+ });
+ }
+
+
+ /**
+ * 发送数据
+ *
+ * @param url url地址
+ * @param body 请求的消息体
+ * @throws InterruptedException
+ */
+ public static ListenableFuture send(String hostId, String hostIp, Integer port, String url, String body, Map headersMap) throws InterruptedException {
+
+ ManagedChannel channel = CHANNEL_MAP.get(Pair.of(hostId, hostIp));
+ if (Objects.isNull(channel) || !channel.isShutdown() || !channel.isShutdown()) {
+ channel = connect(hostId, hostIp, port);
+ if (Objects.isNull(channel)) {
+ SnailJobLog.LOCAL.error("send message but channel is null url:[{}] method:[{}] body:[{}] ", url, body);
+ return null;
+ }
+ }
+
+ Metadata metadata = Metadata
+ .newBuilder()
+ .setUri(url)
+ .putAllHeaders(headersMap)
+ .build();
+ Any build = Any.newBuilder().setValue(UnsafeByteOperations.unsafeWrap(body.getBytes()))
+ .build();
+ GrpcSnailJobRequest snailJobRequest = GrpcSnailJobRequest
+ .newBuilder()
+ .setMetadata(metadata)
+ .setBody(build)
+ .build();
+
+ MethodDescriptor methodDescriptor =
+ MethodDescriptor.newBuilder()
+ .setType(MethodDescriptor.MethodType.UNARY)
+ .setFullMethodName(MethodDescriptor.generateFullMethodName("UnaryRequest", "unaryRequest"))
+ .setRequestMarshaller(ProtoUtils.marshaller(GrpcSnailJobRequest.getDefaultInstance()))
+ .setResponseMarshaller(ProtoUtils.marshaller(GrpcResult.getDefaultInstance()))
+ .build();
+
+ // 创建动态代理调用方法
+ return io.grpc.stub.ClientCalls.futureUnaryCall(
+ channel.newCall(methodDescriptor, io.grpc.CallOptions.DEFAULT),
+ snailJobRequest);
+
+ }
+
+ /**
+ * 连接客户端
+ *
+ * @return
+ */
+ public static ManagedChannel connect(String hostId, String ip, Integer port) {
+
+ try {
+ ManagedChannel channel = ManagedChannelBuilder.forAddress(ip, port)
+ .usePlaintext()
+ .build();
+ GrpcChannel.setChannel(hostId, ip, channel);
+
+ return channel;
+ } catch (Exception e) {
+ exceptionHandler(e);
+ }
+
+ return null;
+ }
+
+ /**
+ * 连接失败处理
+ *
+ * @param cause
+ */
+ private static void exceptionHandler(Throwable cause) {
+ if (cause instanceof ConnectException) {
+ SnailJobLog.LOCAL.error("connect error:{}", cause.getMessage());
+ } else if (cause instanceof ClosedChannelException) {
+ SnailJobLog.LOCAL.error("connect error:{}", "client has destroy");
+ } else {
+ SnailJobLog.LOCAL.error("connect error:", cause);
+ }
+ }
+
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcClientInvokeHandler.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcClientInvokeHandler.java
new file mode 100644
index 00000000..6a25ab4f
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/GrpcClientInvokeHandler.java
@@ -0,0 +1,263 @@
+package com.aizuda.snailjob.server.common.rpc.client;
+
+import cn.hutool.core.date.StopWatch;
+import cn.hutool.core.lang.Assert;
+import com.aizuda.snailjob.common.core.constant.SystemConstants;
+import com.aizuda.snailjob.common.core.context.SnailSpringContext;
+import com.aizuda.snailjob.common.core.exception.SnailJobRemotingTimeOutException;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.model.Result;
+import com.aizuda.snailjob.common.core.model.SnailJobRequest;
+import com.aizuda.snailjob.common.core.rpc.RpcContext;
+import com.aizuda.snailjob.common.core.rpc.SnailJobFuture;
+import com.aizuda.snailjob.common.core.util.JsonUtil;
+import com.aizuda.snailjob.common.core.util.NetUtil;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.server.common.cache.CacheRegisterTable;
+import com.aizuda.snailjob.server.common.cache.CacheToken;
+import com.aizuda.snailjob.server.common.dto.RegisterNodeInfo;
+import com.aizuda.snailjob.server.common.exception.SnailJobServerException;
+import com.aizuda.snailjob.server.common.handler.ClientNodeAllocateHandler;
+import com.aizuda.snailjob.server.common.rpc.client.annotation.Body;
+import com.aizuda.snailjob.server.common.rpc.client.annotation.Header;
+import com.aizuda.snailjob.server.common.rpc.client.annotation.Mapping;
+import com.aizuda.snailjob.server.common.rpc.client.annotation.Param;
+import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
+import com.github.rholder.retry.RetryException;
+import com.github.rholder.retry.RetryListener;
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.github.rholder.retry.WaitStrategies;
+import com.google.common.util.concurrent.ListenableFuture;
+import io.netty.handler.codec.http.DefaultHttpHeaders;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpMethod;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 请求处理器
+ *
+ * @author: opensnail
+ * @date : 2023-05-11 21:45
+ * @since 2.0.0
+ */
+@Slf4j
+public class GrpcClientInvokeHandler implements InvocationHandler {
+
+ private final String groupName;
+ private String hostId;
+ private String hostIp;
+ private Integer hostPort;
+ private final boolean failRetry;
+ private final int retryTimes;
+ private final int retryInterval;
+ private final RetryListener retryListener;
+ private final boolean failover;
+ private final Integer routeKey;
+ private final String allocKey;
+ private final Integer executorTimeout;
+ private final String namespaceId;
+ private final boolean async;
+
+ public GrpcClientInvokeHandler(final String groupName, final RegisterNodeInfo registerNodeInfo,
+ final boolean failRetry, final int retryTimes,
+ final int retryInterval, final RetryListener retryListener, final Integer routeKey, final String allocKey,
+ final boolean failover, final Integer executorTimeout, final String namespaceId) {
+ this.groupName = groupName;
+ this.hostId = registerNodeInfo.getHostId();
+ this.hostPort = registerNodeInfo.getHostPort();
+ this.hostIp = registerNodeInfo.getHostIp();
+ this.failRetry = failRetry;
+ this.retryTimes = retryTimes;
+ this.retryInterval = retryInterval;
+ this.retryListener = retryListener;
+ this.failover = failover;
+ this.routeKey = routeKey;
+ this.allocKey = allocKey;
+ this.executorTimeout = executorTimeout;
+ this.namespaceId = namespaceId;
+ this.async = false;
+ }
+
+ @Override
+ public Result invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
+ Mapping annotation = method.getAnnotation(Mapping.class);
+ Assert.notNull(annotation, () -> new SnailJobServerException("@Mapping cannot be null"));
+
+ if (failover) {
+ return doFailoverHandler(method, args, annotation);
+ }
+
+ return requestRemote(method, args, annotation, 1);
+ }
+
+ @NotNull
+ private Result doFailoverHandler(final Method method, final Object[] args, final Mapping annotation)
+ throws Throwable {
+ Set serverNodeSet = CacheRegisterTable.getServerNodeSet(groupName, namespaceId);
+
+ // 最多调用size次
+ int size = serverNodeSet.size();
+ for (int count = 1; count <= size; count++) {
+ log.debug("Start request client. count:[{}] clientId:[{}] clientAddr:[{}:{}] serverIp:[{}]", count, hostId,
+ hostIp, hostPort, NetUtil.getLocalIpStr());
+ Result result = requestRemote(method, args, annotation, count);
+ if (Objects.nonNull(result)) {
+ return result;
+ }
+ }
+
+ throw new SnailJobServerException("No available nodes.");
+ }
+
+ private Result requestRemote(Method method, Object[] args, Mapping mapping, int count) throws Throwable {
+
+ try {
+
+ // 参数解析
+ ParseParasResult parasResult = doParseParams(method, args);
+
+ // 若是POST请求,请求体不能是null
+ if (RequestMethod.POST.name().equals(mapping.method().name())) {
+ Assert.notNull(parasResult.body, () -> new SnailJobServerException("body cannot be null"));
+ }
+
+ Retryer retryer = buildResultRetryer();
+
+ Map requestHeaders = parasResult.requestHeaders;
+ // 统一设置Token
+ requestHeaders.put(SystemConstants.SNAIL_JOB_AUTH_TOKEN, CacheToken.get(groupName, namespaceId));
+
+// SnailJobRequest snailJobRequest = new SnailJobRequest(args);
+ Result result = retryer.call(() -> {
+
+ ListenableFuture future = GrpcChannel.send(hostId, hostIp, hostPort,
+ mapping.path(), JsonUtil.toJsonString(args), requestHeaders);
+
+ SnailJobLog.LOCAL.debug("request complete requestId:[{}] 耗时:[{}ms]", 0);
+ if (async) {
+ // 暂时不支持异步调用
+ return null;
+ } else {
+ Assert.notNull(future, () -> new SnailJobServerException("completableFuture is null"));
+ GrpcResult grpcResult = future.get(Optional.ofNullable(executorTimeout).orElse(20), TimeUnit.SECONDS);
+ ByteBuffer byteBuffer = grpcResult.getData().getValue().asReadOnlyByteBuffer();
+ Object obj = JsonUtil.parseObject(new ByteBufferBackedInputStream(byteBuffer), Object.class);
+ return new Result(grpcResult.getStatus(), grpcResult.getMessage(), obj);
+ }
+
+ });
+
+ log.debug("Request client success. count:[{}] clientId:[{}] clientAddr:[{}:{}] serverIp:[{}]", count,
+ hostId,
+ hostIp, hostPort, NetUtil.getLocalIpStr());
+
+ return result;
+ } catch (ExecutionException ex) {
+ // 网络异常 TimeoutException |
+ if (ex.getCause() instanceof SnailJobRemotingTimeOutException && failover) {
+ log.error("request client I/O error, count:[{}] clientId:[{}] clientAddr:[{}:{}] serverIp:[{}]", count,
+ hostId, hostIp, hostPort, NetUtil.getLocalIpStr(), ex);
+
+ // 进行路由剔除处理
+ CacheRegisterTable.remove(groupName, namespaceId, hostId);
+ // 重新选一个可用的客户端节点
+ ClientNodeAllocateHandler clientNodeAllocateHandler = SnailSpringContext.getBean(
+ ClientNodeAllocateHandler.class);
+ RegisterNodeInfo serverNode = clientNodeAllocateHandler.getServerNode(allocKey, groupName, namespaceId,
+ routeKey);
+ // 这里表示无可用节点
+ if (Objects.isNull(serverNode)) {
+ throw ex.getCause();
+ }
+
+ this.hostId = serverNode.getHostId();
+ this.hostPort = serverNode.getHostPort();
+ this.hostIp = serverNode.getHostIp();
+
+ } else {
+ // 其他异常继续抛出
+ log.error("request client error.count:[{}] clientId:[{}] clientAddr:[{}:{}] serverIp:[{}]", count,
+ hostId, hostIp, hostPort, NetUtil.getLocalIpStr(), ex);
+ throw ex.getCause();
+ }
+ } catch (Exception ex) {
+ log.error("request client unknown exception. count:[{}] clientId:[{}] clientAddr:[{}:{}] serverIp:[{}]",
+ count, hostId, hostIp, hostPort, NetUtil.getLocalIpStr(), ex);
+
+ Throwable throwable = ex;
+ if (ex.getClass().isAssignableFrom(RetryException.class)) {
+ RetryException re = (RetryException) ex;
+ throwable = re.getLastFailedAttempt().getExceptionCause();
+ if (throwable.getCause() instanceof SnailJobRemotingTimeOutException) {
+ // 若重试之后该接口仍然有问题,进行路由剔除处理
+ CacheRegisterTable.remove(groupName, namespaceId, hostId);
+ }
+ }
+
+ throw throwable;
+ }
+
+ return null;
+ }
+
+ private Retryer buildResultRetryer() {
+ Retryer retryer = RetryerBuilder.newBuilder()
+ .retryIfException(throwable -> failRetry)
+ .withStopStrategy(StopStrategies.stopAfterAttempt(retryTimes <= 0 ? 1 : retryTimes))
+ .withWaitStrategy(WaitStrategies.fixedWait(Math.max(retryInterval, 0), TimeUnit.SECONDS))
+ .withRetryListener(retryListener)
+ .build();
+ return retryer;
+ }
+
+ private ParseParasResult doParseParams(Method method, Object[] args) {
+
+ Object body = null;
+ Map requestHeaders = new HashMap<>();
+ Map paramMap = new HashMap<>();
+ // 解析参数
+ Parameter[] parameters = method.getParameters();
+ for (int i = 0; i < parameters.length; i++) {
+ Parameter parameter = parameters[i];
+ if (parameter.isAnnotationPresent(Body.class)) {
+ body = args[i];
+ } else if ((parameter.isAnnotationPresent(Header.class))) {
+ requestHeaders.put(SystemConstants.SNAIL_JOB_HEAD_KEY, JsonUtil.toJsonString(args[i]));
+ } else if ((parameter.isAnnotationPresent(Param.class))) {
+ paramMap.put(parameter.getAnnotation(Param.class).name(), args[i]);
+ } else {
+ throw new SnailJobServerException("parameter error");
+ }
+ }
+
+ ParseParasResult parseParasResult = new ParseParasResult();
+ parseParasResult.setBody(body);
+ parseParasResult.setParamMap(paramMap);
+ parseParasResult.setRequestHeaders(requestHeaders);
+ return parseParasResult;
+ }
+
+ @Data
+ private static class ParseParasResult {
+
+ private Object body = null;
+ private Map requestHeaders;
+ private Map paramMap;
+ }
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/RequestBuilder.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/RequestBuilder.java
index 20016cae..22289278 100644
--- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/RequestBuilder.java
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/client/RequestBuilder.java
@@ -105,12 +105,17 @@ public class RequestBuilder {
throw new SnailJobServerException("class not found exception to: [{}]", clintInterface.getName());
}
+ // todo 测试先注释
RpcClientInvokeHandler clientInvokeHandler = new RpcClientInvokeHandler(
nodeInfo.getGroupName(), nodeInfo, failRetry, retryTimes, retryInterval,
retryListener, routeKey, allocKey, failover, executorTimeout, nodeInfo.getNamespaceId());
+ GrpcClientInvokeHandler grpcClientInvokeHandler = new GrpcClientInvokeHandler(
+ nodeInfo.getGroupName(), nodeInfo, failRetry, retryTimes, retryInterval,
+ retryListener, routeKey, allocKey, failover, executorTimeout, nodeInfo.getNamespaceId());
+
return (T) Proxy.newProxyInstance(clintInterface.getClassLoader(),
- new Class[]{clintInterface}, clientInvokeHandler);
+ new Class[]{clintInterface}, grpcClientInvokeHandler);
}
}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcInterceptor.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcInterceptor.java
new file mode 100644
index 00000000..ab609ed0
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcInterceptor.java
@@ -0,0 +1,33 @@
+package com.aizuda.snailjob.server.common.rpc.server;
+
+import io.grpc.Context;
+import io.grpc.Contexts;
+import io.grpc.Metadata;
+import io.grpc.ServerCall;
+import io.grpc.ServerCall.Listener;
+import io.grpc.ServerCallHandler;
+import io.grpc.ServerInterceptor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+@Slf4j
+public class GrpcInterceptor implements ServerInterceptor {
+
+ @Override
+ public Listener interceptCall(final ServerCall serverCall, final Metadata metadata,
+ final ServerCallHandler serverCallHandler) {
+ String fullMethodName = serverCall.getMethodDescriptor().getFullMethodName();
+ long start = System.currentTimeMillis();
+ Context context = Context.current();
+
+ try {
+ return Contexts.interceptCall(context, serverCall, metadata, serverCallHandler);
+ } finally {
+ log.info("method invoked: {} cast:{}ms", fullMethodName, System.currentTimeMillis() - start);
+ }
+ }
+
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcRequestHandlerActor.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcRequestHandlerActor.java
new file mode 100644
index 00000000..19cfdf64
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcRequestHandlerActor.java
@@ -0,0 +1,169 @@
+package com.aizuda.snailjob.server.common.rpc.server;
+
+import akka.actor.AbstractActor;
+import cn.hutool.core.net.url.UrlBuilder;
+import cn.hutool.core.util.StrUtil;
+import com.aizuda.snailjob.common.core.context.SnailSpringContext;
+import com.aizuda.snailjob.common.core.enums.HeadersEnum;
+import com.aizuda.snailjob.common.core.enums.StatusEnum;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.common.core.model.NettyResult;
+import com.aizuda.snailjob.common.core.model.SnailJobRequest;
+import com.aizuda.snailjob.common.core.util.JsonUtil;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.server.common.HttpRequestHandler;
+import com.aizuda.snailjob.server.common.Register;
+import com.aizuda.snailjob.server.common.akka.ActorGenerator;
+import com.aizuda.snailjob.server.common.cache.CacheToken;
+import com.aizuda.snailjob.server.common.dto.GrpcRequest;
+import com.aizuda.snailjob.server.common.exception.SnailJobServerException;
+import com.aizuda.snailjob.server.common.register.ClientRegister;
+import com.aizuda.snailjob.server.common.register.RegisterContext;
+import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
+import com.google.protobuf.Any;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.UnsafeByteOperations;
+import io.grpc.stub.StreamObserver;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.http.DefaultFullHttpResponse;
+import io.netty.handler.codec.http.DefaultHttpHeaders;
+import io.netty.handler.codec.http.FullHttpResponse;
+import io.netty.handler.codec.http.HttpHeaderNames;
+import io.netty.handler.codec.http.HttpHeaderValues;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpMethod;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import io.netty.handler.codec.http.HttpVersion;
+import io.netty.util.CharsetUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+
+import static com.aizuda.snailjob.common.core.alarm.AlarmContext.build;
+
+/**
+ * 处理netty客户端请求
+ *
+ * @author: opensnail
+ * @date : 2023-07-24 09:20
+ * @since 2.1.0
+ */
+@Component(ActorGenerator.REQUEST_HANDLER_ACTOR)
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+@Slf4j
+public class GrpcRequestHandlerActor extends AbstractActor {
+
+ @Override
+ public Receive createReceive() {
+ return receiveBuilder().match(GrpcRequest.class, grpcRequest -> {
+ GrpcSnailJobRequest grpcSnailJobRequest = grpcRequest.getSnailJobRequest();
+ Metadata metadata = grpcSnailJobRequest.getMetadata();
+ final String uri = metadata.getUri();
+ if (StrUtil.isBlank(uri)) {
+ SnailJobLog.LOCAL.error("uri can not be null");
+ return;
+ }
+
+ Map headersMap = metadata.getHeadersMap();
+ String result = "";
+ try {
+ SnailJobRequest request = new SnailJobRequest();
+ Any body = grpcSnailJobRequest.getBody();
+ ByteString byteString = body.getValue();
+ ByteBuffer byteBuffer = byteString.asReadOnlyByteBuffer();
+ Object[] objects = JsonUtil.parseObject(new ByteBufferBackedInputStream(byteBuffer), Object[].class);
+ request.setArgs(objects);
+ result = doProcess(uri, JsonUtil.toJsonString(request), headersMap);
+ } catch (Exception e) {
+ SnailJobLog.LOCAL.error("http request error. [{}]",grpcSnailJobRequest, e);
+ result = JsonUtil.toJsonString(new NettyResult(StatusEnum.NO.getStatus(), e.getMessage(), null, 0));
+ } finally {
+
+ NettyResult nettyResult = JsonUtil.parseObject(result, NettyResult.class);
+ StreamObserver streamObserver = grpcRequest.getStreamObserver();
+ GrpcResult grpcResult = GrpcResult.newBuilder()
+ .setStatus(nettyResult.getStatus())
+ .setMessage(Optional.ofNullable(nettyResult.getMessage()).orElse(StrUtil.EMPTY))
+ .setData(Any.newBuilder()
+ .setValue(UnsafeByteOperations.unsafeWrap(JsonUtil.toJsonString(nettyResult.getData()).getBytes()))
+ .build())
+ .build();
+
+ streamObserver.onNext(grpcResult);
+ streamObserver.onCompleted();
+ getContext().stop(getSelf());
+ }
+
+
+ }).build();
+ }
+
+ private String doProcess(String uri, String content, Map headersMap) {
+
+ Register register = SnailSpringContext.getBean(ClientRegister.BEAN_NAME, Register.class);
+
+ String hostId = headersMap.get(HeadersEnum.HOST_ID.getKey());
+ String hostIp = headersMap.get(HeadersEnum.HOST_IP.getKey());
+ Integer hostPort = Integer.valueOf(headersMap.get(HeadersEnum.HOST_PORT.getKey()));
+ String groupName = headersMap.get(HeadersEnum.GROUP_NAME.getKey());
+ String namespace = headersMap.get(HeadersEnum.NAMESPACE.getKey());
+ String token = headersMap.get(HeadersEnum.TOKEN.getKey());
+
+ if (StrUtil.isBlank(token) || !CacheToken.get(groupName, namespace).equals(token)) {
+ throw new SnailJobServerException("Token authentication failed. [namespace:{} groupName:{} token:{}]",
+ namespace, groupName, token);
+ }
+
+ // 注册版本 此后后续版本将迁移至BeatHttpRequestHandler 只处理beat的心态注册
+ RegisterContext registerContext = new RegisterContext();
+ registerContext.setGroupName(groupName);
+ registerContext.setHostPort(hostPort);
+ registerContext.setHostIp(hostIp);
+ registerContext.setHostId(hostId);
+ registerContext.setUri(uri);
+ registerContext.setNamespaceId(namespace);
+ boolean result = register.register(registerContext);
+ if (!result) {
+ SnailJobLog.LOCAL.warn("client register error. groupName:[{}]", groupName);
+ }
+
+ DefaultHttpHeaders headers = new DefaultHttpHeaders();
+ headersMap.forEach(headers::add);
+
+ UrlBuilder builder = UrlBuilder.ofHttp(uri);
+ Collection httpRequestHandlers = SnailSpringContext.getContext()
+ .getBeansOfType(HttpRequestHandler.class).values();
+ for (HttpRequestHandler httpRequestHandler : httpRequestHandlers) {
+ if (httpRequestHandler.supports(builder.getPathStr())) {
+ return httpRequestHandler.doHandler(content, builder, headers);
+ }
+ }
+
+ throw new SnailJobServerException("No matching handler found. Path:[{}] method:[{}]", builder.getPathStr());
+ }
+
+ /**
+ * write response
+ */
+ private void writeResponse(ChannelHandlerContext ctx, boolean keepAlive, String responseJson) {
+ FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,
+ Unpooled.copiedBuffer(responseJson, CharsetUtil.UTF_8));
+ response.headers().set(HttpHeaderNames.CONTENT_TYPE,
+ HttpHeaderValues.APPLICATION_JSON);
+ response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
+ if (keepAlive) {
+ response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
+ }
+ ctx.writeAndFlush(response);
+ }
+
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcServerConsumerConfig.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcServerConsumerConfig.java
new file mode 100644
index 00000000..76ea99c9
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/GrpcServerConsumerConfig.java
@@ -0,0 +1,46 @@
+package com.aizuda.snailjob.server.common.rpc.server;
+
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import io.grpc.MethodDescriptor;
+import io.grpc.ServerBuilder;
+import io.grpc.ServerCallHandler;
+import io.grpc.ServerServiceDefinition;
+import io.grpc.protobuf.ProtoUtils;
+import io.grpc.stub.ServerCalls;
+import net.devh.boot.grpc.server.serverfactory.GrpcServerConfigurer;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GrpcServerConsumerConfig implements GrpcServerConfigurer {
+
+ @Override
+ public void accept(ServerBuilder> serverBuilder) {
+ // 创建服务定义
+ ServerServiceDefinition serviceDefinition = createServiceDefinition(
+ "UnaryRequest", "unaryRequest",
+ new UnaryRequestHandler());
+ serverBuilder.addService(serviceDefinition);
+ serverBuilder.intercept(new GrpcInterceptor());
+ }
+
+ public static ServerServiceDefinition createServiceDefinition(
+ String serviceName,
+ String methodName,
+ ServerCalls.UnaryMethod unaryMethod) {
+
+ MethodDescriptor methodDescriptor =
+ MethodDescriptor.newBuilder()
+ .setType(MethodDescriptor.MethodType.UNARY)
+ .setFullMethodName(MethodDescriptor.generateFullMethodName(serviceName, methodName))
+ .setRequestMarshaller(ProtoUtils.marshaller(GrpcSnailJobRequest.getDefaultInstance()))
+ .setResponseMarshaller(ProtoUtils.marshaller(GrpcResult.getDefaultInstance()))
+ .build();
+
+ ServerCallHandler callHandler = ServerCalls.asyncUnaryCall(unaryMethod);
+
+ return ServerServiceDefinition.builder(serviceName)
+ .addMethod(methodDescriptor, callHandler)
+ .build();
+ }
+}
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/NettyHttpServer.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/NettyHttpServer.java
index 1405132e..2990db88 100644
--- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/NettyHttpServer.java
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/NettyHttpServer.java
@@ -87,9 +87,9 @@ public class NettyHttpServer implements Runnable, Lifecycle {
@Override
public void start() {
- thread = new Thread(this);
- thread.setDaemon(true);
- thread.start();
+// thread = new Thread(this);
+// thread.setDaemon(true);
+// thread.start();
}
@Override
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/RequestHandlerActor.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/RequestHandlerActor.java
index ca80a2ed..ea7e9ae9 100644
--- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/RequestHandlerActor.java
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/RequestHandlerActor.java
@@ -36,8 +36,8 @@ import java.util.Collection;
* @date : 2023-07-24 09:20
* @since 2.1.0
*/
-@Component(ActorGenerator.REQUEST_HANDLER_ACTOR)
-@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+//@Component(ActorGenerator.REQUEST_HANDLER_ACTOR)
+//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class RequestHandlerActor extends AbstractActor {
diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/UnaryRequestHandler.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/UnaryRequestHandler.java
new file mode 100644
index 00000000..f9b3ffe0
--- /dev/null
+++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/rpc/server/UnaryRequestHandler.java
@@ -0,0 +1,40 @@
+package com.aizuda.snailjob.server.common.rpc.server;
+
+import akka.actor.ActorRef;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcResult;
+import com.aizuda.snailjob.common.core.grpc.auto.GrpcSnailJobRequest;
+import com.aizuda.snailjob.common.core.grpc.auto.Metadata;
+import com.aizuda.snailjob.server.common.akka.ActorGenerator;
+import com.aizuda.snailjob.server.common.dto.GrpcRequest;
+import com.aizuda.snailjob.server.common.dto.NettyHttpRequest;
+import io.grpc.stub.ServerCalls;
+import io.grpc.stub.StreamObserver;
+import io.netty.handler.codec.http.HttpUtil;
+import io.netty.util.CharsetUtil;
+
+/**
+ * @author: opensnail
+ * @date : 2024-08-22
+ */
+public class UnaryRequestHandler implements ServerCalls.UnaryMethod{
+
+ @Override
+ public void invoke(final GrpcSnailJobRequest snailJobRequest, final StreamObserver streamObserver) {
+ // 处理请求并返回响应
+// GrpcResult result = GrpcResult.newBuilder().setMessage("调度成功").setStatus(1).build();
+
+ Metadata metadata = snailJobRequest.getMetadata();
+ GrpcRequest grpcRequest = GrpcRequest.builder()
+ .uri(metadata.getUri())
+ .snailJobRequest(snailJobRequest)
+ .streamObserver(streamObserver)
+ .build();
+
+ ActorRef actorRef = ActorGenerator.requestHandlerActor();
+ actorRef.tell(grpcRequest, actorRef);
+
+// // 发送响应
+// streamObserver.onNext(result);
+// streamObserver.onCompleted();
+ }
+}
diff --git a/snail-job-server/snail-job-server-starter/src/main/java/com/aizuda/snailjob/server/SnailJobServerApplication.java b/snail-job-server/snail-job-server-starter/src/main/java/com/aizuda/snailjob/server/SnailJobServerApplication.java
index b5c6a360..762ec21a 100644
--- a/snail-job-server/snail-job-server-starter/src/main/java/com/aizuda/snailjob/server/SnailJobServerApplication.java
+++ b/snail-job-server/snail-job-server-starter/src/main/java/com/aizuda/snailjob/server/SnailJobServerApplication.java
@@ -36,7 +36,7 @@ public class SnailJobServerApplication {
SpringApplication.run(SnailJobServerApplication.class, args);
}
- @Bean
+// @Bean
public ApplicationRunner nettyStartupChecker(NettyHttpServer nettyHttpServer, ServletWebServerFactory serverFactory) {
return args -> {
// 最长自旋10秒,保证nettyHttpServer启动完成
diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
index 454a1008..19e3fab1 100644
--- a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
+++ b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml
@@ -75,6 +75,9 @@ logging:
# level:
# ## 方便调试 SQL
# com.aizuda.snailjob.template.datasource.persistence.mapper: debug
+grpc:
+ server:
+ port: 1788
snail-job:
retry-pull-page-size: 1000 # 拉取重试数据的每批次的大小