获取有关VM中定义的所有CamelContext的信息

时间:2014-03-28 15:46:59

标签: apache-camel

我有一个系统可以动态地将Camel上下文添加到正在运行的系统中。

从处理器内部检索有关上下文的信息非常简单方便,但我没有想到这样做的可能性超过定义处理器的上下文。

是否有机会使用单个组件从所有上下文中检索状态?

3 个答案:

答案 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从代码访问相同的操作。 enter image description here