Karaf camel:route-list只显示Blueprint路由,而不是Java路由

时间:2016-10-19 06:04:25

标签: java apache-camel apache-karaf karaf blueprint-osgi

我正忙着处理Camel和Karaf。我已经构建了一个包含两个包的项目:

  • Bundle A包含Blueprint Camel路线
  • Bundle B包含纯Java路由

我按照Jamie Goodyear的Karaf Cookbook的指示

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

捆绑A将文件从<?php class loginValidation { function validate() { ob_start(); session_start(); include "../../connection.php"; $id=$_POST['cid']; $query = mysql_query("select * from advanced_subtopic where testid='$id'"); if(mysql_num_rows($query)>0){ echo "True"; } else { echo "False"; } }}$loginValidation=new loginValidation; $loginValidation->validate(); 移动到/tmp/in 捆绑包B将文件从/tmp/out移动到/tmp/in2

一切都很好。

但是,如果我运行Karaf命令tmp/out2,则只显示蓝图路径

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

重申一下,这两条路线都能正常工作,只是Java的路线没有显示在列表中。

我在这里错过了什么吗?

这是我的Java路线:

camel:context-list

Bundle Activator:

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");
    }
}

2 个答案:

答案 0 :(得分:1)

Tx Souciance Eqdam Rashti。今天早上我在你的博客上工作,看看你在使用JavaDSL蓝图时的意思。

像魅力一样。

为了完整起见,这里有改变:

我的Java Route类与问题中指定的完全相同,但我完全删除了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>

Tx的帮助!

答案 1 :(得分:0)

感谢克劳斯 - 我已经完成了Camel-SCR的材料,最终也采用了这种方法。我的想法是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跑步者看起来像这样:

@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。)

感谢所有人的帮助。我想我现在能够获得一些牵引力。

干杯!