我有一个系统可以动态地将Camel上下文添加到正在运行的系统中。
从处理器内部检索有关上下文的信息非常简单方便,但我没有想到这样做的可能性超过定义处理器的上下文。
是否有机会使用单个组件从所有上下文中检索状态?
答案 0 :(得分:3)
是的,你可以使用JMX,Petter说。 Apache Camel公开了许多JMX MBean来管理Camel应用程序:http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/api/management/mbean/package-summary.html
然而,我也会指向jolokia(http://jolokia.org/),因为jolokia可以将JMX作为REST服务公开,这使得使用JMX变得更加容易。这使得客户端仅仅通过REST调用(例如通过HTTP)访问该信息就变得微不足道了。
我们在hawtio Web控制台中使用它来构建用于管理Java应用程序的HTML5 Web应用程序,该应用程序也具有Camel插件。这允许我们使用这些REST服务来管理在JVM或远程JVM中运行的所有Camels。
答案 1 :(得分:3)
感谢@petter和@ claus-ibsen!我采用了MBean方法。因为我留在我自己的VM中,所以我能够对抗本地MBeanServer:
List<Map<String, String>> values = new ArrayList<>();
QueryExp qe = Query.isInstanceOf(new StringValueExp("org.apache.camel.management.mbean.ManagedCamelContext"));
MBeanServer ms = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> contexts = ms.queryNames(new ObjectName("org.apache.camel:*"), qe);
for (ObjectName context : contexts) {
Map<String, String> curMap = new HashMap<String, String>();
AttributeList al = ms.getAttributes(context, attributes);
List<Attribute> ale = al.asList();
for (int i = 0; i < ale.size(); i++) {
Attribute attribute = ale.get(i);
String val = attribute.getValue() != null ? attribute.getValue().toString() : "";
curMap.put(attribute.getName(), val);
}
values.add(curMap);
}
例如attributes=new String[] { "CamelId", "MinProcessingTime", "MeanProcessingTime", "MaxProcessingTime" };
我可以检索自己喜欢的信息。
骆驼在那一点很棒; - )
答案 2 :(得分:1)
有一个很好的软件可以安装/卸载/启动/停止您可能想要尝试的驼峰上下文:Apache Karaf。有一些准则here。
那就是说 - 是的 - 您可以使用JMX轻松访问其他Camel上下文。上下文暴露为MBean。您可能需要向动态运行时添加JMX支持,以实现此目的。
您可以探索您拥有的选项,以及您的JMX曝光是否使用jconsole。当然,您可以使用JMX api从代码访问相同的操作。