Docker 无法从Apache beam中的本地仿真器读取发布/订阅消息

Docker 无法从Apache beam中的本地仿真器读取发布/订阅消息,docker,apache-beam,google-cloud-pubsub,Docker,Apache Beam,Google Cloud Pubsub,我正在尝试使用DirectRunner运行一个简单的apachebeam管道,该管道从发布/订阅中读取消息并将消息写入磁盘 当我在GCP上运行它时,管道工作正常,但是当我尝试在本地Pub/Sub仿真器上运行它时,它似乎什么都没有做 我正在使用一个自定义的Options类,它扩展了org.apache.beam.sdk.io.gcp.pubsub.PubsubOptions类 公共接口选项扩展了PubsubOptions{ @说明(“从中读取输入的发布/订阅”) @必需的 ValueProvide

我正在尝试使用
DirectRunner
运行一个简单的apachebeam管道,该管道从发布/订阅中读取消息并将消息写入磁盘

当我在GCP上运行它时,管道工作正常,但是当我尝试在本地Pub/Sub仿真器上运行它时,它似乎什么都没有做

我正在使用一个自定义的
Options
类,它扩展了
org.apache.beam.sdk.io.gcp.pubsub.PubsubOptions

公共接口选项扩展了PubsubOptions{
@说明(“从中读取输入的发布/订阅”)
@必需的
ValueProvider getInputSubscription();
作废setInputSubscription(ValueProvider ValueProvider);
}
管道相当简单

管道
.apply(“读取发布/订阅消息”,PubsubIO.readMessagesWithAttributes()
.fromSubscription(options.getInputSubscription())
.apply(“添加固定窗口”,window.into(FixedWindows.of(Duration.standardSeconds(window\u SIZE))))
.apply(“将发布/订阅转换为字符串”,新建PubSubMessageToString())
.apply(“将发布/订阅消息写入本地磁盘”,new WriteOneFilePerWindow());
使用以下选项执行管道

mvn编译执行:java\
-Dexec.mainClass=DefaultPipeline\
-Dexec.cleanupDaemonThreads=false\
-Dexec.args=”\
--项目=我的项目\
--inputSubscription=项目/我的项目/订阅/我的订阅\
--PubSubrotURL=http://127.0.0.1:8681 \
--runner=DirectRunner“
我正在使用Pub/Sub emulator docker image并使用以下命令执行它:

docker run--rm-ti-p 8681:8681-e PUBSUB_PROJECT1=我的项目,主题:我的订阅marcelcorso/gcloud PUBSUB仿真器:最新版本

是否需要更多配置才能完成此工作?

您可以通过向本地仿真器发出手动HTTP请求(通过curl)来对其进行故障排除,如下所示:

$ curl -d '{"messages": [{"data": "c3Vwc3VwCg=="}]}' -H "Content-Type: application/json" -X POST localhost:8681/v1/projects/my-project/topics/topic:publish
{
  "messageIds": ["5"]
}
$ 

$ curl -d '{"returnImmediately":true, "maxMessages":1}' -H "Content-Type: application/json" -X POST localhost:8681/v1/projects/my-project/subscriptions/my-subscription:pull
{
  "receivedMessages": [{
    "ackId": "projects/my-project/subscriptions/my-subscription:9",
    "message": {
      "data": "c3Vwc3VwCg==",
      "messageId": "5",
      "publishTime": "2019-04-30T17:26:09Z"
    }
  }]
}
$
或者将gcloud命令行工具指向它:

$ CLOUDSDK_API_ENDPOINT_OVERRIDES_PUBSUB=localhost:8681 gcloud pubsub topics list

另外,请注意,当emulator出现时,它会从头开始创建主题和订阅,因此上面没有消息。如果您的管道希望立即拉取订阅上的消息,这就解释了为什么它看起来“卡住”了。请注意,当您在GCP上运行管道时,您在那里使用的主题和订阅上可能已经有消息。

如果您设置了
GOOGLE\u应用程序\u凭据,则Apache Beam管道无法从本地发布/订阅仿真器读取


一旦我删除了这个指向GCP服务帐户的环境变量,管道就会与本地发布/订阅仿真器无缝地工作。

您是否能够提供针对GCP运行管道时使用的类似的
mvn
命令?只是pubsubRootUrl=没有作为参数提供吗?是的,没有pubsubRootUrl=127.0.0.1:8681参数也一样。我有一个小应用程序,它定期将事件发布到本地Pub/Sub模拟器,因此当我使用curl命令拉取它们时,会有大量消息。