Karaf camel:route-list 仅显示蓝图路线,不显示 Java 路线

Karaf camel:route-list shows only Blueprint routes, not Java routes

我正忙于与 Camel 和 Karaf 打交道。我用两个包构建了一个项目:

我遵循了 Jamie Goodyear 的 Karaf 食谱中的说明

两条路线都非常简单,我使用功能文件部署它们。他们部署得非常完美,而且 运行 完全按照计划进行:

Bundle A 将文件从 /tmp/in 移动到 /tmp/out Bundle B 将文件从 /tmp/in2 移动到 tmp/out2

一切顺利。

但是,如果我 运行 Karaf 命令 camel:route-list 则只显示蓝图路由

此外,如果我 运行 camel:context-list 则仅显示 Bundle A 中定义的上下文。

重申一下,两条路线都可以正常工作,只是 Java 路线没有出现在列表中。

我是不是遗漏了什么?

这是我的 Java 路线:

public class FileRouter extends RouteBuilder {
    public void configure()
    {
      from ("file:/tmp/in2?noop=true")
       .log("Java DSL doing the heavy lifting")
       .to("file:/tmp/out2");
    }
}

以及捆绑激活器:

public class Activator implements BundleActivator {
    DefaultCamelContext camelContext;

    public void start(BundleContext context) {
        System.out.println("Starting the bundle");
        camelContext = new DefaultCamelContext();
        try {
            camelContext.setName("JavaDSLContext");
            camelContext.addRoutes(new FileRouter());
            camelContext.start();
        } catch (Exception ex) {
            System.out.println("Exception occured! " + ex.getMessage());
        }
    }

    public void stop(BundleContext context) {
        System.out.println("Stopping the bundle");
        if (camelContext != null) {
           try { 
              camelContext.stop();
           } catch (Exception ex) {
              System.out.println("Exception occured during stop context.");
           }
        }
    }   
}

Tx Souciance Eqdam Rashti。我今天早上浏览了您的博客,了解您将蓝图与 JavaDSL.

结合使用是什么意思

很有魅力。

为了完整起见,这里是更改:

我的 Java 路线 class 与问题中指定的完全相同,但我完全放弃了 Activator,用蓝图文件替换它。

蓝图如下所示:

<bean id="FileRouter" class="com.eightbitplatoon.learning.karaf.karafbasics.combined.FileRouter">
</bean>
<camelContext id="karafbasics-combined" xmlns="http://camel.apache.org/schema/blueprint">
    <routeBuilder ref="FileRouter" />
</camelContext>

谢谢帮助!

感谢 Claus - 我已经完成了 Camel-SCR 上的 material,并最终使这种方法也能发挥作用。我的想法是 Camel-SCR 可能是更干净的解决方案,因为它可以很容易地将属性传递给 JavaDSL 路由器。

为了完整起见,这是我的最终解决方案,然后我将结束这个问题: 文件路由器现在看起来像这样:

public class ScrFileRouter extends RouteBuilder {

    // Configured fields
    private String camelRouteId;

    @Override
    public void configure() throws Exception {
        // Add a bean to Camel context registry
        AbstractCamelRunner.getRegistry(getContext(), SimpleRegistry.class).put("testString", "this is a test");

        from("file:/tmp/in6?noop=true").routeId(camelRouteId)
        .to("file:/tmp/out6");
    }
}

基于 SCR 的 Camel runner 如下所示:

@Component(label = ScrRunner.COMPONENT_LABEL, description = ScrRunner.COMPONENT_DESCRIPTION, immediate = true, metatype = true)
@Properties({
    @Property(name = "camelContextId", value = "scr-runner"),
    @Property(name = "camelRouteId", value = "scr-file-router"),
    @Property(name = "active", value = "true"),
})
@References({
    @Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
        cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
        policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})
public class ScrRunner extends AbstractCamelRunner {

    public static final String COMPONENT_LABEL = "ScrRunner";
    public static final String COMPONENT_DESCRIPTION = "This is the description for ScrRunner";

    @Override
    protected List<RoutesBuilder> getRouteBuilders() {
        List<RoutesBuilder> routesBuilders = new ArrayList<>();
        routesBuilders.add(new ScrFileRouter());
        return routesBuilders;
    }

    @Override
    protected void setupCamelContext(BundleContext bundleContext, String camelContextId)throws Exception{
        super.setupCamelContext(bundleContext, camelContextId);

        // Use MDC logging
        getContext().setUseMDCLogging(true);

        // Use breadcrumb logging
        getContext().setUseBreadcrumb(true);
    }
}

我密切关注 Camel SCR 网站上的信息,几乎一切正常。然后我使用了建议的原型 (camel-archetype-scr),效果很好。

所以最后我还不得不对我的 POM 文件进行一些更改(实际上只是使用 Archetype 提供的 POM。)

感谢大家的帮助。我想我现在可以得到一些牵引力了。

干杯!