Cette fois-ci, le besoin est d'ordonnancer l'exécution d'une application Camel via le gestionnaire de tâches Quartz tout en laissant la possibilité de démarrer manuellement les routes à la demande.
Commençons par l'ordonnancement. Admettons que le programme ne doit se lancer qu'à partir de 5 heures du matin en fin de semaine. La syntaxe CRON correspondante est :
* * 5 ? * SAT-SUN
Pour configurer la route initiale avec cette règle, il faut lui spécifier une routePolicy :
@Override
public void configure() throws Exception {
// Quartz
CronScheduledRoutePolicy startPolicy = new CronScheduledRoutePolicy();
// ne démarre que le weekend à partir de 5h du matin
startPolicy.setRouteStartTime("* * 5 ? * SAT-SUN");
...
from("file://...").routePolicy(startPolicy).noAutoStartup().routeId("firstRoute")...
}
Ainsi donc, la route n'est pas démarrée au lancement du contexte mais délègue cette tâche à l'ordonnanceur. (Ne pas oublier d'ajouter la dépendance camel-quartz)
Passons à la mise en place de JMX pour piloter à distance Camel.
Au démarrage de l'application, il faut référencer un bean particulier ayant connaissance du contexte Camel auprès du server JMX de la JVM :
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
MyAgentManagerMXBean mbean = new MyCamelMBean(camelContext);
ObjectName name = new ObjectName("my.jmx.domain.MyDomain:type=MyCamelMBean,name=myCamelMBean");
server.registerMBean(mbean, name);
La paramètre camelContext du bean est une instance du context Camel, par exemple de org.apache.camel.main.Main. Je précise au passage qu'afin de rendre disponible l'interface à JMX, le nom de celle-ci doit être suffixé par MXBean (il s'agit d'une convention JMX). Et voici comment sont écrites l'interface et l'instance du bean mbean
public interface MyAgentManagerMXBean {
/**
* Start Camel manually, overriding quartz schedule
* @throws Exception
*/
public void camelManualStart() throws Exception;
}
public class MyCamelMBean implements MyAgentManagerMXBean {
private Main camel;
public MyCamelMBean(Main context) {
camel = context;
}
@Override
public void camelManualStart() throws Exception {
camel.getRouteBuilders().get(0).getContext().startRoute("firstRoute");
}
}
Avec cette configuration, il est alors possible, avec n'importe quelle console JMX (ici la JConsole) de démarrer manuellement la route configurée avec Quartz :
J'en profite pour ajouter un exemple permettant de récupérer des informations directement de Camel, par exemple ici le nombre de message traités sur une route :
public long getSourceFilesManagedNb() {
long result = 0;
try {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1616/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection server = jmxc.getMBeanServerConnection();
ObjectName objName = new ObjectName("org.apache.camel:type=routes,name=\"firstRoute\",*");
List<ObjectName> cacheList = new LinkedList<ObjectName>(server.queryNames(objName, null));
for (ObjectName objName2 : cacheList) {
result = (Long) server.invoke(objName2, "getExchangesCompleted", null, null);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
Voilà tout!

0 commentaires:
Enregistrer un commentaire