Apache骆驼Java中的NoSuchMethodError

时间:2020-06-26 07:04:09

标签: apache-camel activemq

我运行了以下代码:

package com.dinesh.example4;

import javax.jms.ConnectionFactory;
//import org.apache.camel.support.HeaderFilterStrategyComponent;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.impl.DefaultCamelContext;
//import org.apache.camel.impl.*;

public class FileToActiveMQ {
    
    public static void main(String[] args) throws Exception {
        CamelContext context = new DefaultCamelContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        context.addComponent("jms",JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        context.addRoutes(new RouteBuilder() {
            
            @Override
            public void configure() throws Exception {
              from("file:input_box?noop=true")
                .to("activemq:queue:my_queue");
                }
        });
        while(true)
        context.start();
        }
}

用于将数据从input_box文件夹转换为activemq。

我遇到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.camel.impl.HeaderFilterStrategyComponent.<init>(Ljava/lang/Class;)V
    at org.apache.camel.component.jms.JmsComponent.<init>(JmsComponent.java:71)
    at org.apache.camel.component.jms.JmsComponent.<init>(JmsComponent.java:87)
    at org.apache.camel.component.jms.JmsComponent.jmsComponent(JmsComponent.java:102)
    at org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge(JmsComponent.java:127)
    at com.dinesh.example4.FileToActiveMQ.main(FileToActiveMQ.java:18)

在上面的代码中的第18行: context.addRoutes(new RouteBuilder(){

Pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.dinesh</groupId>
  <artifactId>camel-application1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  
  <!-- https://mvnrepository.com/artifact/org.apache.camel/camel-core -->
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>2.14.4</version>
</dependency>

 <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jms</artifactId>
    <version>2.24.0</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-activemq</artifactId>
    <version>3.0.0</version>
</dependency>
  
  </dependencies>
</project>

请帮助。

3 个答案:

答案 0 :(得分:1)

根据您的POM,您混合了3种不同的骆驼版本:2.14.4、2.24.0和3.0.0。

所有的Camel组件都必须使用相同的版本,就像@ claus-ibsen已经评论过的那样。

例如,像下面的示例那样进行操作(使用框架版本的属性,并在所有依赖项中使用它)。

但是,正如Sneharghya已经回答的那样,Camel 2.x没有camel-activemq,但是可以使用ActiveMQ的依赖项activemq-camel

因此,POM应该看起来像这样。但是我认为骆驼的版本可能会有所不同。

<properties>
    <amq.version>5.15.4</amq.version>     
    <camel.version>2.19.5</camel.version> 
</properties>

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>${camel.version}</version>
</dependency>
 <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jms</artifactId>
    <version>${camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-camel</artifactId>
    <version>${amq.version}</version>
</dependency>

您也可以使用Maven dependencyManagement

答案 1 :(得分:0)

camel-activemq在3.0之前的版本中不可用。 如果您想继续使用骆驼2.24.3,请从pom文件中删除camel-activemq依赖项并添加

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-camel</artifactId>
    <version>5.15.13</version>
</dependency>

答案 2 :(得分:0)

1。更新课程 有两个问题。

  • 您正在使用一个名称jms注册组件,并将消息发送到其他组件activemq。它们应该相同。
  • 您正在执行while循环,而while循环多次启动了上下文。
public class FileToActiveMQ {

  public static void main(String[] args) throws Exception {
    CamelContext context = new DefaultCamelContext();
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    context.addComponent("activemq", 
          JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
    context.addRoutes(new RouteBuilder() {
      @Override
      public void configure() throws Exception {

        from("file:input_box?noop=true")
        .to("activemq:queue:my_queue");
      }
    });
   context.start();
   while(true) {
     Thread.sleep(10000);
   }

  }
}

2。替换pom中的依赖项,如下所示:

<dependencies>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-core</artifactId>
      <version>2.25.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-jms</artifactId>
      <version>2.25.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-client</artifactId>
      <version>5.15.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-camel</artifactId>
      <version>5.15.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.7</version>
    </dependency>

  </dependencies>