将蒸汽转化为骡子 4 中的物体

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

我正在使用 s3 连接器读取 tar 文件并将数据发送到 java 类以解压缩 tar 文件并将提取的文件放入目标文件夹。这个过程在 mule3 中运行良好,但现在我们将其迁移到 mule4,这里我们面临问题。

目前在 mule 4 中,我首先创建 java 类的实例,并将该实例添加到 java 调用组件中。下面请找到 mule 和 java 代码。请建议或更正代码以在下面的代码中成功运行。

    <java:new doc:name="Creating an Instance of TarExtraction" doc:id="5aa0e7ea-218c-4b46-b071-b76a2fb2a44f" class="com.int100b.TarExtraction" constructor="TarExtraction()" target="TarExtraction"/>

    <java:invoke method="onCall(java.lang.Object)" doc:name="Invoke onCall" doc:id="20c83a08-b684-4e37-bc82-bdbff5f4eed1" instance="#[vars.TarExtraction]" class="com.int100b.TarExtraction">

     <java:args ><![CDATA[#[{
     arg0: payload
    }]]]></java:args>
    </java:invoke>

java代码:

            package com.int100b;
            import java.io.File;
            import java.io.FileOutputStream;
            import java.io.InputStream;
            import java.util.ArrayList;
            import java.util.List;

            import org.springframework.beans.factory.annotation.Value;
            import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
            import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
            import org.apache.logging.log4j.LogManager;
            import org.apache.logging.log4j.Logger;
            public class TarExtraction { //implements Callable {
            @Value("/tmp/int100")
            String OUTPUT_FOLDER;
            //private static final String OUTPUT_FOLDER = "/tmp/int100";
            private static final Logger LOG = LogManager.getLogger(TarExtraction.class);
            public TarExtraction() {}
            public Object onCall(Object payload) throws Exception {
            //  public Object onCall(MuleEventContext eventContext) throws Exception {
            byte[] buffer = new byte[1024];
            List<String> datfileName = new ArrayList<String>();
            InputStream context = (InputStream) payload;
            //InputStream context = (InputStream) eventContext.getMessage().getPayload();
            TarArchiveInputStream tar = new TarArchiveInputStream(context);
            TarArchiveEntry te = tar.getNextTarEntry();
            while (te != null) {
            if (!te.isDirectory()) {
            String fileName = te.getName();
            if(fileName.contains("/")){
            fileName = fileName.substring(fileName.lastIndexOf("/")+1);
            }
            File newFile = new File(OUTPUT_FOLDER + File.separator + fileName);
            LOG.info("file unzip : " + newFile.getAbsoluteFile());
            datfileName.add(fileName);
            new File(newFile.getParent()).mkdirs();
            FileOutputStream fos = new FileOutputStream(newFile);
            int len;
            while ((len = tar.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
            }
            fos.close();
            }
            te = tar.getNextTarEntry();
            }
            tar.close();
            LOG.info("Tar files " + datfileName);
            return datfileName;
            }

            }

错误:

        Message : Invocation of Method 'onCall(java.lang.Object)' from Class 'com.int100b.TarExtraction' with arguments [org.mule.runtime.core.internal.streaming.bytes.ManagedCursorStreamProvider arg0] resulted in an error.

        Expected arguments are [java.lang.Object payload].

        Cause: java.lang.ClassCastException - org.mule.runtime.core.internal.streaming.bytes.ManagedCursorStreamProvider cannot be cast to java.io.InputStream
mule dataweave mulesoft mule4
1个回答
0
投票

导致该错误的原因是您的 Java 代码假设 Object 参数是一个 InputStream,但在 Mule 4 中这是一个错误的假设:

        InputStream context = (InputStream) payload;

可能这在 Mule 3 中有效。一般来说,当预期有一个对象参数时,它是特定的东西,会导致混乱。

尝试让 Mule 和 Java 模块为你处理这个问题:

  1. 确保您的项目中有最新的 Java 模块版本
  2. 更改方法签名以期望输入流作为参数:
    public Object onCall(InputStream payload)...

参考请参阅:https://help.mulesoft.com/s/article/java-invoke-inputstream

如果仍然有问题,您可能需要将文件输入源更改为不可重复流。

© www.soinside.com 2019 - 2024. All rights reserved.