首页 > 解决方案 > cURL POST 命令无响应

问题描述

我正在学习Event Sourcing and CQRS并在 Youtube 上找到一个不错的视频系列。该系列在Github中有一个代码存储库。它使用 3 个模块(baristaordersbeans)以分布式方式相互通信,以管理来自客户的咖啡订单。运行指令提供如下,

  1. 启动 Apache Kafka 代理,例如使用 Docker compose:https ://github.com/wurstmeister/kafka-docker 。将 配置KAFKA_ADVERTISED_HOST_NAME为您相应的 IP 地址。

  2. kafka.properties使用bootstrap.servers=<your-IP>:9092. _

  3. 构建并运行各个实例。在每个orders/,beans/barista/目录上,执行build-run-local.sh. 这将构建 Gradle 项目、构建 Docker 映像并启动给定服务的新实例。

我无缝地遵循这些步骤。在构建并运行各个实例之后,我执行命令,

$ curl http://localhost:8002/beans/resources/beans -i

    HTTP/1.1 200 OK
    Connection: keep-alive
    Content-Type: application/json
    Content-Length: 2
    Date: Tue, 08 Jan 2019 13:16:12 GMT

然后,我尝试使用该命令发布一个 bean,

$ curl http://localhost:8002/beans/resources/beans -i -XPOST \
      -H 'content-type: application/json' \
      -d '{"beanOrigin": "Colombia", "amount": 10}'

此时,终端被挂起并且没有响应。我查看了各个模块并查看了Dockerfilebuild-run-local.shwith 执行指令。例如,下面提供Dockerfilebeans模块的,

$ cat Dockerfile 

  FROM sdaschner/wildfly:javaee8-kafka-b1

  COPY build/libs/beans.war $DEPLOYMENT_DIR

提供beans/build-run-local.sh

$ cat build-run-local.sh 

#!/bin/bash
cd ${0%/*}
set -eu

gradle build
docker build --rm -t scalable-coffee-shop-beans:1 .
docker run --rm --name beans -p 8002:8080 scalable-coffee-shop-beans:1

当我运行文件时,我得到输出(初始 lnes),

$ ./build-run-local.sh 

BUILD SUCCESSFUL in 0s
5 actionable tasks: 5 up-to-date
Sending build context to Docker daemon  310.3kB

Step 1/2 : FROM sdaschner/wildfly:javaee8-kafka-b1
 ---> 7a638cd4a3c8

Step 2/2 : COPY build/libs/beans.war $DEPLOYMENT_DIR
 ---> Using cache
 ---> ef4901bbea66
Successfully built ef4901bbea66
Successfully tagged scalable-coffee-shop-beans:1
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss/wildfly

  JAVA: /usr/lib/jvm/java/bin/java

  JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

我怀疑 POST 命令被挂起,因为我可能需要更多我缺少的配置。例如,我没有配置任何$DEPLOYMENT_DIRJBOSS_HOMEJAVA_OPTS前面提到的。

我承认我对Docker. 但是,我发现这是执行Docker文件信息的命令,

# get 2 instructions from the `Dockerfile` and excutes them. 
$ docker build --rm -t scalable-coffee-shop-beans:1 .

Sending build context to Docker daemon  310.3kB
Step 1/2 : FROM sdaschner/wildfly:javaee8-kafka-b1
 ---> 7a638cd4a3c8

Step 2/2 : COPY build/libs/beans.war $DEPLOYMENT_DIR
 ---> Using cache
 ---> ef4901bbea66
Successfully built ef4901bbea66
Successfully tagged scalable-coffee-shop-beans:1

谁能帮我正确运行该应用程序?

更新:

我遵循评论中的建议并放置日志消息。我得到的是:

03:26:12,271 INFO  [com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeansResource] (default task-1) Bean origin = Colombia , Amount = 10

03:26:12,273 INFO  [com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeanCommandService] (default task-1) Bean origin = Colombia , Amount = 1

因此,似乎com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeanCommandService确实正确获取了信息并调用了类的方法,com.sebastian_daschner.scalable_coffee_shop.events.control.EventProducer如下所示,

public void storeBeans(final String beanOrigin, final int amount) {


        LOGGER.log(Level.INFO, "Bean origin = " + beanOrigin +
                " " + ", Amount = " + amount);
        eventProducer.publish(new BeansStored(beanOrigin, amount));
    }

在里面EventProducer,它调用publish下面提供的方法,

public void publish(CoffeeEvent... events) {
        try {

            LOGGER.log(Level.INFO, "Events = " + Arrays.toString(events));

            producer.beginTransaction();
            send(events);
            producer.commitTransaction();
        } catch (ProducerFencedException e) {


            LOGGER.log(Level.SEVERE, e.toString(), e);
            producer.close();
        } catch (KafkaException e) {

            LOGGER.log(Level.SEVERE, e.toString(), e);
            producer.abortTransaction();
        }
    }

此时,我没有从代码中得到任何日志,

LOGGER.log(Level.INFO, "Events = " + Arrays.toString(events));

我假设它与 Kafka 有关,并且下面的代码不执行:

     producer.beginTransaction();
     send(events);
     producer.commitTransaction();

正如我准确指出的那样,现在有没有人可以帮助找出问题所在?

标签: javadockerapache-kafkacqrsevent-sourcing

解决方案


推荐阅读