请帮助我使用m子esb和clamAV

时间:2019-07-04 09:54:18

标签: java sftp payload mule-esb

实际上,在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();
    }

2 个答案:

答案 0 :(得分:0)

这里的问题(我想)是,一旦ClamAV消耗了InputStream,就没有其他可传递的东西了。我有一个类似的用例,其中接收到一个InputStream,并将使用ClamAV对其进行扫描并将其传递给数据库。通过将InputStream组播到两个OutputStream中,可以解决此问题,然后再由两个InputStream读取,其中一个InputStreams进入数据库,一个到ClamAV。然后需要同时读取这两个流以继续该流。如果病毒扫描失败,则该事务将被中止并回滚,并且将删除发送到数据库的所有内容。

在您的情况下,这种方法可能会有点困难。另一种选择是将InputStream读入一个字节数组,然后创建此字节数组的流,将其发送到ClamAV,如果通过,则将其传递。请注意,这将意味着整个文件将保存在内存中,因此请确保Mule有足够的空间。

答案 1 :(得分:0)

事实上,问题在于我可以在有效负载级别看到缓冲区中的字节数组,但是我将对象传递给Clamav扫描方法,它返回一个错误,指出对象为空:

enter image description here

这是我的错误:

  

错误2019-07-04 10:51:30,873 [[reporting] .ScanWithClamAvAndTransferFileOK.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy:

     

消息:java.lang.IllegalStateException:文件阅读器,原因:null。导致异常的组件是:DefaultJavaComponent {ScanWithClamAvAndTransferFileOK.component.853887645}。

查看图片:

enter image description here

相关问题