J'ai une application Spring Boot très simple, qui fournit quelques points de terminaison reposants et cela est supposé conduire un fichier sftp téléchargé sur un serveur sftp. Mon exigence est que s'il y a plus d'un fichier, les fichiers doivent être mis en file d'attente. Je m'attendais à réaliser cela avec le comportement par défaut du flux de travail d'intégration de Spring sftp, car j'ai lu que DirectChannel met automatiquement en file d'attente les fichiers. Pour tester le comportement, procédez comme suit:Points de terminaison REST dans Spring Intégration faire des canaux de messagerie multithread
- Envoyez un fichier volumineux en bloquant le canal pendant un certain temps en appelant un noeud final.
- Envoyez un fichier plus petit en appelant un noeud final.
Résultat attendu: le plus petit fichier est mis en file d'attente sur un canal et est traité après la fin du chargement du plus gros fichier. Résultat: Une nouvelle connexion au serveur sftp est ouverte et le fichier le plus petit y est transféré sans être mis en file d'attente, tandis que le fichier plus volumineux continue la transmission.
Il y a deux fichiers dans mon application:
DemoApplication.java
@SpringBootApplication
@IntegrationComponentScan
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost("localhost");
factory.setPort(22);
factory.setUser("tester");
factory.setPassword("password");
factory.setAllowUnknownKeys(true);
return factory;
}
@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
public MessageHandler handler() {
SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
handler.setRemoteDirectoryExpression(new LiteralExpression("/"));
return handler;
}
@MessagingGateway
public interface MyGateway {
@Gateway(requestChannel = "toSftpChannel")
void sendToSftp(File file);
}
}
DemoController.java
@RestController
public class DemoController {
@Autowired
MyGateway gateway;
@RequestMapping("/sendFile")
public void sendFile() {
File file = new File("C:/smallFile.txt");
gateway.sendToSftp(file);
}
@RequestMapping("/sendBigFile")
public void sendBigFile() {
File file = new File("D:/bigFile.zip");
gateway.sendToSftp(file);
}
}
Je suis un débutant complet au printemps et je ne suis pas sûr Entièrement que mes canaux sftp soient créés correctement ici, je suppose qu'un nouveau sera créé chaque fois que je fais un appel sendToSftp. Toute aide sur la façon d'atteindre le comportement de file d'attente dans ce cas serait appréciée.
Salut, j'ai donc une question à ce sujet. Comment puis-je faire envoyer à sendToSftp l'état du transfert? J'ai essayé de changer void en String ou object, en ajoutant des canaux de réponse ou un canal d'erreur à la passerelle de messagerie sans résultat, une aide serait très appréciée – user2334207
Voir une mise à jour dans ma réponse. –
Comment puis-je capturer des exceptions? J'essaye de contacter soit un serveur ou un dossier non existant sans autorisations ou alors et obtenir une trace de pile massive qui semble montrer une exception MessagingException au sommet. J'ai ajouté MessagingException sur sendToSftp dans la passerelle et entouré avec try catch dans le DemoController, mais il semble que sendToSftp ne retourne pas du tout si une exception se produit – user2334207