[ https://issues.apache.org/jira/browse/AMQ-5086?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Hadrian Zbarcea updated AMQ-5086: --------------------------------- Fix Version/s: 5.10.1 > vm transport create=false&waitForStart race condition > ----------------------------------------------------- > > Key: AMQ-5086 > URL: https://issues.apache.org/jira/browse/AMQ-5086 > Project: ActiveMQ > Issue Type: Bug > Components: Broker > Affects Versions: 5.7.0, 5.8.0, 5.9.0 > Reporter: Christian Mamen > Fix For: 5.10.1, 5.11.0 > > Attachments: AMQ5086.patch > > > Experience this bug on 5.7.0, I think this is the same on the trunk > using vm transport for a client to connect to an embedded broker, in a > multithreaded application, I'm experiencing a an error (sometimes) which > appears to be a race condition at startup. > Im using create=false and waitForStart to create a connectionFactory for a > client connection > vm://ApplicationName?create=false&waitForStart=120000 > The broker service is started in a seperate thread > the client connection is started first. but surprisingly it tries start the > brokers transport connector. An apparent glitch follows when the broker > service stops and re-start the transport. > {noformat} > 2014-03-05 11:07:57,626 [ClientConnection_thread] INFO > org.apache.activemq.broker.TransportConnector - Connector > vm://ApplicationName Started > [...] > 2014-03-05 11:08:07,009 [Main_thread] INFO > org.apache.activemq.broker.TransportConnector - Connector > vm://ApplicationName Stopped > 2014-03-05 11:08:07,011 [Main_thread] INFO > org.apache.activemq.broker.TransportConnector - Connector > vm://ApplicationName Started > {noformat} > I look into the activemq source and saw this: > BrokerService.class > {code} > public void start() throws Exception { > [...] > // in jvm master slave, lets not publish over existing broker till we get > the lock > final BrokerRegistry brokerRegistry = BrokerRegistry.getInstance(); > if (brokerRegistry.lookup(getBrokerName()) == null) { > brokerRegistry.bind(getBrokerName(), BrokerService.this); > } > startPersistenceAdapter(startAsync); > startBroker(startAsync); > brokerRegistry.bind(getBrokerName(), BrokerService.this); > {code} > VMTransportFactory.class > {code} > private BrokerService lookupBroker(final BrokerRegistry registry, final > String brokerName, int waitForStart) { > BrokerService broker = null; > synchronized(registry.getRegistryMutext()) { > broker = registry.lookup(brokerName); > if (broker == null && waitForStart > 0) { > final long expiry = System.currentTimeMillis() + waitForStart; > while (broker == null && expiry > > System.currentTimeMillis()) { > long timeout = Math.max(0, expiry - > System.currentTimeMillis()); > try { > LOG.debug("waiting for broker named: " + brokerName + > " to start"); > registry.getRegistryMutext().wait(timeout); > } catch (InterruptedException ignored) { > } > broker = registry.lookup(brokerName); > } > } > } > return broker; > } > {code} > It appears that create=false and waitForStart only waits for the broker to be > added to the BrokerRegistry. However when the brokerService is starts, it > seems that the broker is added to the registry before it is started. > I believe some synchronization is missing make the VMTransportFactory wait > for the broker not only to be added to the registry, but also fully started. -- This message was sent by Atlassian JIRA (v6.3.4#6332)