使用Spring启动和集成DSL,获取错误ClassNotFoundException integration.history.TrackableComponent

时间:2016-01-08 18:03:06

标签: spring-boot spring-integration

使用Spring Boot,Integration和DSL尝试非常基本的JMS接收器。我从事基于Spring Integration的XML工作,但我是Spring Boot和DSL的新手。

这是我到目前为止的代码示例

@SpringBootApplication
@IntegrationComponentScan
@EnableJms
public class JmsReceiver {

    static String mailboxDestination = "RETRY.QUEUE";


    @Configuration
    @EnableJms
    @IntegrationComponentScan
    @EnableIntegration
    public class MessageReceiver {

        @Bean
        public IntegrationFlow jmsMessageDrivenFlow() {
            return IntegrationFlows
                    .from(Jms.messageDriverChannelAdapter(this.connectionFactory())
                            .destination(mailboxDestination))
                    .transform((String s) -> s.toUpperCase())
                    .get();
        }
        //for sneding message
        @Bean
        ConnectionFactory connectionFactory() {
            ActiveMQConnectionFactory acFac = new ActiveMQConnectionFactory();
            acFac.setBrokerURL("tcp://crsvcdevlnx01:61616");
            acFac.setUserName("admin");
            acFac.setPassword("admin");
            return new CachingConnectionFactory(acFac);
        }
    }


    //Message send code
    public static void main(String args[]) throws Throwable {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(JmsReceiver.class);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
        System.out.println("Sending a new mesage.");

        MessageCreator messageCreator = new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage("ping!");
            }
        };
        jmsTemplate.send(mailboxDestination, messageCreator);

        context.close();
    }
}

而且,在使用Gradle运行时出现此错误。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.integration.dsl.IntegrationFlow]: Factory method 'inboundFlow' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/integration/history/TrackableComponent
    reflect.NativeMethodAccessorImpl.invoke0(Native Method)
.
.
.
Caused by: java.lang.ClassNotFoundException: org.springframework.integration.history.TrackableComponent
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

我的gradle依赖项:

compile "org.springframework.boot:spring-boot-starter-jersey",
        "org.springframework.boot:spring-boot-starter-actuator",
        "org.springframework.boot:spring-boot-configuration-processor",
        "org.springframework.boot:spring-boot-starter-integration",
        "org.springframework.integration:spring-integration-jms",
        "org.springframework.integration:spring-integration-java-dsl:1.1.1.RELEASE",
        "org.springframework.integration:spring-integration-flow:1.0.0.RELEASE",
        "org.springframework.integration:spring-integration-core:4.2.2.RELEASE",
        "org.springframework.integration:spring-integration-java-dsl:1.1.0.RELEASE",
        "org.springframework.integration:spring-integration-flow:1.0.0.RELEASE",
        "org.apache.activemq:activemq-spring:5.11.2",

更新..已解决:非常感谢。 更改了两件事:

  1. 根据您的建议清理了gradle依赖项。新的看起来像这样:

    compile "org.springframework.boot:spring-boot-starter-jersey",
    
            "org.springframework.boot:spring-boot-starter-actuator",
            "org.springframework.boot:spring-boot-configuration-processor",
            "org.springframework.boot:spring-boot-starter-integration",
            "org.springframework.integration:spring-integration-jms",
            "org.springframework.integration:spring-integration-java-dsl:1.1.0.RELEASE",
            "org.apache.activemq:activemq-spring:5.11.2"
    
  2. 代码抛出了构造函数错误,因为无法在内部类中实例化<init>。将Inner类更改为static。新法典:

    @SpringBootApplication
    @IntegrationComponentScan
    @EnableJms
    public class JmsReceiver {
    
        static String lsamsErrorQueue = "Queue.LSAMS.retryMessage";
        static String fatalErrorsQueue = "Queue.LSAMS.ManualCheck";
    
        //receiver
        @EnableJms
        @EnableIntegration
        @Configuration
        public static class MessageReceiver {
            @Bean
            public IntegrationFlow jmsMessageDrivenFlow() {
                return IntegrationFlows
                        .from(Jms.messageDriverChannelAdapter(this.connectionFactory())
                                .destination(lsamsErrorQueue))
                        //call LSAMS REST service with the payload received
                        .transform((String s) -> s.toUpperCase())
    
                        .handle(Jms.outboundGateway(this.connectionFactory())
                                .requestDestination(fatalErrorsQueue))
                        .get();
            }
            @Bean
            ConnectionFactory connectionFactory() {
                ActiveMQConnectionFactory acFac = new ActiveMQConnectionFactory();
                acFac.setBrokerURL("tcp://crsvcdevlnx01:61616");
                acFac.setUserName("admin");
                acFac.setPassword("admin");
                return new CachingConnectionFactory(acFac);
            }
        }
    
        //Message send code
        public static void main(String args[]) throws Throwable {
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(JmsReceiver.class);
    
            JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
            System.out.println("Sending a new mesage.");
    
            MessageCreator messageCreator = new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    return session.createTextMessage("ping!");
                }
            };
            jmsTemplate.send(lsamsErrorQueue, messageCreator);
    
            context.close();
        }
    }
    

1 个答案:

答案 0 :(得分:2)

嗯,完全看起来你的类路径中有一个版本混乱。

首先,您不应手动混合相同的工件,就像使用spring-integration-java-dslspring-integration-flow一样。顺便说一下,你真的需要最后一个吗?...我的意思是有理由保留spring-integration-flow吗?该项目大约是Modular Flows

如果您基于Spring Boot(在您的情况下为spring-integration-core),则从另一方面无需指定spring-boot-starter-integration

是的:TrackableComponent自Spring Integration 4.2(https://jira.spring.io/browse/INT-3799)以来已移至org.springframework.integration.support.management

从这里看起来你以某种方式使用较旧的Spring Integration版本: - 或Spring Boot 1.2.x. - 或者它是来自spring-integration-flow ...

的传递依赖的真正副作用