动态入站适配器连接无法正常工作

时间:2015-11-15 15:49:22

标签: java spring spring-integration

嘿,这是对我之前发布的关于将消息驱动的通道适配器连接到多个队列而没有写出每个队列的问题的跟进。

How to hook up a list of message driven adapters without actually writing each one out?

我尝试遵循建议的方法:

Spring multiple imapAdapter

现在我有了这个配置(子),它从它的环境中获取属性(比如队列名),并相应地创建消息驱动的适配器。

@Autowired
private ApplicationContext context;

@Value("${id}")
private String id;

@Value("${primaryConnection}")
private String primaryConnection;

@Value("${queueName}")
private String queueName;   

@Bean
public IntegrationFlow primaryInitiationListenerFlow() {
    return IntegrationFlows.from(Jms
                .messageDriverChannelAdapter(context.getBean(primaryConnection, ConnectionFactory.class))
                .autoStartup(false)
                .destination(queueName)
                .configureListenerContainer(listenerContainerSpec())
                .id(id + "PrimaryIn")
                .get())
            .channel("initiationChannel")
            .get();
}

在应用程序启动时,我遍历我拥有的队列名称列表,并为每个队列名称实例化上述上下文,并将我的主要上下文作为父项并传入适当的环境。

public void onApplicationEvent(ContextRefreshedEvent event) {
    for(String infoKey : clientConfig.getPairs().keySet()) {
        PairInfo info = clientConfig.getPairs().get(infoKey);
        Properties properties = info.getProperties();
        StandardEnvironment environment = new StandardEnvironment();
        environment.getPropertySources().addLast(new PropertiesPropertySource("connectionProps", properties));
        AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
        child.register(InboundFlow.class);
        child.setId(properties.getProperty("id"));
        child.setParent(context);
        child.setEnvironment(environment);
        child.refresh();
    }
}

子上下文的所有这些实例现在正在进入不同的队列,并将消息放入由父母监听的公共频道(initiationChannel)。

@Bean
public IntegrationFlow initiationAndDataFlow() {
    return IntegrationFlows
            .from("initiationChannel")
            .handle(//doStuff)
            .get();
}

我已经在父母中定义了initiationChannel并设置了就像Gary在示例中所做的那样。

但我收到此错误时说initiationChannel在启动春季背景时没有发布者:

  

通过工厂方法进行Bean实例化失败;   嵌套异常是org.springframework.beans.BeanInstantiationException:>无法实例化[org.springframework.integration.dsl.IntegrationFlow]:>工厂方法' initiationAndDataFlow'抛出异常;嵌套异常是> java.lang.NoClassDefFoundError:org.reactivestreams.Publisher

我需要首先加载父上下文(与订阅者),然后将其分配给每个子项,因此当父项加载时,不会有任何人发布到该频道。

我不知道自己做错了什么。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

  

java.lang.NoClassDefFoundError:org.reactivestreams.Publisher

您错过了类路径中的reactive-streams-1.0.0.jar

您应该为项目使用maven或gradle来确保解决所有依赖项。