You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Erik Osterman <e...@osterman.com> on 2010/12/18 02:53:46 UTC

ACTIVEMQ_LOCK.BROKER_NAME Is Always NULL

I've recently setup ActiveMQ 5.4.2 in a JDBC Master-Slave sandbox configuration on localhost (CentOS 5.4 i686) with Java(TM) SE Runtime Environment (build 1.6.0_14-b08). The JDBC driver is mysql-connector-java-5.1.14-bin.jar. The database is mysql-server-5.0.77-4.el5_4.2.

It becomes master, but never registers it's brokerName in the database. I can submit persistent messages and the successfully get logged in ACTIVEMQ_MSGS. The entire schema was created automatically by ActiveMQ. 

2010-12-17 20:34:51,793 | INFO  | Attempting to acquire the exclusive lock to become the Master broker | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
2010-12-17 20:34:51,810 | INFO  | Becoming the master on dataSource: org.apache.commons.dbcp.BasicDataSource@3b1f38 | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main

mysql> select * from ACTIVEMQ_LOCK;
+----+------+-------------+
| ID | TIME | BROKER_NAME |
+----+------+-------------+
|  1 | NULL | NULL        | 
+----+------+-------------+
1 row in set (0.00 sec)

mysql> select count(*) from ACTIVEMQ_MSGS;
+----------+
| count(*) |
+----------+
|     1000 | 
+----------+
1 row in set (0.00 sec)


The brokerName has been set in the running configuration for the <broker/>.
 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">

I have also tried adding -Dactivemq.hostname=ec2-174-129-179-24.compute-1.amazonaws.com to the init script, but it doesn't have any affect either.

Complete configuration below.

Any input greatly appreciated!


Erik Osterman
<e...@osterman.com>
http://www.osterman.com





<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <value>file:${activemq.base}/conf/credentials.properties</value>
    </property>      
  </bean>

  <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">
    <managementContext>
      <managementContext createConnector="false"/>
    </managementContext>

    <networkConnectors>
      <networkConnector uri="multicast://default"/>
    </networkConnectors>


    <persistenceAdapter>
      <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds" />
    </persistenceAdapter>

    <plugins>
      <statisticsBrokerPlugin/>
    </plugins>
        
    <systemUsage>
      <systemUsage>
        <memoryUsage>
          <memoryUsage limit="20 mb"/>
        </memoryUsage>
        <storeUsage>
          <storeUsage limit="1 gb"/>
        </storeUsage>
        <tempUsage>
          <tempUsage limit="100 mb"/>
        </tempUsage>
      </systemUsage>
    </systemUsage>
  
    <transportConnectors>
      <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/> -->
      <transportConnector name="stomp" uri="stomp://0.0.0.0:61612?transport.closeAsync=false"/> 
      <transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.closeAsync=false"/> 
    </transportConnectors>

  </broker>

  <import resource="jetty.xml"/>

  <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
    <property name="username" value="activemq"/>
    <property name="password" value="activemq"/>
    <property name="maxActive" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
  </bean>
 
</beans>






Re: ACTIVEMQ_LOCK.BROKER_NAME Is Always NULL

Posted by mikmela <mi...@yahoo.com>.
Does anyone know if this issue with BROKER_NAME in ACTIVEMQ_LOCK table has
ever been resolved?

