实际上,在Mule ESB中,我使用SFTP连接器传输文件,并使用Java组件来实现ClamAV以便对其进行分析。 我担心的是,当有效负载向我发送String时,我无法恢复有效负载中的文件以传递给期望InputStream的扫描方法。 有没有人将ClamAV与Mule ESB一起使用
谢谢
<flow name="ScanWithClamAvAndTransferFileOK">
<sftp:inbound-endpoint connector-ref="SFTP" host="${sftp.host}" port="${sftp.port}" path="${sftp.path}" user="${sftp.user}" password="${sftp.password}" responseTimeout="30000" doc:name="Transfer file to SFTP Server"/>
<component class="reporting.ClamAvTranformer" doc:name="Antivirus ClamAV"/>
<file:outbound-endpoint path="/home/test" connector-ref="File" responseTimeout="10000" outputPattern="#[function:datestamp]-#[message.inboundProperties['originalFilename']]" doc:name="File"/>
</flow>
public Object onCall(MuleEventContext eventContext) throws Exception {
// TODO Auto-generated method stub
MuleMessage message = eventContext.getMessage();
byte[] reply = getReply((SftpInputStream) message.getPayload());
return handleReply(reply);
}
private Object handleReply(byte[] reply) throws Exception{
ResponseDTO response = new ResponseDTO();
if (ClamAVClient.isCleanReply(reply)) {
response.setResponseType("Scan réussi avec succès !");
} else {
response.setResponseType("Scan rejeté !");
response.setMessage(byteToString(reply));
//response.setResultType(ResultType.BUSINESS_FAULT.toString());
}
return response;
}
private byte[] getReply(InputStream stream) throws IllegalStateException{
try {
return clamAV.scan(stream);
} catch (Exception e) {
throw new IllegalStateException("Le fichier ne peut pas etre scanner, cause : "+e.getMessage(),e);
}
}
private String byteToString(byte[] reply) throws Exception{
return new String(reply, "UTF-8").trim();
}
答案 0 :(得分:0)
这里的问题(我想)是,一旦ClamAV消耗了InputStream,就没有其他可传递的东西了。我有一个类似的用例,其中接收到一个InputStream,并将使用ClamAV对其进行扫描并将其传递给数据库。通过将InputStream组播到两个OutputStream中,可以解决此问题,然后再由两个InputStream读取,其中一个InputStreams进入数据库,一个到ClamAV。然后需要同时读取这两个流以继续该流。如果病毒扫描失败,则该事务将被中止并回滚,并且将删除发送到数据库的所有内容。
在您的情况下,这种方法可能会有点困难。另一种选择是将InputStream读入一个字节数组,然后创建此字节数组的流,将其发送到ClamAV,如果通过,则将其传递。请注意,这将意味着整个文件将保存在内存中,因此请确保Mule有足够的空间。
答案 1 :(得分:0)
事实上,问题在于我可以在有效负载级别看到缓冲区中的字节数组,但是我将对象传递给Clamav扫描方法,它返回一个错误,指出对象为空:
这是我的错误:
错误2019-07-04 10:51:30,873 [[reporting] .ScanWithClamAvAndTransferFileOK.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy:
消息:java.lang.IllegalStateException:文件阅读器,原因:null。导致异常的组件是:DefaultJavaComponent {ScanWithClamAvAndTransferFileOK.component.853887645}。
查看图片: