无法从终端运行Temporal工作流的问题求助
Temporal工作流Jar包运行报错问题
问题现象
通过终端执行命令java -jar build/libs/app-0.0.1-SNAPSHOT.jar运行Temporal工作流Jar包时,抛出如下异常:
Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:271) at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:252) at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:165) at io.temporal.api.workflowservice.v1.WorkflowServiceGrpc$WorkflowServiceBlockingStub.getSystemInfo(WorkflowServiceGrpc.java:4139) at io.temporal.serviceclient.SystemInfoInterceptor.getServerCapabilitiesOrThrow(SystemInfoInterceptor.java:95) at io.temporal.serviceclient.ChannelManager.lambda$getServerCapabilities$3(ChannelManager.java:330) at io.temporal.internal.retryer.GrpcRetryer.retryWithResult(GrpcRetryer.java:60) at io.temporal.serviceclient.ChannelManager.connect(ChannelManager.java:297) at io.temporal.serviceclient.WorkflowServiceStubsImpl.connect(WorkflowServiceStubsImpl.java:161) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at io.temporal.internal.WorkflowThreadMarker.lambda$protectFromWorkflowThread$1(WorkflowThreadMarker.java:83) at jdk.proxy1/jdk.proxy1.$Proxy0.connect(Unknown Source) at io.temporal.worker.WorkerFactory.start(WorkerFactory.java:210) at com.hok.furlenco.workflow.refundStatusSync.RefundStatusSyncSaga.createWorkFlow(RefundStatusSyncSaga.java:41) at com.hok.furlenco.workflow.refundStatusSync.RefundStatusSyncSaga.main(RefundStatusSyncSaga.java:17) Caused by: java.nio.channels.UnsupportedAddressTypeException at java.base/sun.nio.ch.Net.checkAddress(Net.java:146) at java.base/sun.nio.ch.Net.checkAddress(Net.java:157) at java.base/sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:816) at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) at io.grpc.netty.shaded.io.netty.util.internal.SocketUtils$3.run(SocketUtils.java:91) at io.grpc.netty.shaded.io.netty.util.internal.SocketUtils$3.run(SocketUtils.java:88) at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) at io.grpc.netty.shaded.io.netty.util.internal.SocketUtils.connect(SocketUtils.java:88) at io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel.doConnect(NioSocketChannel.java:322) at io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect(AbstractNioChannel.java:248) at io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.connect(DefaultChannelPipeline.java:1342) at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeConnect(AbstractChannelHandlerContext.java:548) at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.connect(AbstractChannelHandlerContext.java:533) at io.grpc.netty.shaded.io.netty.channel.ChannelDuplexHandler.connect(ChannelDuplexHandler.java:54) at io.grpc.netty.shaded.io.grpc.netty.WriteBufferingAndExceptionHandler.connect(WriteBufferingAndExceptionHandler.java:157) at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeConnect(AbstractChannelHandlerContext.java:548) at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.access$1000(AbstractChannelHandlerContext.java:61) at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext$9.run(AbstractChannelHandlerContext.java:538) at io.grpc.netty.shaded.io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) at io.grpc.netty.shaded.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:833)
该应用在IDE中运行正常,本地Temporal服务器以Docker容器形式部署,核心代码如下:
// gRPC stubs wrapper that talks to the local docker instance of temporal service. WorkflowServiceStubs service = WorkflowServiceStubs.newLocalServiceStubs(); // client that can be used to start and signal workflows WorkflowClient client = WorkflowClient.newInstance(service); // worker factory that can be used to create workers for specific task queues WorkerFactory factory = WorkerFactory.newInstance(client); // Worker that listens on a task queue and hosts both workflow and activity implementations. Worker worker = factory.newWorker(TASK_QUEUE); // Workflows are stateful. So you need a type to create instances. worker.registerWorkflowImplementationTypes(RefundSyncWorkflowImpl.class); // Activities are stateless and thread safe. So a shared instance is used. RefundStatusActivities tripBookingActivities = new RefundStatusActivitiesImpl(); worker.registerActivitiesImplementations(tripBookingActivities); // Start all workers created by this factory. factory.start(); System.out.println("Worker started for task queue: " + TASK_QUEUE); // now we can start running instances of our saga - its state will be persisted WorkflowOptions options = WorkflowOptions.newBuilder().setTaskQueue(TASK_QUEUE) .setWorkflowId("1") .setWorkflowIdReusePolicy( WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE) .setCronSchedule("* * * * *") .build(); RefundSyncWorkflow refundSyncWorkflow = client.newWorkflowStub(RefundSyncWorkflow.class, options); refundSyncWorkflow.syncRefundStatus();
问题分析与解决方案
UnsupportedAddressTypeException表明应用无法解析Temporal服务器的地址,导致无法建立gRPC连接。IDE运行正常但Jar包运行异常,核心原因是地址解析逻辑在打包后的环境中出现差异,对应解决方法如下:
1. 显式指定Temporal服务器地址
默认的newLocalServiceStubs()依赖本地默认配置,打包后可能无法正确识别localhost或容器内部地址。建议直接指定Temporal服务器的外部可访问地址:
// 替换为你的Docker容器映射的主机地址和端口(默认Temporal端口为7233) WorkflowServiceStubs service = WorkflowServiceStubs.newInstance( WorkflowServiceStubsOptions.newBuilder() .setTarget("127.0.0.1:7233") .build() );
2. 检查Docker端口映射
确保Temporal容器的7233端口已正确映射到主机:
- 执行
docker ps查看容器端口映射,确认存在0.0.0.0:7233->7233/tcp或类似配置 - 若未映射,启动容器时添加端口映射参数:
docker run -p 7233:7233 temporalio/auto-setup:latest
3. 验证网络连通性
在Jar包运行的环境中,执行telnet 127.0.0.1 7233或nc -zv 127.0.0.1 7233,确认主机能正常访问Temporal端口。
4. 统一JDK版本
确保打包使用的JDK版本与运行环境一致,避免因JDK版本差异导致的网络API行为不同。
内容的提问来源于stack exchange,提问作者user3747182
相关产品推荐
相关产品推荐

