我正在阅读《Camel in Action》第二版,它指导使用 Spring-Camel XML 命名空间配置将 Camel 嵌入到 Spring 中,自动发现定义为 Spring beans 的组件等。这是一个示例。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<package>org.apache.camel.example.spring</package>
</camelContext>
<!-- lets configure the default ActiveMQ broker URL -->
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost?broker.persistent=false&broker.useJmx=true"/>
</bean>
</property>
</bean>
</beans>
如何在不使用 XML 配置而是使用 Spring Java 配置的情况下实现这一目标?
请参阅来自camel的此文档。 请参阅 this 了解 Activemq 配置。
在此仅添加一个片段:
public class MyRouteConfiguration extends CamelConfiguration {
@Autowire
private MyRouteBuilder myRouteBuilder;
@Autowire
private MyAnotherRouteBuilder myAnotherRouteBuilder;
@Override
public List<RouteBuilder> routes() {
return Arrays.asList(myRouteBuilder, myAnotherRouteBuilder);
}
}
在 Apache Camel 的 GitHub 存储库中 有一个 examples 目录。
查看其中的 Spring Java 配置示例,这是您需要的最小示例。
如果您想使用 Java 语法并让 Camel 发现您的 bean,那么您可以首先通过从方法返回它们来定义您的 bean,然后使用
@Bean
和 @Configuration
注释。对于您上面发布的 XML 示例,这将是这样的:
@Configuration
public class AppConfig {
@Bean
public JmsComponent jms() {
ActiveMQConnectionFactory amqcf = new ActiveMQConnectionFactory();
amqcf.setBrokerURL("vm://localhost?broker.persistent=false");
JmsComponent jms = new JmsComponent();
jms.setConnectionFactory(amqcf);
return jms;
}
}
您可以对路线使用类似的方法(使用
@Component
注释):
@Component
public class MyRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:foo?period=5000")
.setBody(simple("Customer"))
.to("jms:queue:customers");
}
}
然后将
@ComponentScan
添加到您的主类中,它可能看起来像这样(假设您使用的是普通 Spring,而不是 Spring Boot):
@Configuration
@ComponentScan
public class Application extends CamelConfiguration {
public static void main(String[] args) throws Exception {
//org.apache.camel.spring.javaconfig.Main
Main main = new Main();
main.setConfigClass(Application.class);
main.run();
}
//...
}