bean名称如何与组件相关?

时间:2016-03-03 21:57:39

标签: apache-camel

我在application-context.xml文件中有以下内容:

public Classname( String aName, int aScore,)
{
    score = aScore;
    name = aName;
}

和我的路线(片段)看起来像这样:

<bean id="reportingDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://192.168.1.1:5432/reports"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>
    <property name="initialSize" value="3"/>
    <property name="maxActive" value="10"/>
</bean>

<bean id="reportingSql" class="org.apache.camel.component.sql.SqlComponent">
    <property name="DataSource" ref="reportingDataSource"/>
</bean>
很明显,我只是在这里的水中伸出脚趾。

此代码在.to("reportingSql:insert into my_table (uuid, name, created_at, created_by) values ('a','namename', 1, 2)")

中生成错误
/var/log/tomcat/whistler.log

如果我更改了&quot; reportSql&#39;在xml文件和路径中只是&#39; sql&#39;,我进一步 - 错误消失了。是&#39; sql&#39;魔术,莫名其妙?

如果是的话,我认为没问题,但如果我想使用其他数据源该怎么办?我不能把它们都称为&#39; sql&#39;。

1 个答案:

答案 0 :(得分:1)

通过ComponentResolver解析组件。默认情况下,DefaultComponentResolver使用以下策略:

  1. 查找camel注册表中的组件。如果找到实例,则转换为Component
  2. 使用默认FactoryFinder来实例化新组件。此工厂在META-INF/services/org/apache/camel/component/
  3. 下的属性中使用已注册的类

    换句话说,您想要做的是:Camel应该检查注册表中的命名实例。但是,在您的示例中,您使用spring文件来注册bean,使用java来创建路由。

    使用Spring,当您使用<camelContext../>时,会创建SpringCamelContext,而不是DefaultCamelContext。此上下文使用多个服务,允许在Spring应用程序中更好地集成。其中一项服务是ApplicationContextRegistry,它将Spring bean集成到camel注册表中。这个注册表允许使用在Spring中注册的bean Component

    因此,请检查您是否在Spring上下文中使用CamelContext。如果没有,或者您无法使用托管的camelContext,则可以尝试使用SpringCamelContextApplicationContextRegistry

    请参阅: