SpringBoot Camel ActiveMQ Embedded Broker неожиданно останавливается и перезапускается

У меня проблема с моим приложением SpringBoot Camel.

Он очень хорошо работает с не встроенным брокером. Вот его конфигурация: URL-адрес задается в виде строки, указывающей либо на автономный сервер ActiveMQ, либо на встроенный URL-адрес брокера (vm://dpcgbroker?broker.persistent=false)

@Configuration
public class CamelConfiguration {

@Value("${broker.mqURL}")
String mqURL;


@Bean
CamelContextConfiguration contextConfiguration() {
    return new CamelContextConfiguration() {
        @Override
        public void beforeApplicationStart(CamelContext context) {


            ActiveMQComponent activeMQComponent =  ActiveMQComponent.activeMQComponent(mqURL);
            activeMQComponent.setConfiguration(getJmsConfiguration());

            context.addComponent("jms", activeMQComponent);

            DefaultShutdownStrategy shutdownStrategy = new DefaultShutdownStrategy();
        shutdownStrategy.setTimeUnit(TimeUnit.SECONDS);
            shutdownStrategy.setTimeout(20);
            context.setShutdownStrategy(shutdownStrategy);
        }



        @Override
        public void afterApplicationStart(CamelContext camelContext) {

        }


    };
}


public PooledConnectionFactory getPooledConnectionFactory() {
    PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(getConnectionFactory());

    pooledConnectionFactory.setMaxConnections(30);

    return pooledConnectionFactory;
}

public ActiveMQConnectionFactory getConnectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(mqURL);
    connectionFactory.setTrustAllPackages(true);
    return connectionFactory;
}


public JmsConfiguration getJmsConfiguration() {
    JmsConfiguration jmsConfiguration = new JmsConfiguration();
    jmsConfiguration.setDisableTimeToLive(true);
    jmsConfiguration.setTransacted(true);
    jmsConfiguration.setLazyCreateTransactionManager(false);
    jmsConfiguration.setConnectionFactory(getConnectionFactory());
    jmsConfiguration.setCacheLevelName("CACHE_CONSUMER");
    return jmsConfiguration;
}



@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public PlatformTransactionManager getTransactionManager() {

    PlatformTransactionManager platformTransactionManager = new JmsTransactionManager(getConnectionFactory());
    return platformTransactionManager;
}

Когда я переключаюсь на встроенный брокер, поведение меняется, и Apache ActiveMQ запускается, затем останавливается, а затем перезапускается. Я понятия не имею, почему, и нет никаких исключений

Вот выдержка из логов

15967 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Using Persistence Adapter: MemoryPersistenceAdapter
15991 INFO  - 5063 -  [JMX connector] org.apache.activemq.broker.jmx.ManagementContext     - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
16106 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:1) is starting
16111 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:1) started
16111 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - For help or more information please see: http://activemq.apache.org
16132 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.TransportConnector     - Connector vm://dpcgbroker started
16205 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.TransportConnector     - Connector vm://dpcgbroker stopped
16205 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:1) is shutting down
16213 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:1) uptime 0.274 seconds
16213 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:1) is shutdown
16618 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.camel.processor.aggregate.AggregateProcessor     - Defaulting to MemoryAggregationRepository
16621 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.camel.processor.aggregate.AggregateProcessor     - Using CompletionTimeout to trigger after 10 millis of inactivity.
16647 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.camel.spring.SpringCamelContext     - Skipping starting of route jobStatusRoute as its configured with autoStartup=false
16656 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Using Persistence Adapter: MemoryPersistenceAdapter
16656 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:2) is starting
16657 INFO  - 5063 -  [JMX connector] org.apache.activemq.broker.jmx.ManagementContext     - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
16657 INFO  - 5063 -  [Camel (camel-1) thread #1 - file://conf/DR3/planets/] org.apache.activemq.broker.BrokerService     - Apache ActiveMQ 5.15.2 (dpcgbroker, ID:Greg.local-59246-1525440325893-0:2) started

Проблема в том, что некоторые сообщения отправляются в первом экземпляре брокера, которые теряются при его остановке, тогда второй экземпляр начинается с пустого списка сообщений. Я понятия не имею, почему он останавливается.

PS: я не хочу использовать постоянный встроенный брокер, это бесполезный обходной путь.


person greg    schedule 04.05.2018    source источник
comment
можете ли вы опубликовать весь код со встроенным брокером и getJmsConfiguration()   -  person Hassen Bennour    schedule 04.05.2018
comment
Я добавил весь конфиг @HassenBennour   -  person greg    schedule 04.05.2018
comment
нет причин для описанного поведения... это ваш единственный код или у вас есть что-то другое?   -  person Hassen Bennour    schedule 07.05.2018
comment
У меня есть много других классов (это приложение на основе верблюда). Я начал отлаживать, и я понимаю немного больше, но до сих пор нет решения. Я использую ProducerTemplate для отправки сообщения на конечную точку JMS. В конце отправки соединение закрывается, а затем вызывает закрытие BrokerService, что действительно странно. (без исключений)   -  person greg    schedule 07.05.2018


Ответы (1)


Через некоторое время я понял, что происходит. Все дело в том, что встроенный vm-брокер имеет особое поведение, которое описано в документации в котором говорится

Как только все подключения ВМ к брокеру будут закрыты, встроенный брокер автоматически отключится.

Мое приложение запускалось, затем отправляло сообщение, а затем запускались потребители. Когда я отправлял сообщение, соединение было закрыто, что привело к отключению брокера.

Таким образом, решение состояло в том, чтобы сначала запустить потребителей, а затем позволить производителю публиковать сообщения.

PS: обходной путь, который может быть полезен, — использовать PooledConnectionFactory. Я проверил, и это также работает, так как я предполагаю, что пул поддерживает соединения. С помощью этих трюков вы можете запускать производителей и потребителей в любом порядке.

person greg    schedule 07.05.2018