ProcessingException RESTEASY004655:测试容器无法调用对外部 REST API 服务的请求

问题描述 投票:0回答:1

在我的 OpenLiberty with Microprofile 应用程序中,我使用 Testcontainers 进行集成测试。这些测试需要通过向外部服务发出 POST 请求来与外部服务进行通信,获取响应并继续执行。

到达此点时,通信失败并出现下一个异常:

INFO Slf4jLogConsumer.accept:66 STDOUT: 2024-03-10 09:54:36 6e82989c-b1b4-42d3-b121-a970d2958051 ERROR 
GenericHttpClient.callService:165 Exception occurred RESTEASY004655: Unable to invoke request: 
org.apache.http.conn.ConnectTimeoutException: Connect to external-service-url [external-service-url/10.2.38.235] 
failed: Read timed out for url=external-service-url, reqObject={key=someKey, timeToLive=aTimeToLiveValue}

INFO Slf4jLogConsumer.accept:66 STDOUT: jakarta.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request: 
org.apache.http.conn.ConnectTimeoutException: Connect to external-service-url [external-service-url/10.2.38.235] 
failed: Read timed out

我尝试通过 Postman 向外部服务发送请求,它按预期工作,但我的 Testcontainers 设置似乎存在我无法识别的网络问题。有什么建议吗?

为了更清楚起见,我提供了我的 Testcontainers 配置类。

class TestcontainersConfig extends Specification {

    private static final String LIBERTY_CONFIG_BASE_PATH = 'src/main/liberty/config'
    private static final String CONTAINER_CONFIG_BASE_PATH = 'config'

    static Network network = Network.newNetwork()

    @Shared
    Db2Container db2

    @Shared
    GenericContainer openLiberty

    @Shared
    Sql sql

    def setupSpec() {
        db2 = new Db2Container("icr.io/db2_community/db2:latest")
                .withExposedPorts(50000)
                .withNetwork(network)
                .withNetworkAliases("db2alias")
                .acceptLicense()
                .withReuse(true)
                .waitingFor(Wait.forLogMessage(".*All databases are now active.*\\n", 1))
                .withStartupTimeout(Duration.ofMinutes(3))
                .withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger("db2")))
        db2.start()
        sql = Sql.newInstance(db2.getJdbcUrl(), db2.getUsername(), db2.getPassword(), db2.getDriverClassName())

        openLiberty = new GenericContainer(DockerImageName.parse("icr.io/appcafe/open-liberty:full-java17-openj9-ubi"))
                .withExposedPorts(9080, 9443)
                .withNetwork(network)
                .withEnv('db.usr', db2.getUsername())
                .withEnv('db.pwd', db2.getPassword())
                .withEnv('db.dbname', db2.getDatabaseName())
                .withEnv('db.host', 'db2alias')
                .withEnv('db.port', '50000')
                .withEnv('jdbc.driver.dir', "/jdbc")
                .withCopyFileToContainer(MountableFile.forHostPath("build/libs/file-name.war"), "${CONTAINER_CONFIG_BASE_PATH}/apps/file-name.war")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/server.xml"), "${CONTAINER_CONFIG_BASE_PATH}/server.xml")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/cacerts"), "${CONTAINER_CONFIG_BASE_PATH}/cacerts")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/db2jcc4.jar"), "/jdbc/db2jcc4.jar")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/server.env"), "${CONTAINER_CONFIG_BASE_PATH}/server.env")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/bootstrap.properties"), "${CONTAINER_CONFIG_BASE_PATH}/bootstrap.properties")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/GeneratedSSLInclude.xml"), "${CONTAINER_CONFIG_BASE_PATH}/GeneratedSSLInclude.xml")
                .withCopyFileToContainer(MountableFile.forHostPath("${LIBERTY_CONFIG_BASE_PATH}/users.xml"), "${CONTAINER_CONFIG_BASE_PATH}/users.xml")
                .waitingFor(Wait.forLogMessage(".*CWWKZ0001I: Application .* started in .* seconds.*", 1)).withStartupTimeout(Duration.ofMinutes(2))
                .withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger("openLiberty")))

        openLiberty.start()
    }
}
java docker networking testcontainers open-liberty
1个回答
0
投票

我设法通过创建自定义网络来解决我的问题,如下所示。我通过 VPN 工作,默认情况下 VPN 的 MTU 值设置为 1350。但是我的网络 MTU 值设置为 1500,这意味着在我的请求执行期间发送的包被剪切。

static Network customNetwork = Network.builder()
            .createNetworkCmdModifier({ CreateNetworkCmd createNetworkCmd ->
                createNetworkCmd.withOptions(['mtu': '1350'] as Map)
            })
            .build()
© www.soinside.com 2019 - 2024. All rights reserved.