当前位置: 首页 > 知识库问答 >
问题:

JAXB不能在docker容器中散集数据-java.lang.IllegalArgumentExctive:读取器不能为空

安奇
2023-03-14

我正在尝试使用docker compose对用Apache Camel编写的集成进行docker化。应用程序结构如下所示:

当我运行应用程序并尝试将数据插入数据库时,数据应以json形式发送到rest api,并在sftp服务器上以csv形式结束。该应用程序在本地运行良好,但在将数据插入数据库后作为docker网络,JAXB无法在两个输出适配器中解组数据。我想稍后使用自己的映射器将它们映射到适当的数据类型。对于每条消息,我都会收到如下错误:

sender_1IllegalArgumentExctive:读取器不能为空
sftp-xecutor.schedule|在sender_1Unmarshallisender_10(Unmarshallisender_1)sftp-xecutor.java:64|在sender_1Unmarshallisender_1(Unmarshallisender_1)sftp-org.apache.camel.processor.|在sender_1JaxbDataFsender_1(JaxbDataFsender_1)sftp-ipeline.process|在sender_1UnmarshalPsender_1(UnmarshalPsender_1)sftp-ipeline.java:184|在sender_1ReDeliveryErrorHandler$SimpleTsender_1(ReDeliveryErrorHsender_1)sftp-org.apache.camel.impl.engine.|在org.apache.camel.impl.engine.DefaultReactiveExecator$Worker.schedule(DefaultReactiveExecutor.java:193)sftp-rocessor.process|在org.apache.camel.impl.engine.DefaultReactiveEjava.lang.Main(DefaultReactiveEcom.sun.xml.bind.v2.runtime.unmarshaller.)sftp-rocessor.java:399|在mpl.unmarshalPmpl.java:370(Pcom.sun.xml.bind.v2.runtime.unmarshaller.)sftp-org.apache.camel.impl.engine.|在mpl.unmarshalCamelInternalPmpl.java:356(CamelInternalPorg.apache.camel.converter.jaxb.)sftp-ormat.java:300|在ormat.unmarshalDefaulAbstractPollingMessageListenerContainer. doReceiveAndExecute(AbstractPollingMessageListenerContainer. java: 318)sftp-sender_1|at org. springframework. jms. listener. AbstractPollingMessageListenerContainer. RecveAndExecute(AbstractPollingMessageListenerContainer. java: 257)sftp-sender_1|at org. springframework. jms. listener. DefaultMessageListenerContainer$AsyncMessageListenerInvoker. java: 1237)sftp-sender_1|at org. springframework. jms. listener. DefaultMessageListenerContainer$AsyncMessageListenerInvoker. java: 1227)sftp-sender_1|at org. springframework. jm

对于rest发送器,错误看起来非常相似。sftp发送方的Dockerfile:

COPY ./target/toSftp-1.0-SNAPSHOT-jar-with-dependencies.jar /app/
COPY ./src/main/resources/properties.properties /app/
WORKDIR /app
ENV PROPERTIES_LOCATION=/app/properties.properties
CMD ["java","-jar","toSftp-1.0-SNAPSHOT-jar-with-dependencies.jar"]

Camel RouteBuilder:

new RouteBuilder() {
    @Override
    public void configure() throws Exception {

        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
        DataFormat dataFormat = new JaxbDataFormat(jaxbContext);
        from("activemq:topic:MATERIALS_ENRICHED?clientId=2137&durableSubscriptionName=foo1")
            .to("log:?level=INFO&showBody=true&showHeaders=true")
            .unmarshal(dataFormat)
            .filter(simple("${body.isDeleted} == 'false'"))
            .bean(CSVMapper.class, "process")
            .to("sftp:{{sftp-user}}@{{sftp-host}}:{{sftp-port}}/{{sftp-user}}/data?password={{sftp-password}}");
    }
}

这就是码头工人的作品。yml:

version: "3.8"
networks:
  materials:

services:
  activemq:
    image: rmohr/activemq
    ports:
      - "61616:61616"
      - "8161:8161"
    networks:
      - materials
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: zaq1@WSX
      MYSQL_DATABASE: Materials
      MYSQL_USER: root
      MYSQL_PASSWORD: zaq1@WSX
    volumes:
      - /storage/docker/mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - materials
  sftp:
    image: atmoz/sftp
    volumes:
      - /storage/docker/sftp:/home/sftp_user/upload
    ports:
      - "2222:22"
    command: sftp_user:zaq1@WSX:1001
    networks:
      - materials
  mock:
    image: mock
    command:
      -logLevel DEBUG -serverPort 1090 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
    ports:
      - "1080:1090"
    networks:
      - materials
  input-adapter:
    build: ./input
    environment:
      PROPERTIES_FILE: "/app/properties.properties"
    depends_on:
     - mysql
     - activemq
    networks:
      - materials
  rest-sender:
    build: ./output/toRest
    environment:
      PROPERTIES_FILE: "/app/properties.properties"
    depends_on:
      - activemq
      - mock
    networks:
      - materials
  sftp-sender:
    build: ./output/toSFTP
    environment:
      PROPERTIES_FILE: "/app/properties.properties"
    depends_on:
      - activemq
      - sftp
    networks:
      - materials

请帮帮我,我已经挣扎了好几天了。谢谢

共有1个答案

柏正平
2023-03-14

您启用了流缓存(https://camel.apache.org/manual/stream-caching.html)吗?

因为,流被读取两次:

>

  • 。至(“日志:?级别=信息

    散集格式

    试着评论1。看看解包是否更有效

  •  类似资料:
    • 我想从JMS中检索一些数据,过滤它们并发送到REST服务器。当我解组这些数据时,我得到一个错误: java.lang.IllegalArgumentException:读取器不能为空 位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshalleImpl.unmarshall0(UnmarshallerImpl.java:370)位于com.sun.x

    • 我的docker撰写。yml是: Dockerfile是: application.properties TestDbConfig.java 当我构建我的应用程序映像时,一切正常,然后我应该启动我的数据库映像和应用程序映像。我用启动db,我得到了:。我的DbConfig有问题吗?如果我在本地启动我的应用程序,而不是在Docker容器中启动我的应用程序,我的应用程序成功连接到数据库,我可以做我想做的

    • 启动一个名为nginx的Dockerized应用程序,然后在其中执行bash。令我吃惊的是,我在那个容器里找不到vim、vi甚至是yum。 请原谅我,因为我是非常新的docker和学习。 下面的命令可以用来再现问题。 我的主机是Ubuntu16.04,我使用的是最新的docker-engine和docker cli 请不要使用我的主机名(我已从15.04升级):slight_smile: 如有任何

    • 我在Centos7机器上安装了Docker,DNS不能在容器中工作。 因此,如果我在主机上运行,它将正确解析。但是,如果我执行,我会得到: 更新:这不仅发生在busybox上,在其他平台上也是如此。我的主要问题是无法运行从以下DockerFile构建的映像容器: docker-compose.yml: 这项服务运行良好,并在我的个人机器上运行最新的Ubuntu进行了测试

    • 我已经创建并将php-apache容器与MYSQL容器链接起来。但是当我试图从php文件中使用PDO建立连接时,我得到了错误。有人知道怎么修好它吗?多谢了。 PDO错误: 致命错误:未捕获的PDOException:PDO::__Construct():php_network_getAddress:getaddrinfo失败:名称或服务在/var/www/html/index.php:3 Stac

    • 假设我有一堆不同的docker容器,它们都是基于Python3.5的。在Ubuntu系统上使用Python3.5将所有任务作为后台进程同时运行(假设是5、10或20个容器),这一任务是否会使用更多/更少的资源?