大家好,我有一个流程,该流程使用Java组件执行sftp传输,该Java组件实现了ClamAV在传输之前解析传入的文件。我担心的是,我得到了InputStream类型的对象,但是当我将其作为ClamAV扫描方法的参数时,会收到此错误消息。谢谢您的帮助。
<sftp:connector name="SftpConnector"
validateConnections="true" doc:name="SFTP" />
<sftp:endpoint name="QuerySingleFileEndpoint" host="${sftp.host}"
port="${sftp.port}" autoDelete="false" connector-ref="SftpConnector"
user="${sftp.username}" password="${sftp.password}" path="${sftp.path}"
doc:name="SFTP" exchange-pattern="request-response" responseTimeout="10000" />
<file:connector name="File" autoDelete="false"
streaming="true" validateConnections="true" doc:name="File" />
<flow name="ScanWithClamAvAndTransferFileOK">
<sftp:inbound-endpoint connector-ref="SftpConnector"
host="${sftp.host}" port="${sftp.port}" path="${sftp.path}" user="${sftp.username}"
password="${sftp.password}" responseTimeout="30000" pollingFrequency="10000"
doc:name="Transfer file to SFTP Server" />
<logger level="INFO" message="Le fichier à lire depuis SFTP est : #[payload]"
doc:name="Log
files to read" />
<logger level="INFO"
message="Le nom du fichier à lire
depuis SFTP est : #[message.inboundProperties.originalFilename]"
doc:name="Log
files to read" />
<logger level="INFO"
message="Le fichier du fichier à lire
depuis SFTP est : #[message.payload]"
doc:name="Log files to read" />
<set-variable variableName="fileName" value="#[payload]"
doc:name="Set fileName flowVar" />
<set-variable variableName="nameFile"
value="#[message.inboundProperties.originalFilename]" doc:name="Set fileName flowVar" />
<component class="reporting.AntivirusClamAv" doc:name="Java Antivirus ClamAV" />
</flow>
public class AntivirusClamAv implements Callable, Startable {
private static Logger logger = Logger.getLogger(AntivirusClamAv.class);
private SftpConnector sftpConnector;
private ImmutableEndpoint immutableEndpoint;
private SftpReceiverRequesterUtil util;
@Inject
private MuleContext muleContext;
private ClamAVClient clamAV;
@Override
public void start() throws MuleException {
// Recherche du connecteur SFTP dans le registre Mule
sftpConnector = (SftpConnector) this.muleContext.getRegistry().lookupConnector("SftpConnector");
final EndpointBuilder endpointBuilder = this.muleContext.getRegistry().lookupObject("QuerySingleFileEndpoint");
// Construit un noeud final entrant en fonction des propriétés fournies dans le
// noeud final global
this.immutableEndpoint = endpointBuilder.buildInboundEndpoint();
this.util = new SftpReceiverRequesterUtil(immutableEndpoint);
}
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
// Créer un notificateur qui notifiera les abonnés à la notification de cet
// événement SFTP
final SftpNotifier notifier = new SftpNotifier(sftpConnector, eventContext.getMessage(), immutableEndpoint,
eventContext.getFlowConstruct().getName());
// Obtient le nom du fichier à télécharger à partir d'une variable de flux
final String fileName = eventContext.getMessage().getProperty("nameFile", PropertyScope.INVOCATION);
if (StringUtils.isBlank(fileName)) {
throw new Exception(
"La variable de flux 'fileName' ne peut pas être nulle car elle indique le fichier à extraire du serveur SFTP.");
}
try {
// Télécharger le fichier
final InputStream inputStream = util.retrieveFile(fileName, notifier);
// Nous ne le faisons que parce que org.mule.transport.sftp.SftpStream est
// package-private, mais les sous-classes sont publiques.
if (inputStream instanceof SftpFileArchiveInputStream) {
final SftpFileArchiveInputStream sftpArchiveInputStream = (SftpFileArchiveInputStream) inputStream;
sftpArchiveInputStream.performPostProcessingOnClose(this.shouldDeleteFile());
}
if (inputStream instanceof SftpInputStream) {
final SftpInputStream sftpInputStream = (SftpInputStream) inputStream;
sftpInputStream.performPostProcessingOnClose(this.shouldDeleteFile());
}
logger.debug("Début du Scan du Fichier");
byte[] reply = getReply(inputStream);
return inputStream;
} catch (Exception e) {
throw new DefaultMuleException(MessageFactory.createStaticMessage(
"Un IOException a été lancée tout en essayant de télécharger : "+ fileName), e);
}
}
/**
* Une méthode qui vérifie simplement si un fichier doit être supprimé ou non en
* fonction de la propriété 'autoDelete' défini sur le connecteur ou le noeud
* final global. Si vous souhaitez résoudre ce problème de manière dynamique en
* vous basant sur le message Mule, vous pouvez l'ajouter en tant que paramètre.
*/
protected boolean shouldDeleteFile() {
final String endpointAutoDelete = (String) immutableEndpoint.getProperty("autoDelete");
final boolean connectorAutoDelete = sftpConnector.isAutoDelete();
return connectorAutoDelete || Boolean.valueOf(endpointAutoDelete);
}
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);
}
}
public ClamAVClient getClamAV() {
return clamAV;
}
public void setClamAV(ClamAVClient clamAV) {
this.clamAV = clamAV;
}
}