如何将Camunda ExternalTaskClient绑定到本地自定义端口?
配置Camunda ExternalTaskClient使用自定义出站端口
Camunda ExternalTaskClient底层依赖OkHttp实现HTTP通信,默认会随机选取本地出站端口。要指定固定的自定义出站端口,需要通过配置自定义OkHttpClient并绑定本地端口来实现,具体步骤如下:
实现步骤与代码示例
- 自定义
SocketFactory,绑定指定的本地端口 - 创建配置了该
SocketFactory的OkHttpClient实例 - 将自定义
OkHttpClient传入ExternalTaskClient的构建流程
修改后的完整代码如下:
import org.camunda.bpm.client.ExternalTaskClient; import okhttp3.OkHttpClient; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import javax.net.SocketFactory; public class CustomPortExternalTaskClient { public static void main(String[] args) { // 指定要使用的自定义出站端口 int customLocalPort = 8888; // 自定义SocketFactory,绑定本地端口 SocketFactory customSocketFactory = new SocketFactory() { @Override public Socket createSocket() { Socket socket = new Socket(); try { // 绑定本地端口 socket.bind(new InetSocketAddress(InetAddress.getLocalHost(), customLocalPort)); } catch (Exception e) { throw new RuntimeException("Failed to bind to custom local port", e); } return socket; } @Override public Socket createSocket(String host, int port) { throw new UnsupportedOperationException("Not implemented"); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) { throw new UnsupportedOperationException("Not implemented"); } @Override public Socket createSocket(InetAddress host, int port) { throw new UnsupportedOperationException("Not implemented"); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) { throw new UnsupportedOperationException("Not implemented"); } }; // 创建配置了自定义SocketFactory的OkHttpClient OkHttpClient customOkHttpClient = new OkHttpClient.Builder() .socketFactory(customSocketFactory) .build(); // 构建ExternalTaskClient并传入自定义OkHttpClient ExternalTaskClient client = ExternalTaskClient.create() .baseUrl("http://1.2.3.4:8080/engine-rest") .okHttpClient(customOkHttpClient) .build(); // 订阅主题 client.subscribe("my-topic") .handler(new MyHandler()) .open(); } } // 你的MyHandler实现类 class MyHandler implements org.camunda.bpm.client.task.ExternalTaskHandler { @Override public void execute(org.camunda.bpm.client.task.ExternalTask externalTask, org.camunda.bpm.client.task.ExternalTaskService externalTaskService) { // 处理任务逻辑 externalTaskService.complete(externalTask); } }
关键说明
- 将
customLocalPort的值修改为你需要的自定义出站端口 - 自定义
SocketFactory时,仅实现createSocket()方法即可满足ExternalTaskClient的通信需求,其他方法可抛出UnsupportedOperationException - 通过
ExternalTaskClient.create().okHttpClient(customOkHttpClient)将自定义的HTTP客户端传入,覆盖默认客户端
内容的提问来源于stack exchange,提问作者asdqwessdfxcv
相关产品推荐
相关产品推荐

