Apache Camel与Spring Boot的结合

3

我正在尝试使用标题中的技术栈设置一个项目,我们使用的JMS是ActiveMQ。因此,这是我正在进行的配置:

@SpringBootApplication

public class Application {

private static Logger logger = Logger.getLogger(Application.class);

@Value("${broker.component.name}")
private String brokerComponetName;
@Value("${broker.dead.letter.queue}")
private String brokerDeadLetterQueue;
@Value("${broker.in.queue}")
private String brokerInQueue;
@Value("${broker.out.queue}")
private String brokerOutQueue;
@Value("${broker.url}")
private String brokerUrl;
@Value("${broker.user}")
private String brokerUser;
@Value("${broker.password}")
private String brokerPassword;

public static void main(String[] args) throws Exception {
    logger.info("starting loader");
    SpringApplication.run(Application.class, args);
}

@Bean
public SpringCamelContext camelContext(ApplicationContext applicationContext) throws Exception {

    SpringCamelContext camelContext = new SpringCamelContext(applicationContext);

    camelContext.addComponent(brokerComponetName, JmsComponent.jmsComponent(connectionFactory()));

    camelContext.addRoutes(new RouteBuilder() {
        public void configure() throws ConfigurationException {
            errorHandler(deadLetterChannel(brokerDeadLetterQueue)
                    .onRedelivery(new FailureProcessor())
                    .useOriginalMessage()
                    .maximumRedeliveries(5)
                    .redeliveryDelay(5000)
                    .retryAttemptedLogLevel(LoggingLevel.INFO));

            from(brokerInQueue)
                .process(new MessageProcessor())
                .to(brokerOutQueue);
        }
    });

    return camelContext;
}

@Bean
public ConnectionFactory connectionFactory() throws ConfigurationException {
    System.out.println("BROKER URL: " + brokerUrl);
    return new ActiveMQConnectionFactory(brokerUser,
            brokerPassword, brokerUrl);
}

我已经尝试将@EnableJms添加到应用程序中,但没有成功。堆栈错误如下所示:
org.springframework.beans.factory.BeanCreationException: 创建类名为“jmsListenerContainerFactory”的bean时出错。该bean在以下路径资源文件中定义: [org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.class]:通过工厂方法实例化Bean失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化org.springframework.jms.config.DefaultJmsListenerContainerFactory的工厂方法'jmsListenerContainerFactory'引发了异常;嵌套异常是java.lang.NoSuchMethodError: org.springframework.jms.config.DefaultJmsListenerContainerFactory.setAutoStartup(Z)V
提前感谢您的帮助,对于问题中的任何错误,我深表歉意。

1
你尝试过使用Camel Spring Boot包吗?这非常简单,请查看https://github.com/vivek-dhayalan/camel_cxfrs_spring_boot_java_dsl中的Spring Boot示例,如果有帮助,请告诉我。 - Vivek Dhayalan
一个很好的例子,Vivek将Spring Boot和Camel结合在一起使用 - 我很喜欢。 - Claus Ibsen
我尝试过,但不符合我的需求。但这是一个很好的例子。 - Natan Deitch
3个回答

1
我遇到了同样的异常并在这里阅读了答案。由于我使用的是Spring boot 1.5.1-RELEASE,我发现这些答案不适用,于是继续寻找。我发现问题的原因是没有正确阅读手册:http://camel.apache.org/activemq.html。介绍中指出:

要使用此组件,请确保您的类路径上有activemq.jar或activemq-core.jar以及任何Camel依赖项,例如camel-core.jar、camel-spring.jar和camel-jms.jar。

所以解决问题的方法是添加2个额外的Maven条目。
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-spring</artifactId>
  <version>${apache.camel.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jms</artifactId>
  <version>${apache.camel.version}</version>
</dependency>

我希望它能帮助到某个人。


1

显然这是Spring Boot 1.3.3的一个bug: DefaultJmsListenerContainerFactory缺少所需方法。 尝试升级到Spring Boot 1.4.0(尽管目前不是RELEASE版本)。 这应该可以解决这个bug。


你是否通过升级到Spring Boot 1.4.0解决了问题?我找不到1.4.0.M1或M2版本的Maven依赖项。你能帮我吗? - Prashant

0
如果有人遇到这个问题,我找到了解决方案。
我们需要将spring-boot版本降级到1.2.3.RELEASE,因为camel-jms:2.16.2使用的spring组件版本为4.1.9。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接