It seems that for some reason it was decided that broker cluster (i.e. group
of 1 master and N slaves) must have a dedicated database instance?!  Using
BROKER_NAME (which, actually, should be a broker cluster name would allow to
lock slaves on per record bases, i.e. thet same db table could be shared by
multiple cluster of brokers configered as master/slave.



--
View this message in context: http://activemq.2283324.n4.nabble.com/ACTIVEMQ-LOCK-BROKER-NAME-Is-Always-NULL-tp3093361p4331440.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Re: ACTIVEMQ_LOCK.BROKER_NAME Is Always NULL

Posted by Dejan Bosanac <de...@nighttale.net>.
Hi Erik,

you're right, it seems this column is just being ignored. The whole
lock row is just meant to prevent other brokers to use the database.
You can raise Jira for this (and possibly provide a patch).

Cheers
--
Dejan Bosanac
-----------------
FuseSource - The experts in open source integration and messaging.
Email: dejanb@fusesource.com
Web: http://fusesource.com
Twitter:  http://twitter.com/dejanb
ActiveMQ in Action - http://www.manning.com/snyder/
Blog - http://www.nighttale.net



On Mon, Dec 20, 2010 at 11:44 PM, Erik Osterman <e...@osterman.com> wrote:
> After some more debugging, I think that the ACTIVEMQ_LOCK.BROKER_NAME column is simply not maintained. I decided to dig deeper after downgrading to mysql-connector-java-5.0.8 did not change the behavior.
>
> Turning on the MySQL query log and searching for all modifications of ACTIVEMQ_LOCK reveal the following:
>
> grep ACTIVEMQ_LOCK /tmp/mysql_query.log
>
> 3 Query       CREATE TABLE ACTIVEMQ_LOCK( ID BIGINT NOT NULL, TIME BIGINT, BROKER_NAME VARCHAR(250), PRIMARY KEY (ID) ) ENGINE=INNODB
> 3 Query       INSERT INTO ACTIVEMQ_LOCK(ID) VALUES (1)
> 3 Query       SELECT * FROM ACTIVEMQ_LOCK FOR UPDATE
> 3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292883941305 WHERE ID = 1
> 3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292883971306 WHERE ID = 1
> 3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884001308 WHERE ID = 1
> 3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884031306 WHERE ID = 1
> 3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884061307 WHERE ID = 1
>
> It never attempts to set the BROKER_NAME column. This is corroborated by the SQL statement in the source code in org.apache.activemq.store.jdbc, Statements::getLockUpdateStatement()
>
> https://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/store/jdbc/Statements.java
>
>
> It would seem to me that at the point it executes the UPDATE ACTIVEMQ_LOCK, it should also be seting the BROKER_NAME column.
>
>   public String getLockUpdateStatement() {
>        if (lockUpdateStatement == null) {
>            lockUpdateStatement = "UPDATE " + getFullLockTableName() + " SET TIME = ? WHERE ID = 1";
>        }
>        return lockUpdateStatement;
>    }
>
> Can any one confirm these conclusions or am I jumping the gun here? Perhaps BROKER_NAME in the ACTIVEMQ_LOCKS table does not mean what I think it should mean.
>
>
> I apologize if this message should be posted to the ActiveMQ developers list. Please let me know if it would be best to repost it there.
>
>
>
> Thanks!
>
>
>
> Erik Osterman
> <e...@osterman.com>
> http://www.osterman.com
>
>
>
>
>
> On Dec 17, 2010, at 5:53 PM, Erik Osterman wrote:
>
>> I've recently setup ActiveMQ 5.4.2 in a JDBC Master-Slave sandbox configuration on localhost (CentOS 5.4 i686) with Java(TM) SE Runtime Environment (build 1.6.0_14-b08). The JDBC driver is mysql-connector-java-5.1.14-bin.jar. The database is mysql-server-5.0.77-4.el5_4.2.
>>
>> It becomes master, but never registers it's brokerName in the database. I can submit persistent messages and the successfully get logged in ACTIVEMQ_MSGS. The entire schema was created automatically by ActiveMQ.
>>
>> 2010-12-17 20:34:51,793 | INFO  | Attempting to acquire the exclusive lock to become the Master broker | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
>> 2010-12-17 20:34:51,810 | INFO  | Becoming the master on dataSource: org.apache.commons.dbcp.BasicDataSource@3b1f38 | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
>>
>> mysql> select * from ACTIVEMQ_LOCK;
>> +----+------+-------------+
>> | ID | TIME | BROKER_NAME |
>> +----+------+-------------+
>> |  1 | NULL | NULL        |
>> +----+------+-------------+
>> 1 row in set (0.00 sec)
>>
>> mysql> select count(*) from ACTIVEMQ_MSGS;
>> +----------+
>> | count(*) |
>> +----------+
>> |     1000 |
>> +----------+
>> 1 row in set (0.00 sec)
>>
>>
>> The brokerName has been set in the running configuration for the <broker/>.
>> <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">
>>
>> I have also tried adding -Dactivemq.hostname=ec2-174-129-179-24.compute-1.amazonaws.com to the init script, but it doesn't have any affect either.
>>
>> Complete configuration below.
>>
>> Any input greatly appreciated!
>>
>>
>> Erik Osterman
>> <e...@osterman.com>
>> http://www.osterman.com
>>
>>
>>
>>
>>
>> <beans
>>  xmlns="http://www.springframework.org/schema/beans"
>>  xmlns:amq="http://activemq.apache.org/schema/core"
>>  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
>>  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
>>  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
>>    <property name="locations">
>>      <value>file:${activemq.base}/conf/credentials.properties</value>
>>    </property>
>>  </bean>
>>
>>  <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">
>>    <managementContext>
>>      <managementContext createConnector="false"/>
>>    </managementContext>
>>
>>    <networkConnectors>
>>      <networkConnector uri="multicast://default"/>
>>    </networkConnectors>
>>
>>
>>    <persistenceAdapter>
>>      <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds" />
>>    </persistenceAdapter>
>>
>>    <plugins>
>>      <statisticsBrokerPlugin/>
>>    </plugins>
>>
>>    <systemUsage>
>>      <systemUsage>
>>        <memoryUsage>
>>          <memoryUsage limit="20 mb"/>
>>        </memoryUsage>
>>        <storeUsage>
>>          <storeUsage limit="1 gb"/>
>>        </storeUsage>
>>        <tempUsage>
>>          <tempUsage limit="100 mb"/>
>>        </tempUsage>
>>      </systemUsage>
>>    </systemUsage>
>>
>>    <transportConnectors>
>>      <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/> -->
>>      <transportConnector name="stomp" uri="stomp://0.0.0.0:61612?transport.closeAsync=false"/>
>>      <transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.closeAsync=false"/>
>>    </transportConnectors>
>>
>>  </broker>
>>
>>  <import resource="jetty.xml"/>
>>
>>  <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
>>    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
>>    <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
>>    <property name="username" value="activemq"/>
>>    <property name="password" value="activemq"/>
>>    <property name="maxActive" value="200"/>
>>    <property name="poolPreparedStatements" value="true"/>
>>  </bean>
>>
>> </beans>
>>
>>
>>
>>
>>
>
>

Re: ACTIVEMQ_LOCK.BROKER_NAME Is Always NULL

Posted by Erik Osterman <e...@osterman.com>.
After some more debugging, I think that the ACTIVEMQ_LOCK.BROKER_NAME column is simply not maintained. I decided to dig deeper after downgrading to mysql-connector-java-5.0.8 did not change the behavior. 

Turning on the MySQL query log and searching for all modifications of ACTIVEMQ_LOCK reveal the following:

grep ACTIVEMQ_LOCK /tmp/mysql_query.log 

3 Query       CREATE TABLE ACTIVEMQ_LOCK( ID BIGINT NOT NULL, TIME BIGINT, BROKER_NAME VARCHAR(250), PRIMARY KEY (ID) ) ENGINE=INNODB
3 Query       INSERT INTO ACTIVEMQ_LOCK(ID) VALUES (1)
3 Query       SELECT * FROM ACTIVEMQ_LOCK FOR UPDATE
3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292883941305 WHERE ID = 1
3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292883971306 WHERE ID = 1
3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884001308 WHERE ID = 1
3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884031306 WHERE ID = 1
3 Query       UPDATE ACTIVEMQ_LOCK SET TIME = 1292884061307 WHERE ID = 1

It never attempts to set the BROKER_NAME column. This is corroborated by the SQL statement in the source code in org.apache.activemq.store.jdbc, Statements::getLockUpdateStatement()

https://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/store/jdbc/Statements.java


It would seem to me that at the point it executes the UPDATE ACTIVEMQ_LOCK, it should also be seting the BROKER_NAME column. 

   public String getLockUpdateStatement() {
        if (lockUpdateStatement == null) {
            lockUpdateStatement = "UPDATE " + getFullLockTableName() + " SET TIME = ? WHERE ID = 1";
        }
        return lockUpdateStatement;
    }

Can any one confirm these conclusions or am I jumping the gun here? Perhaps BROKER_NAME in the ACTIVEMQ_LOCKS table does not mean what I think it should mean. 


I apologize if this message should be posted to the ActiveMQ developers list. Please let me know if it would be best to repost it there.



Thanks!



Erik Osterman
<e...@osterman.com>
http://www.osterman.com





On Dec 17, 2010, at 5:53 PM, Erik Osterman wrote:

> I've recently setup ActiveMQ 5.4.2 in a JDBC Master-Slave sandbox configuration on localhost (CentOS 5.4 i686) with Java(TM) SE Runtime Environment (build 1.6.0_14-b08). The JDBC driver is mysql-connector-java-5.1.14-bin.jar. The database is mysql-server-5.0.77-4.el5_4.2.
> 
> It becomes master, but never registers it's brokerName in the database. I can submit persistent messages and the successfully get logged in ACTIVEMQ_MSGS. The entire schema was created automatically by ActiveMQ. 
> 
> 2010-12-17 20:34:51,793 | INFO  | Attempting to acquire the exclusive lock to become the Master broker | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
> 2010-12-17 20:34:51,810 | INFO  | Becoming the master on dataSource: org.apache.commons.dbcp.BasicDataSource@3b1f38 | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
> 
> mysql> select * from ACTIVEMQ_LOCK;
> +----+------+-------------+
> | ID | TIME | BROKER_NAME |
> +----+------+-------------+
> |  1 | NULL | NULL        | 
> +----+------+-------------+
> 1 row in set (0.00 sec)
> 
> mysql> select count(*) from ACTIVEMQ_MSGS;
> +----------+
> | count(*) |
> +----------+
> |     1000 | 
> +----------+
> 1 row in set (0.00 sec)
> 
> 
> The brokerName has been set in the running configuration for the <broker/>.
> <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">
> 
> I have also tried adding -Dactivemq.hostname=ec2-174-129-179-24.compute-1.amazonaws.com to the init script, but it doesn't have any affect either.
> 
> Complete configuration below.
> 
> Any input greatly appreciated!
> 
> 
> Erik Osterman
> <e...@osterman.com>
> http://www.osterman.com
> 
> 
> 
> 
> 
> <beans
>  xmlns="http://www.springframework.org/schema/beans"
>  xmlns:amq="http://activemq.apache.org/schema/core"
>  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
>  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
>  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
>    <property name="locations">
>      <value>file:${activemq.base}/conf/credentials.properties</value>
>    </property>      
>  </bean>
> 
>  <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ec2-174-129-179-24.compute-1.amazonaws.com" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true" useShutdownHook="false" useJmx="true">
>    <managementContext>
>      <managementContext createConnector="false"/>
>    </managementContext>
> 
>    <networkConnectors>
>      <networkConnector uri="multicast://default"/>
>    </networkConnectors>
> 
> 
>    <persistenceAdapter>
>      <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds" />
>    </persistenceAdapter>
> 
>    <plugins>
>      <statisticsBrokerPlugin/>
>    </plugins>
> 
>    <systemUsage>
>      <systemUsage>
>        <memoryUsage>
>          <memoryUsage limit="20 mb"/>
>        </memoryUsage>
>        <storeUsage>
>          <storeUsage limit="1 gb"/>
>        </storeUsage>
>        <tempUsage>
>          <tempUsage limit="100 mb"/>
>        </tempUsage>
>      </systemUsage>
>    </systemUsage>
> 
>    <transportConnectors>
>      <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/> -->
>      <transportConnector name="stomp" uri="stomp://0.0.0.0:61612?transport.closeAsync=false"/> 
>      <transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.closeAsync=false"/> 
>    </transportConnectors>
> 
>  </broker>
> 
>  <import resource="jetty.xml"/>
> 
>  <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
>    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
>    <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
>    <property name="username" value="activemq"/>
>    <property name="password" value="activemq"/>
>    <property name="maxActive" value="200"/>
>    <property name="poolPreparedStatements" value="true"/>
>  </bean>
> 
> </beans>
> 
> 
> 
> 
>