Apache Camel enrichir le message avec le contenu du fichier sur demande
Je suis la mise en œuvre de service RESTful (à l'aide de CXFRS composant) qui doit renvoyer les fichiers pour certaines requêtes. Chaque fichier est récupéré par son id et l'extension, c'est à dire restfulservice.com/path/file/1/pdf
. Chaque fichier ajouté ne change jamais. Les fichiers ne doivent pas être déplacés ou supprimés après l'extraction et généralement, elles doivent être accessibles simultanément. Voici une partie de mon Chameau contexte:
from("direct:fetchFile")
.process(fetchFileProcessor) //set file.id & file.extension
.bean(fileService, "fetchFile(${header.file.id}, ${header.file.extension})") //set body to filename
.setHeader("CamelFileName", simple("${body}"))
.choice()
.when(header("file.extension").isEqualTo("xml"))
.pollEnrich("file:///{{application.fileStorage.basePath}}/xml?noop=true", 500)
.when(header("file.extension").isEqualTo("pdf"))
.pollEnrich("file:///{{application.fileStorage.basePath}}/pdf?noop=true", 500)
.end()
.convertBodyTo(File.class)
.bean(responseProvider, "getResponse(${body}, 200)");
Le problème avec cette configuration, c'est que la réponse est non vide de corps seulement pour la deuxième(pourquoi?) demande, sans délai d'attente fixé service entre éternelle boucle sur la deuxième demande avec un message de débogage
DEBUG o.a.c.c.f.FileConsumer - Took 0.000 seconds to poll <base path>\xml
Rapidement Chameau version est 2.10.4
Toute aide serait appréciée
UPD1:
Il s'agit d'un avertissement sur Contenu Enricher page, en disant: "pollEnrich n'a pas accès à toutes les données de l Échange. Rien ne change, mais si j'ajoute fileName=${body}
de fichier URL
UPD2:
Il semble que pollEnrich ne prennent pas en charge dynamique fileName
spécifié dans l'URL (lien). Route au moment actuel:
from("direct:fetchFile")
.process(fetchFileProcessor) //set file.id & file.extension
.bean(fileService, "fetchFile(${header.file.id}, ${header.file.extension})") //set body to filename
.choice()
.when(header("file.extension").isEqualTo("xml"))
.pollEnrich("file:///{{application.fileStorage.basePath}}/xml?fileName=${body}&noop=true", 500)
.setHeader("asset.type", simple(MediaType.APPLICATION_XML))
.when(header("file.extension").isEqualTo("pdf"))
.pollEnrich("file:///{{application.fileStorage.basePath}}/pdf?fileName=${body}&noop=true", 500)
.setHeader("asset.type", simple("application/pdf"))
.end()
.convertBodyTo(File.class)
.process(multipartProcessor) //add file ass attachment to multipart body and set it as body
.bean(responseProvider, "getResponse(${body}, 200)");
UPD3
J'essaie de mettre en œuvre processeur personnalisé à utiliser PollingConsumer dynamique avec les noms de fichier:
@Override
public void process(Exchange exchange) throws Exception {
Long timeout = exchange.getIn().getHeader("file.timeout", Long.class);
if (enrichUri == null) {
throw new FileNotFoundException("'file.url' header not set");
}
CamelContext context = exchange.getContext();
Endpoint endpoint = context.getEndpoint(enrichUri);
PollingConsumer consumer = endpoint.createPollingConsumer();
consumer.start();
Exchange consumedExchange;
try {
if (timeout == null || timeout < 0) {
consumedExchange = consumer.receive();
} else if (timeout == 0) {
consumedExchange = consumer.receiveNoWait();
} else {
consumedExchange = consumer.receive(timeout);
}
} catch (Exception e) {
throw new AssetNotFoundException(e);
} finally {
consumer.stop();
}
exchange.getIn().setBody(consumedExchange.getIn().getBody());
}
Maintenant, il renvoie le contenu du fichier sur la première réponse, mais à chaque tour de demande, je suis éternelle boucle de journal ci-dessus de messages:
DEBUG o.a.c.c.f.FileConsumer - Took 0.000 seconds to poll <base path>\xml
UPD4
J'ai mis en œuvre dynamique de l'itinéraire qui est ajouté avant le traitement et la retirer après elle. Cette méthode est décrite dans cette post dans Apache Camel forum. L'itinéraire ci-dessus utilise le processeur à consommer de fichier. Le résultat est le même
Vous devez vous connecter pour publier un commentaire.
Moyen Simple est souvent la meilleure façon. Je refuse de traiter avec Apache Camel fichier de composant dans ce cas et mises en œuvre après processeur:
Maintenant il fonctionne comme un charme