Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在谷歌数据流中使用谷歌地图地理编码API时无法访问网络_Java_Google Cloud Platform_Okhttp_Dataflow_Google Geocoding Api - Fatal编程技术网

Java 在谷歌数据流中使用谷歌地图地理编码API时无法访问网络

Java 在谷歌数据流中使用谷歌地图地理编码API时无法访问网络,java,google-cloud-platform,okhttp,dataflow,google-geocoding-api,Java,Google Cloud Platform,Okhttp,Dataflow,Google Geocoding Api,我正在数据流作业中使用GoogleMapsGeocodeAPI()。My DoFn在安装时准备GeoApiContext。流程元素的功能如下所示: public void processElement(ProcessContext c){ 字符串地址=c.element().get(“地址”).toString(); 字符串id=c.element().get(“id”).toString(); Gson Gson=new GsonBuilder().create(); 试一试{ Geocodi

我正在数据流作业中使用GoogleMapsGeocodeAPI()。My DoFn在安装时准备GeoApiContext。流程元素的功能如下所示:

public void processElement(ProcessContext c){
字符串地址=c.element().get(“地址”).toString();
字符串id=c.element().get(“id”).toString();
Gson Gson=new GsonBuilder().create();
试一试{
GeocodingResult[]results=GeocodingApi.newRequest(this.geocodeContext).address(address.language(“pt-BR”).components(ComponentFilter.country(“BR”)).await();
如果(results.length==0){
TableRow outputRow=新建TableRow();
outputRow.set(“Id”,Id);
c、 输出(outputRow);
}否则{
对于(GeocodingResult r:结果){
TableRow outputRow=convertTableRow(gson.toJson(r.toString());
outputRow.set(“Id”,Id);
c、 输出(outputRow);
}
}
}捕获(APIE){
LOGGER.error(“地址{},地址e上的ApiException”);
}捕捉(中断异常e){
错误(“地址{},地址e上的InterruptedException);
}捕获(IOE异常){
错误(“地址上的IOException:{}”,地址,e);
}
}
此代码在本地运行良好,但部署到数据流时会引发网络错误:

exception:“java.net.ConnectException:无法连接到maps.googleapis.com/2607:f8b0:4001:c05:0:0:0:5f:443
位于okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:265)
位于okhttp3.internal.connection.RealConnection.connect(RealConnection.java:183)
位于okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:224)
在okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java:108)
位于okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:88)
位于okhttp3.internal.connection.Transmitter.newExchange(transmiter.java:169)
在okhttp3.internal.connection.ConnectionInterceptor.intercept(ConnectInterceptor.java:41)处
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:142)中
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:117)上
在okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:142)中
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:117)上
位于okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:142)中
位于okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:142)中
在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:117)上
在okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229)
在okhttp3.RealCall$AsyncCall.execute(RealCall.java:172)
运行(NamedRunnable.java:32)
位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
位于java.base/java.lang.Thread.run(Thread.java:834)
原因:java.net.ConnectException:无法访问网络(连接失败)
位于java.base/java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
位于java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
位于java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
位于java.base/java.net.socksocketimpl.connect(socksocketimpl.java:403)
位于java.base/java.net.Socket.connect(Socket.java:591)
位于okhttp3.internal.platform.platform.connectSocket(platform.java:130)
位于okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:263)
…还有22个
我已经确保生成的VM可以访问internet,甚至可以从容器内部ping maps.googleapis.com端点:

USER@test-geocode-07020834-qmrj-harness-3k2l ~ $ docker container ls
CONTAINER ID        IMAGE                                             COMMAND                  CREATED             STATUS              PORTS               NAMES
b2fd123138aa        3a1cb7aedd54                                      "/opt/google/dataflo…"   6 minutes ago       Up 5 minutes                            k8s_healthchecker_dataflow-test-geocode-07020834-qmrj-harness-3k2l_default_5648e9815f2ca5beea8b0eb945e12d1f_0
086e36c3dd23        4127911f4769                                      "/opt/google/dataflo…"   6 minutes ago       Up 5 minutes                            k8s_vmmonitor_dataflow-test-geocode-07020834-qmrj-harness-3k2l_default_5648e9815f2ca5beea8b0eb945e12d1f_0
2890fa415af5        664bd8972b23                                      "/opt/google/dataflo…"   6 minutes ago       Up 6 minutes                            k8s_shuffle_dataflow-test-geocode-07020834-qmrj-harness-3k2l_default_5648e9815f2ca5beea8b0eb945e12d1f_0
eea757bf6be7        gcr.io/cloud-dataflow/v1beta3/beam-java11-batch   "/opt/google/dataflo…"   6 minutes ago       Up 6 minutes                            k8s_java-batch_dataflow-test-geocode-07020834-qmrj-harness-3k2l_default_5648e9815f2ca5beea8b0eb945e12d1f_0
b636784118f5        k8s.gcr.io/pause:3.1                              "/pause"                 6 minutes ago       Up 6 minutes                            k8s_POD_dataflow-test-geocode-07020834-qmrj-harness-3k2l_default_5648e9815f2ca5beea8b0eb945e12d1f_0
lucas@test-geocode-07020834-qmrj-harness-3k2l ~ $ docker exec -it eea /bin/sh
# ping maps.googleapis.com                                               
PING maps.googleapis.com (172.217.214.95) 56(84) bytes of data.
64 bytes from 172.217.214.95: icmp_seq=1 ttl=115 time=1.08 ms
64 bytes from 172.217.214.95: icmp_seq=2 ttl=115 time=1.28 ms
64 bytes from 172.217.214.95: icmp_seq=3 ttl=115 time=1.15 ms
64 bytes from 172.217.214.95: icmp_seq=4 ttl=115 time=1.41 ms
^C
--- maps.googleapis.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.089/1.235/1.414/0.131 ms
# 
关于版本,我使用的是最新的beam版本(2.22.0)和最新的google地图版本(0.14.0)

不知道还有什么可以看,任何帮助都是非常感谢的

更新

问题似乎在于,请求是使用ipv6地址完成的。然而,GCE计算机似乎不支持ipv6,并且呼叫在不返回ipv4的情况下失败

考虑到这一点,似乎没有办法解决这个问题:

  • 无法使用数据流将JVM配置为首选ipv4地址(忽略JVM标志)
  • 也没有办法定制GCE机器(因为使用了基本数据流映像)
  • 该库似乎没有打开任何配置ipv4或ipv6的选项

谢谢

在从2.17升级到2.24并从Java 8更改为Java 11之后,我遇到了完全相同的问题。在尝试在2.24和Java 11上解决这个问题之后,我放弃了,回到了8,现在它可以工作了

我在任何地方都找不到文档,但看起来使用的userAgent就是基于此-

当我用Java8构建自可执行文件时,Dataflow将userAgent显示为 Apache_Beam_SDK_for_Java/2.24.0(JRE_8_环境)


Java 11显示了Apache_Beam_SDK_for_Java/2.24.0(JDK_11_环境)

在从2.17升级到2.24并从Java 8更改为Java 11后,我遇到了完全相同的问题。在尝试在2.24和Java 11上解决这个问题后,我放弃了,返回了