Author: dblevins
Date: Thu Jun 24 09:04:47 2010
New Revision: 957462

URL: http://svn.apache.org/viewvc?rev=957462&view=rev
Log:
Patch from Andy Gumbrecht, OPENEJB-1267: ActiveMQResourceAdapter improvements
Thanks, Andy!

Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQ5Factory.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQFactory.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/OpenEjb2ConversionTest.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/activemq/OpenEjbBrokerFactoryTest.java
    openejb/trunk/openejb3/pom.xml

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQ5Factory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQ5Factory.java?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQ5Factory.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQ5Factory.java
 Thu Jun 24 09:04:47 2010
@@ -31,17 +31,22 @@ import javax.sql.DataSource;
 import java.net.URI;
 import java.util.Map;
 import java.util.Properties;
+import org.apache.openejb.util.LogCategory;
 
 public class ActiveMQ5Factory implements BrokerFactoryHandler {
+
     private static final ThreadLocal<Properties> threadProperties = new 
ThreadLocal<Properties>();
+    private static BrokerService broker = null;
+    private static Throwable throwable = null;
 
     public static void setThreadProperties(Properties value) {
         threadProperties.set(value);
     }
 
-    public BrokerService createBroker(URI brokerURI) throws Exception {
-        URI uri = new URI(brokerURI.getRawSchemeSpecificPart());
-        BrokerService broker = BrokerFactory.createBroker(uri);
+    public BrokerService createBroker(final URI brokerURI) throws Exception {
+
+        final URI uri = new URI(brokerURI.getRawSchemeSpecificPart());
+        broker = BrokerFactory.createBroker(uri);
 
         Properties properties = getLowerCaseProperties();
 
@@ -62,8 +67,8 @@ public class ActiveMQ5Factory implements
                     Context context = containerSystem.getJNDIContext();
                     Object obj = context.lookup("openejb/Resource/" + 
resouceId);
                     if (!(obj instanceof DataSource)) {
-                        throw new IllegalArgumentException("Resource with id " 
+ resouceId +
-                            " is not a DataSource, but is " + 
obj.getClass().getName());
+                        throw new IllegalArgumentException("Resource with id " 
+ resouceId
+                                + " is not a DataSource, but is " + 
obj.getClass().getName());
                     }
                     dataSource = (DataSource) obj;
                 } catch (NamingException e) {
@@ -72,6 +77,12 @@ public class ActiveMQ5Factory implements
             }
 
             JDBCPersistenceAdapter persistenceAdapter = new 
JDBCPersistenceAdapter();
+
+            if (properties.containsKey("usedatabaselock")) {
+                //This must be false for hsqldb
+                
persistenceAdapter.setUseDatabaseLock(Boolean.parseBoolean(properties.getProperty("usedatabaselock",
 "true")));
+            }
+
             persistenceAdapter.setDataSource(dataSource);
             broker.setPersistenceAdapter(persistenceAdapter);
         } else {
@@ -79,6 +90,43 @@ public class ActiveMQ5Factory implements
             broker.setPersistenceAdapter(persistenceAdapter);
         }
 
+        //We must close the broker
+        broker.setUseShutdownHook(false);
+        broker.setSystemExitOnShutdown(false);
+
+        //Notify when an error occurs on shutdown.
+        
broker.setUseLoggingForShutdownErrors(org.apache.openejb.util.Logger.getInstance(LogCategory.OPENEJB,
 "org.apache.openejb.util.resources").isErrorEnabled());
+
+        final Thread start = new Thread("ActiveMQFactory start and 
checkpoint") {
+
+            @Override
+            public void run() {
+                try {
+                    //Start before returning - this is known to be safe.
+                    broker.start();
+                    broker.waitUntilStarted();
+
+                    //Force a checkpoint to initialize pools
+                    broker.getPersistenceAdapter().checkpoint(true);
+                } catch (Throwable t) {
+                    throwable = t;
+                }
+            }
+        };
+
+        start.setDaemon(true);
+        start.start();
+
+        try {
+            start.join(5000);
+        } catch (InterruptedException e) {
+            //Ignore
+        }
+
+        if (null != throwable) {
+            org.apache.openejb.util.Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources").error("ActiveMQ failed to start within 5 
seconds - It may not be usable", throwable);
+        }
+
         return broker;
     }
 
@@ -97,6 +145,4 @@ public class ActiveMQ5Factory implements
         }
         return newProperties;
     }
