【问题标题】:Why do I get exception "connectionFactory must be specified"?为什么会出现异常“必须指定连接工厂”?
【发布时间】:2022-08-22 21:22:21
【问题描述】:

痕迹:

org.apache.camel.FailedToStartRouteException: Failed to start route FromSAA because of null
    at org.apache.camel.impl.engine.RouteService.setUp(RouteService.java:132)
    at org.apache.camel.impl.engine.InternalRouteStartupManager.doInitRoutes(InternalRouteStartupManager.java:92)
    at org.apache.camel.impl.engine.AbstractCamelContext.doInit(AbstractCamelContext.java:2949)
    at org.apache.camel.support.service.BaseService.init(BaseService.java:83)
    at org.apache.camel.impl.engine.AbstractCamelContext.init(AbstractCamelContext.java:2630)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:111)
    at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2649)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:262)
    at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:119)
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:151)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
    at ru.rbru.fms.router.Bootstrap.main(Bootstrap.java:13)
Caused by: java.lang.IllegalArgumentException: connectionFactory must be specified
    at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:156)
    at org.apache.camel.component.jms.JmsConfiguration.createConnectionFactory(JmsConfiguration.java:1746)
    at org.apache.camel.component.jms.JmsConfiguration.getOrCreateConnectionFactory(JmsConfiguration.java:856)
    at org.apache.camel.component.jms.JmsConfiguration.createListenerConnectionFactory(JmsConfiguration.java:1754)
    at org.apache.camel.component.jms.JmsConfiguration.getOrCreateListenerConnectionFactory(JmsConfiguration.java:900)
    at org.apache.camel.component.jms.JmsConfiguration.configureMessageListenerContainer(JmsConfiguration.java:1582)
    at org.apache.camel.component.jms.JmsConfiguration.createMessageListenerContainer(JmsConfiguration.java:786)
    at org.apache.camel.component.jms.JmsEndpoint.createMessageListenerContainer(JmsEndpoint.java:157)
    at org.apache.camel.component.jms.JmsEndpoint.createConsumer(JmsEndpoint.java:152)
    at org.apache.camel.component.jms.JmsEndpoint.createConsumer(JmsEndpoint.java:69)
    at org.apache.camel.impl.engine.DefaultRoute.gatherRootServices(DefaultRoute.java:636)
    at org.apache.camel.impl.engine.DefaultRoute.gatherServices(DefaultRoute.java:620)
    at org.apache.camel.impl.engine.DefaultRoute.initializeServices(DefaultRoute.java:205)
    at org.apache.camel.impl.engine.RouteService.doSetup(RouteService.java:151)
    at org.apache.camel.impl.engine.RouteService.setUp(RouteService.java:130)
    ... 23 common frames omitted

我的配置:

@Component
@RequiredArgsConstructor
public class IbmMqInitializer {
    private static final String ACKNOWLEDGEMENT_MODE = \"CLIENT_ACKNOWLEDGE\";

    public void configure(CamelContext context, IbmMqProperties ibmMqProperties, ConnectionFactory connectionFactory) throws JMSException {
        registerIbmMq(context, ibmMqProperties, connectionFactory);
    }

    private void registerIbmMq(CamelContext context, IbmMqProperties ibmMqProperties, ConnectionFactory connectionFactory) {
        registerComponent(context, connectionFactory, ibmMqProperties);
    }

    private void registerComponent(CamelContext context,
                                   ConnectionFactory connectionFactory,
                                   IbmMqProperties ibmMqProperties) {
        ComponentsBuilderFactory.jms()
                .connectionFactory(connectionFactory)
                .acknowledgementModeName(ACKNOWLEDGEMENT_MODE)
                .concurrentConsumers(ibmMqProperties.getConcurrentConsumersCount())
                .register(context, ibmMqProperties.getQueue());
    }
}
@Configuration
public class ApplicationConfig {

    private static final Integer CCSID_UTF_8 = 1208;

