[ 
https://issues.apache.org/activemq/browse/AMQ-1956?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gary Tully resolved AMQ-1956.
-----------------------------

    Fix Version/s: 5.3.0
       Resolution: Fixed

Committed revision 701088.

thanks for the analysis Chris. Since the users of getDatabaseLocker already 
check for null i simply return null if a lock is not to be used.
note for future reference: ensure you check the "grant ASF License" check box 
when you submit a patch or enhancement, otherwise your contribution cannot be 
used. thanks.

> NPE during broker shutdown when useDatabaseLock="false"
> -------------------------------------------------------
>
>                 Key: AMQ-1956
>                 URL: https://issues.apache.org/activemq/browse/AMQ-1956
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Message Store
>    Affects Versions: 5.1.0
>            Reporter: Chris Pettitt
>            Assignee: Gary Tully
>             Fix For: 5.3.0
>
>         Attachments: BrokerStopFailure.java, 
> NoLockerJDBCPersistenceAdapter.java
>
>
> Steps:
> 1. Create a broker with the persistence adapter set to not use database 
> locking (useDatabaseLock="false")
> 2. Start broker
> 3. Stop broker (but keep the process running, as in a servlet container)
> Result:
> In the logs, I see the following error every 30 seconds:
> 2008/09/25 15:23:55.506 INFO 
> [org.apache.activemq.store.jdbc.JDBCPersistenceAdapter] No longer able to 
> keep the exclusive lock so giving up being a master
> 2008/09/25 15:23:55.506 WARN 
> [org.apache.activemq.store.jdbc.JDBCPersistenceAdapter] Failed to stop broker
> 2008/09/25 15:24:25.504 ERROR 
> [org.apache.activemq.store.jdbc.DefaultDatabaseLocker] Failed to update 
> database lock: java.lang.NullPointerException
> java.lang.NullPointerException
>         at 
> org.apache.activemq.store.jdbc.DefaultDatabaseLocker.keepAlive(DefaultDatabaseLocker.java:102)
>         at 
> org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.databaseLockKeepAlive(JDBCPersistenceAdapter.java:458)
>         at 
> org.apache.activemq.store.jdbc.JDBCPersistenceAdapter$3.run(JDBCPersistenceAdapter.java:260)
>         at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
>         at 
> java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:280)
>         at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:135)
>         at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:65)
>         at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:142)
>         at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:166)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
>         at java.lang.Thread.run(Thread.java:613)
> Analysis:
> During startup, JDBCPersistenceAdapter only initializes the database locker 
> if useDatabaseLock if true. This is done through lazy initialization by 
> calling getDatabaseLocker (at ~ line 172):
>         if (isUseDatabaseLock()) {
>             DatabaseLocker service = getDatabaseLocker();
>             if (service == null) {
>                 LOG.warn("No databaseLocker configured for the JDBC 
> Persistence Adapter");
>             } else {
>                 service.start();
>             }
>         }
> During shutdown, JDBCPersistenceAdapter calls getDatabaseLocker() to shut it 
> down, but it does not check if isUseDatabaseLock() is true in this case:
>     public synchronized void stop() throws Exception {
>         if (clockTicket != null) {
>             clockTicket.cancel(true);
>             clockTicket = null;
>         }
>         if (clockDaemon != null) {
>             clockDaemon.shutdown();
>             clockDaemon = null;
>         }
>         DatabaseLocker service = getDatabaseLocker();
>         if (service != null) {
>             service.stop();
>         }
>     }
> This actually causes database locker to be initialized and it subsequently 
> lazy-initializes an executor to run a task which calls keepAlive(...). The 
> executor threads are set as daemon threads which prevents this issue from 
> showing up when the lifetime of the process is the same as the broker. When 
> the broker is deployed in an app server which can outlive the broker then the 
> above error is logged every 30 seconds.
> I'm attaching one way to solve this problem without having to check 
> everywhere if useDatabaseLock="false".
> Attached:
> BrokerStopFailure.java - sample program that reproduces this bug
> NoLockerJDBCPersistenceAdapter.java - sample extension to 
> JDBCPersistenceAdapter that fixes this bug

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to