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>