    @Bean
    @ConfigurationProperties(\"resources.ibm.mq.saa\")
    public IbmMqProperties saaIbmMqProps() {
        return new IbmMqProperties();
    }

    @Bean
    @ConfigurationProperties(\"resources.ibm.mq.esb\")
    public IbmMqProperties esbIbmMqProps() {
        return new IbmMqProperties();
    }

    @Bean
    public ConnectionFactory saaIbmMqFactory(@Qualifier(\"saaIbmMqProps\") IbmMqProperties ibmMqProperties) throws JMSException {
        return getMqQueueConnectionFactory(ibmMqProperties);
    }

    @Bean
    public ConnectionFactory esbIbmMqFactory(@Qualifier(\"esbIbmMqProps\") IbmMqProperties ibmMqProperties) throws JMSException {
        return getMqQueueConnectionFactory(ibmMqProperties);
    }
    
    private ConnectionFactory getMqQueueConnectionFactory(IbmMqProperties ibmMqProperties) throws JMSException {
        var factory = new MQQueueConnectionFactory();
        factory.setCCSID(CCSID_UTF_8);
        factory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
        factory.setHostName(ibmMqProperties.getHostName());
        factory.setPort(ibmMqProperties.getPort());
        factory.setChannel(ibmMqProperties.getChannel());
        factory.setQueueManager(ibmMqProperties.getQueueManager());
        return factory;
    }
}
@Configuration
@RequiredArgsConstructor
@Slf4j
public class MqConfiguration {

    private final IbmMqInitializer ibmMqInitializer;

    @Bean
    public CamelContextConfiguration contextConfiguration(@Qualifier(\"saaIbmMqProps\") IbmMqProperties saaIbmMqProps,
                                                          @Qualifier(\"saaIbmMqFactory\") ConnectionFactory saaIbmMqFactory,
                                                          @Qualifier(\"esbIbmMqProps\") IbmMqProperties esbIbmMqProps,
                                                          @Qualifier(\"esbIbmMqFactory\") ConnectionFactory esbIbmMqFactory) {
        return new CamelContextConfiguration() {
            @Override
            public void beforeApplicationStart(CamelContext context) {
                try {
                    ibmMqInitializer.configure(context, saaIbmMqProps, saaIbmMqFactory);
                    ibmMqInitializer.configure(context, esbIbmMqProps, esbIbmMqFactory);
                } catch (JMSException e) {
                    log.error(\"Failed to connect to MQ\", e);
                }
            }

            @Override
            public void afterApplicationStart(CamelContext camelContext) {
            }
        };
    }
}

如果我只使用一个 ConnectionFactory 没有问题,但是只要我再添加一个,例如:

    @Bean
    public ConnectionFactory saaIbmMqFactory(@Qualifier(\"saaIbmMqProps\") IbmMqProperties ibmMqProperties) throws JMSException {
        return getMqQueueConnectionFactory(ibmMqProperties);
    }
@Service
public class SaaRoute extends RouteBuilder {

    public static final String STATUS = \"status\";

    private final SaaProcessor processor;

    private final IbmMqProperties saaIbmMqProperties;
    private final IbmMqProperties esbIbmMqProperties;

    public SaaRoute(SaaProcessor processor,
                    @Qualifier(\"saaIbmMqProps\") IbmMqProperties saaIbmMqProperties,
                    @Qualifier(\"esbIbmMqProps\") IbmMqProperties esbIbmMqProperties) {
        this.processor = processor;
        this.saaIbmMqProperties = saaIbmMqProperties;
        this.esbIbmMqProperties = esbIbmMqProperties;
    }

    @Override
    public void configure() {
        from(saaIbmMqProperties.getQueue()).routeId(\"FromSAA\")
                .log(LoggingLevel.DEBUG, log, \"New message received\")
                .process(processor)
                .choice()
                .when(exchange -exchange.getProperty(STATUS).equals(MessageStatus.SUCCESSFULLY_PARSED))
                    .to(esbIbmMqProperties.getQueue())
                .otherwise()
                    .log(\"Message was not converted\")
                .endChoice();
    }
}

我得到了前面提到的例外。

什么可能导致此异常?

    标签: java spring-boot apache-camel ibm-mq spring-jms


    【解决方案1】:

    如果您使用的是 camel-jms-starter 组件,它会尝试自动发现 ConnectionFactory。如果注册表中只有一个 ConnectionFactory 对象,则默认使用它。但是当存在多个工厂时,必须使用 connectionFactory 端点属性在路由上指定它。

    from(jms:destinationType:destinationName? 
          connectionFactory=#saaIbmMqFactory)
          .log(LoggingLevel.DEBUG, log, "New message received")
          .process(processor)
          .choice()
          .when(exchange -> 
                exchange.getProperty(STATUS)
               .equals(MessageStatus.SUCCESSFULLY_PARSED))
                   .to(esbIbmMqProperties.getQueue())
           .otherwise()
                   .log("Message was not converted")
           .endChoice();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多