ActiveMQ
  1. ActiveMQ
  2. AMQ-3396

ActiveMQ fails to restart when there is a zero broker sequence ID

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Incomplete
    • Affects Version/s: 5.5.0
    • Fix Version/s: None
    • Component/s: Message Store
    • Labels:
    • Environment:

      ActiveMQ v5.5.0 on Sun's JDK 1.6.0_23
      OS: Windows XP 2002 with sp3
      Database: Oracle10g using JDBC driver ojdbc6_g.jar v11.2.0.2

    • Regression:
      Regression

      Description

      ActiveMQ broker server fails to start as a Windows Service.
      A NullPointerException happens during startup and then ActiveMQ shuts down automatically.
      Only workaround discovered so far is to drop all the database tables before starting up the server.

      JDBCPersistenceAdapter.java
          public long getLastMessageBrokerSequenceId() throws IOException {
              TransactionContext c = getTransactionContext();
              try {
                  long seq =  getAdapter().doGetLastMessageStoreSequenceId(c);
                  sequenceGenerator.setLastSequenceId(seq);
                  long brokerSeq = 0;
                  if (seq != 0) {
                      byte[] msg = getAdapter().doGetMessageById(c, seq);
                      if (msg != null) {
                          Message last = (Message)wireFormat.unmarshal(new ByteSequence(msg));
                          brokerSeq = last.getMessageId().getBrokerSequenceId();
                      } else {
                         LOG.warn("Broker sequence id wasn't recovered properly, possible duplicates!");
                      }
                  }
                  return brokerSeq;
              } catch (SQLException e) {
                  JDBCPersistenceAdapter.log("JDBC Failure: ", e);
                  throw IOExceptionSupport.create("Failed to get last broker message id: " + e, e);
              } finally {
                  c.close();
              }
          }
      

      When the byte array "msg" is not null but is populated with zeros, the wireFormat unmarshal call will return null.
      This then causes a NullPointerException on line 237 of JDBCPersiistenceAdapter.

      2011-07-07 11:20:02,618 | DEBUG | Locking Query is SELECT * FROM V550_ACTIVEMQ_LOCK FOR UPDATE | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | WrapperSimpleAppMain
      2011-07-07 11:20:02,649 | INFO  | Becoming the master on dataSource: oracle.jdbc.pool.OracleDataSource@1557ee8 | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | WrapperSimpleAppMain
      2011-07-07 11:20:02,649 | INFO  | ActiveMQ 5.5.0-fuse-00-27 JMS Message Broker (FuseActiveMQ-Broker-550) is starting | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
      2011-07-07 11:20:02,649 | INFO  | For help or more information please see: http://activemq.apache.org/ | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
      2011-07-07 11:20:04,774 | ERROR | Failed to start ActiveMQ JMS Message Broker. Reason: java.lang.NullPointerException | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
      java.lang.NullPointerException
      	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getLastMessageBrokerSequenceId(JDBCPersistenceAdapter.java:237)
      	at org.apache.activemq.broker.region.DestinationFactoryImpl.getLastMessageBrokerSequenceId(DestinationFactoryImpl.java:145)
      	at org.apache.activemq.broker.region.RegionBroker.<init>(RegionBroker.java:122)
      	at org.apache.activemq.broker.jmx.ManagedRegionBroker.<init>(ManagedRegionBroker.java:104)
      	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:1838)
      	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:1832)
      	at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:1789)
      	at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:763)
      	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.start(JDBCPersistenceAdapter.java:296)
      	at org.apache.activemq.broker.BrokerService.start(BrokerService.java:490)
      	at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1536)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
      	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
      	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
      	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574)
      	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
      	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
      	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
      	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
      	at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:106)
      	at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:106)
      	at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:71)
      	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
      	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
      	at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:115)
      	at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:74)
      	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
      	at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:143)
      	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
      	at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:85)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.apache.activemq.console.Main.runTaskClass(Main.java:251)
      	at org.apache.activemq.console.Main.main(Main.java:107)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:240)
      	at java.lang.Thread.run(Thread.java:662)
      2011-07-07 11:20:04,837 | INFO  | ActiveMQ Message Broker (FuseActiveMQ-Broker-550, null) is shutting down | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain 
      

        Activity

        Hide
        Timothy Bish added a comment -

        We need more information to understand how this could happen.

        Show
        Timothy Bish added a comment - We need more information to understand how this could happen.
        Hide
        Rob Davies added a comment -

        Downgraded to major - we don't generally see this problem and require more information to understand how the broker got into this state

        Show
        Rob Davies added a comment - Downgraded to major - we don't generally see this problem and require more information to understand how the broker got into this state
        Hide
        kimm king added a comment -

        why the msg is not null but populated with zeros?

        Show
        kimm king added a comment - why the msg is not null but populated with zeros?
        Hide
        Timothy Bish added a comment -

        We could use a test case, or some other info on how your broker got into this situation.

        Show
        Timothy Bish added a comment - We could use a test case, or some other info on how your broker got into this situation.

          People

          • Assignee:
            Unassigned
            Reporter:
            Michael Alford
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development