Hi all,
I'm running 2 brokers (activemq 5.1.0) on 2 different machines, in failover
mode, where the shared folder is on NAS.
I run into a certain problem (too many times) that as Broker A falls, Broker
B is coming up, but the activemq fails to start the derbydb.
error is like :
2008-09-21 03:23:01,783 [erSimpleAppMain] DEBUG JDBCPersistenceAdapter -
Could not get JDBC connection: Failed to start database 'derbydb', see the
next exception for details., due to: Another instance of Derby may have
already booted the database \\IP\broker\derbydb.
ERROR XSDB6: Another instance of Derby may have already booted the database
\\IP\broker\derbydb.
partial stack-trace :
at org.apache.derby.jdbc.EmbeddedDataSource.getConnection(Unknown Source)
at
org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:54)
at
org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.createAdapter(JDBCPersistenceAdapter.java:294)
at
org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getAdapter(JDBCPersistenceAdapter.java:249)
at
org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.start(JDBCPersistenceAdapter.java:155)
at
org.apache.activemq.store.journal.JournalPersistenceAdapter.start(JournalPersistenceAdapter.java:226)
at
org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:1577)
at
org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:1530)
at
org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:540)
at org.apache.activemq.broker.BrokerService.start(BrokerService.java:444)
i know, i could also ask the derby developers, but i see that a retry for
the connection is working as well. i think i'd try to patch the
org/apache/activemq/store/jdbc/TransactionContext.java,
and i'd like you to tell me which jars i need to modify in the broker.
also, if possible, i'd love to get an opinion on the method i've modified in
this class.
i simply added retries, and after 5 times, i quit, in order to let the other
broker to try as well :
public Connection getConnection() throws IOException {
boolean shouldRetry = true;
final int MAX_RETRIES = 5;
final int SLEEP_INTERVAL = 1000;
for (int countLoops = 0 ; (countLoops < MAX_RETRIES) && shouldRetry;
++countLoops)
{
if (connection == null) {
try {
connection = dataSource.getConnection();
boolean autoCommit = !inTx;
if (connection.getAutoCommit() != autoCommit) {
connection.setAutoCommit(autoCommit);
}
shouldRetry = false;
} catch (SQLException e) {
JDBCPersistenceAdapter.log("Could not get JDBC
connection: ", e);
LOG.debug(" *** retries count = " + countLoops, e);
if (countLoops + 1 == MAX_RETRIES)
{
IOException ioe = IOExceptionSupport.create(e);
LOG.debug("gave up on trying to reconnect to the DB
after " + MAX_RETRIES + "retries !!!",
ioe);
System.exit(0);
}
try {
// if reached the 'catch', and didn't throw an
exception, better sleep ...
Thread.sleep(SLEEP_INTERVAL);
} catch (InterruptedException e1) {
}
}
if (!shouldRetry)
{
try {
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
} catch (Throwable e) {
}
}
}
}
return connection;
}
thanks in advance,
gimel
--
View this message in context:
http://www.nabble.com/activemq-in-failover-mode-prints-that-derbydb-is-already-locked-tp19837555p19837555.html
Sent from the ActiveMQ - Dev mailing list archive at Nabble.com.