-
-
-}
\ No newline at end of file
+}

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQFactory.java?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQFactory.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQFactory.java
 Thu Jun 24 09:04:47 2010
@@ -43,28 +43,28 @@ public class ActiveMQFactory {
                 clazz = 
Class.forName("org.apache.openejb.resource.activemq.ActiveMQ4Factory");
                 brokerPrefix = "amq4factory:";
             } catch (java.lang.Throwable t2) {
-                throw new RuntimeException("Unable to load ActiveMQFactory");
+                    throw new RuntimeException("Unable to load 
ActiveMQFactory: Check ActiveMQ jar files are on classpath", t1);
             }
         }
 
         try {
             instance = clazz.newInstance();
         } catch (InstantiationException e) {
-            throw new RuntimeException("Unable to create ActiveMQFactory 
instance");
+                throw new RuntimeException("Unable to create ActiveMQFactory 
instance", e);
         } catch (IllegalAccessException e) {
-            throw new RuntimeException("Unable to access ActiveMQFactory 
instance");
+                throw new RuntimeException("Unable to access ActiveMQFactory 
instance", e);
         }
 
         try {
             setThreadProperties = 
clazz.getDeclaredMethod("setThreadProperties", new Class[]{Properties.class});
         } catch (NoSuchMethodException e) {
-            throw new RuntimeException("Unable to create ActiveMQFactory 
setThreadProperties method");
+                throw new RuntimeException("Unable to create ActiveMQFactory 
setThreadProperties method", e);
         }
 
         try {
             createBroker = clazz.getDeclaredMethod("createBroker", new 
Class[]{URI.class});
         } catch (NoSuchMethodException e) {
-            throw new RuntimeException("Unable to create ActiveMQFactory 
setThreadProperties method");
+                throw new RuntimeException("Unable to create ActiveMQFactory 
setThreadProperties method", e);
         }
     }
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
 Thu Jun 24 09:04:47 2010
@@ -24,10 +24,12 @@ import javax.resource.spi.ResourceAdapte
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Properties;
-
+import org.apache.openejb.util.LogCategory;
 
 public class ActiveMQResourceAdapter extends 
org.apache.activemq.ra.ActiveMQResourceAdapter {
+
     private String dataSource;
+    private String useDatabaseLock;
 
     public String getDataSource() {
         return dataSource;
@@ -36,6 +38,11 @@ public class ActiveMQResourceAdapter ext
     public void setDataSource(String dataSource) {
         this.dataSource = dataSource;
     }
+
+    public void setUseDatabaseLock(String useDatabaseLock) {
+        this.useDatabaseLock = useDatabaseLock;
+    }
+
 //   DMB:  Work in progress.  These all should go into the service-jar.xml
 //   Sources of info:
 //         - http://activemq.apache.org/resource-adapter-properties.html
@@ -104,20 +111,25 @@ public class ActiveMQResourceAdapter ext
 //    public void setTopicPrefetch(Integer integer) {
 //        super.setTopicPrefetch(integer);
 //    }
+    
+    @Override
+    public void start(final BootstrapContext bootstrapContext) throws 
ResourceAdapterInternalException {
+        final Properties properties = new Properties();
+
+        //Add data source property
+        if (null != this.dataSource) {
+            properties.put("DataSource", this.dataSource);
+        }
 
-    public void start(BootstrapContext bootstrapContext) throws 
ResourceAdapterInternalException {
-        Properties properties = new Properties();
-
-        // add data source property
-        if (dataSource != null) {
-            properties.put("DataSource", dataSource);
+        if (null != this.useDatabaseLock) {
+            properties.put("UseDatabaseLock", this.useDatabaseLock);
         }
 
         // prefix server uri with openejb: so our broker factory is used
-        String brokerXmlConfig = getBrokerXmlConfig();
+        final String brokerXmlConfig = getBrokerXmlConfig();
         if (brokerXmlConfig != null && brokerXmlConfig.startsWith("broker:")) {
             try {
-                URISupport.CompositeData compositeData = 
URISupport.parseComposite(new URI(brokerXmlConfig));
+                final URISupport.CompositeData compositeData = 
URISupport.parseComposite(new URI(brokerXmlConfig));
                 compositeData.getParameters().put("persistent", "false");
                 setBrokerXmlConfig(ActiveMQFactory.getBrokerMetaFile() + 
compositeData.toURI());
             } catch (URISyntaxException e) {
@@ -138,4 +150,34 @@ public class ActiveMQResourceAdapter ext
             }
         }
     }
+
+    @Override
+    public void stop() {
+
+        final ActiveMQResourceAdapter ra = this;
+
+        final Thread stopThread = new Thread("ActiveMQResourceAdapter stop") {
+
+            @Override
+            public void run() {
+                ra.stopImpl();
+            }
+        };
+
+        stopThread.setDaemon(true);
+        stopThread.start();
+
+        try {
+            //Block for a maximum of 5 seconds waiting for this thread to die.
+            stopThread.join(5000);
+        } catch (InterruptedException ex) {
+            org.apache.openejb.util.Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources").warning("Gave up on ActiveMQ shutdown", 
ex);
+            return;
+        }
+    }
+
+    private void stopImpl() {
+        super.stop();
+        org.apache.openejb.util.Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources").info("Stopped ActiveMQ");
+    }
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/OpenEjb2ConversionTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/OpenEjb2ConversionTest.java?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/OpenEjb2ConversionTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/OpenEjb2ConversionTest.java
 Thu Jun 24 09:04:47 2010
@@ -106,7 +106,7 @@ public class OpenEjb2ConversionTest exte
 //        System.out.println("expected = " + expected);
 //        System.out.println("actual = " + actual);
         
-        Diff myDiff = new Diff(expected, actual);
+        Diff myDiff = new Diff(expected.trim(), actual.trim());
         assertTrue("Files are similar " + myDiff, myDiff.similar());
     }
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/activemq/OpenEjbBrokerFactoryTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/activemq/OpenEjbBrokerFactoryTest.java?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/activemq/OpenEjbBrokerFactoryTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/activemq/OpenEjbBrokerFactoryTest.java
 Thu Jun 24 09:04:47 2010
@@ -27,7 +27,6 @@ import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.naming.spi.InitialContextFactory;
-import javax.sql.DataSource;
 
 import junit.framework.TestCase;
 import org.apache.activemq.broker.BrokerFactory;
@@ -46,6 +45,7 @@ import org.apache.xbean.naming.context.I
 import org.hsqldb.jdbc.jdbcDataSource;
 
 public class OpenEjbBrokerFactoryTest extends TestCase {
+
     public void testBrokerUri() throws Exception {
         final String prefix = ActiveMQFactory.getBrokerMetaFile();
         assertEquals(prefix + 
"broker:(tcp://localhost:61616)?persistent=false",
@@ -59,13 +59,13 @@ public class OpenEjbBrokerFactoryTest ex
     }
 
     private String getBrokerUri(String brokerUri) throws URISyntaxException {
-        URISupport.CompositeData compositeData = URISupport.parseComposite(new 
URI(brokerUri));
+        final URISupport.CompositeData compositeData = 
URISupport.parseComposite(new URI(brokerUri));
         compositeData.getParameters().put("persistent", "false");
         return ActiveMQFactory.getBrokerMetaFile() + compositeData.toURI();
     }
 
     public void testBrokerDoubleCreate() throws Exception {
-        BrokerService broker = BrokerFactory.createBroker(new 
URI(getBrokerUri( "broker:(tcp://localhost:61616)?useJmx=false")));
+        BrokerService broker = BrokerFactory.createBroker(new 
URI(getBrokerUri("broker:(tcp://localhost:61616)?useJmx=false")));
         stopBroker(broker);
 
         broker = BrokerFactory.createBroker(new 
URI(getBrokerUri("broker:(tcp://localhost:61616)?useJmx=false")));
@@ -74,7 +74,7 @@ public class OpenEjbBrokerFactoryTest ex
     }
 
     public void testNoDataSource() throws Exception {
-        BrokerService broker = BrokerFactory.createBroker(new URI(getBrokerUri(
+        final BrokerService broker = BrokerFactory.createBroker(new 
URI(getBrokerUri(
                 "broker:(tcp://localhost:61616)?useJmx=false")));
         assertNotNull("broker is null", broker);
 
@@ -88,10 +88,17 @@ public class OpenEjbBrokerFactoryTest ex
     }
 
     public void testDirectDataSource() throws Exception {
-        Properties properties = new Properties();
 
-        DataSource dataSource = new jdbcDataSource();
+        final Properties properties = new Properties();
+
+        final jdbcDataSource dataSource = new jdbcDataSource();
+        dataSource.setDatabase("jdbc:hsqldb:mem:testdb" + 
System.currentTimeMillis());
+        dataSource.setUser("sa");
+        dataSource.setPassword("");
+        dataSource.getConnection().close();
+
         properties.put("DataSource", dataSource);
+        properties.put("UseDatabaseLock", "false");
 
         ActiveMQFactory.setThreadProperties(properties);
         BrokerService broker = null;
@@ -105,7 +112,7 @@ public class OpenEjbBrokerFactoryTest ex
 
             assertTrue("persistenceAdapter should be an instance of 
JDBCPersistenceAdapter",
                     persistenceAdapter instanceof JDBCPersistenceAdapter);
-            JDBCPersistenceAdapter jdbcPersistenceAdapter = 
(JDBCPersistenceAdapter)persistenceAdapter;
+            JDBCPersistenceAdapter jdbcPersistenceAdapter = 
(JDBCPersistenceAdapter) persistenceAdapter;
 
             assertSame(dataSource, jdbcPersistenceAdapter.getDataSource());
         } finally {
@@ -115,17 +122,24 @@ public class OpenEjbBrokerFactoryTest ex
     }
 
     public void testLookupDataSource() throws Exception {
-        Properties properties = new Properties();
 
-        DataSource dataSource = new jdbcDataSource();
+        final Properties properties = new Properties();
+
+        final jdbcDataSource dataSource = new jdbcDataSource();
+        dataSource.setDatabase("jdbc:hsqldb:mem:testdb" + 
System.currentTimeMillis());
+        dataSource.setUser("sa");
+        dataSource.setPassword("");
+        dataSource.getConnection().close();
+
         
MockInitialContextFactory.install(Collections.singletonMap("openejb/Resource/TestDs",
 dataSource));
         assertSame(dataSource, new 
InitialContext().lookup("openejb/Resource/TestDs"));
 
-        CoreContainerSystem containerSystem = new CoreContainerSystem(new 
IvmJndiFactory());
+        final CoreContainerSystem containerSystem = new 
CoreContainerSystem(new IvmJndiFactory());
         containerSystem.getJNDIContext().bind("openejb/Resource/TestDs", 
dataSource);
         SystemInstance.get().setComponent(ContainerSystem.class, 
containerSystem);
 
         properties.put("DataSource", "TestDs");
+        properties.put("UseDatabaseLock", "false");
 
         ActiveMQFactory.setThreadProperties(properties);
         BrokerService broker = null;
@@ -139,7 +153,7 @@ public class OpenEjbBrokerFactoryTest ex
 
             assertTrue("persistenceAdapter should be an instance of 
JDBCPersistenceAdapter",
                     persistenceAdapter instanceof JDBCPersistenceAdapter);
-            JDBCPersistenceAdapter jdbcPersistenceAdapter = 
(JDBCPersistenceAdapter)persistenceAdapter;
+            JDBCPersistenceAdapter jdbcPersistenceAdapter = 
(JDBCPersistenceAdapter) persistenceAdapter;
 
             assertSame(dataSource, jdbcPersistenceAdapter.getDataSource());
         } finally {
@@ -149,6 +163,7 @@ public class OpenEjbBrokerFactoryTest ex
     }
 
     public static class MockInitialContextFactory implements 
InitialContextFactory {
+
         private static ImmutableContext immutableContext;
 
         public static void install(Map bindings) throws NamingException {
@@ -157,14 +172,15 @@ public class OpenEjbBrokerFactoryTest ex
             new InitialContext();
         }
 
-        public Context getInitialContext(Hashtable<?, ?> environment) throws 
NamingException {
+        public Context getInitialContext(final Hashtable<?, ?> environment) 
throws NamingException {
             return immutableContext;
         }
     }
 
-
-    private void stopBroker(BrokerService broker) throws Exception {
-        if (broker == null) return;
+    private void stopBroker(final BrokerService broker) throws Exception {
+        if (broker == null) {
+            return;
+        }
 
         if (broker.getJmsBridgeConnectors() != null) {
             for (JmsConnector connector : broker.getJmsBridgeConnectors()) {

Modified: openejb/trunk/openejb3/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/pom.xml?rev=957462&r1=957461&r2=957462&view=diff
==============================================================================
--- openejb/trunk/openejb3/pom.xml (original)
+++ openejb/trunk/openejb3/pom.xml Thu Jun 24 09:04:47 2010
@@ -562,7 +562,7 @@
       <dependency>
         <groupId>hsqldb</groupId>
         <artifactId>hsqldb</artifactId>
-        <version>1.8.0.7</version>
+        <version>1.8.0.10</version>
       </dependency>
       <dependency>
         <groupId>idb</groupId>


Reply via email to