我正在使用 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
导致该错误的原因是您的 Java 代码假设 Object 参数是一个 InputStream,但在 Mule 4 中这是一个错误的假设:
InputStream context = (InputStream) payload;
可能这在 Mule 3 中有效。一般来说,当预期有一个对象参数时,它是特定的东西,会导致混乱。
尝试让 Mule 和 Java 模块为你处理这个问题:
public Object onCall(InputStream payload)...
参考请参阅:https://help.mulesoft.com/s/article/java-invoke-inputstream
如果仍然有问题,您可能需要将文件输入源更改为不可重复流。