Ok
Thanks, I think I've got it.
I used a bean definition like this
<bean id="myPersistenceAdapter"
class="org.apache.activemq.store.chris.ChrisPersistenceAdapter"/>
and passed it to the broker
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="localhost" dataDirectory="${activemq.base}/data"
persistenceAdapter="#myPersistenceAdapter">
...
</broker>
I can see that this is working as I can set breakpoints in my code and
see that they are being hit via eclipse. This will work fine for now, I
still have a couple of questions tho ...
1) I take it that if I wanted to use a syntax such as the other
persistenceAdapters use like this
<broker ...>
<persistenceAdapter>
<chrisPersistenceAdapter />
</persistenceAdapter>
</broker>
I will need to use an Xbean rather than a regular spring bean. Are there
any docs about how to do this ?
2) Presumably I can pass parameters into my module using the syntax
<bean id="myPersistenceAdapter"
class="org.apache.activemq.store.chris.ChrisPersistenceAdapter">
<property name="somePropertyName" value="someUsefulData"/>
</bean>
Thanks again for your quick reply
-- Chris
Dejan Bosanac wrote:
Hi Chris,
if you don't need XBean, you can define your adapter outside of the <broker>
tag as a regular Spring bean and add it to the broker using the
persitanceAdapter attribute
<broker persistanceAdapter="#chris"> ... </broker>
Cheers
--
Dejan Bosanac
Open Source Integration - http://fusesource.com/
ActiveMQ in Action - http://www.manning.com/snyder/
Blog - http://www.nighttale.net
On Fri, Feb 13, 2009 at 4:25 PM, Chris Lidgate <[email protected]>wrote:
Hi
I'm playing around with ActiveMQ v5.2.0 and would like to investigate
different types of persistence adapter. To this end I've tried to create my
own, but I'm having problems.
1) I've taken the current 5.2.0 source and compiled it under maven. This
works OK.
2) I've added a new package to activemq-core - called
org/apache/activemq/store/chris . I copied all of the files from
org/apache/activemq/store/memory/* into my new package, then refactored them
with appropriate names. I can re-build this with maven and it works OK. I
can see my new classes in the jar file
jar tvf lib/activemq-core-5.2.0.jar | grep -i chris
0 Thu Feb 12 15:15:06 GMT 2009 org/apache/activemq/store/chris/
5645 Thu Feb 12 15:14:54 GMT 2009
org/apache/activemq/store/chris/ChrisMessageStore.class
6938 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisPersistenceAdapter.class
6920 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTopicMessageStore.class
3272 Thu Feb 12 15:14:54 GMT 2009
org/apache/activemq/store/chris/ChrisTopicSub.class
1759 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$1.class
1789 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$2.class
1579 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$3.class
1602 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$4.class
460 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$AddMessageCommand.class
472 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$RemoveMessageCommand.class
3793 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore$Tx.class
6520 Thu Feb 12 15:14:56 GMT 2009
org/apache/activemq/store/chris/ChrisTransactionStore.class
3) If I add the memory persistence adapter to the activemq.xml file and run
the server, the server runs fine. I can see that the memory model is being
run as the server runs ~ 10x faster than the stock server when handling
persistent messages.
4) However if I change the activemq.xml file to use my chris persistence
adapter the server will not run and throws the following exception
bin/activemq
Listening for transport dt_socket at address: 5005
ACTIVEMQ_HOME: /home/user/tmp/activemq-chris
ACTIVEMQ_BASE: /home/user/tmp/activemq-chris
Loading message broker from: xbean:activemq.xml
ERROR: java.lang.RuntimeException: Failed to execute start task. Reason:
org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized
xbean element mapping: chrisPersistenceAdapter in namespace
http://activemq.apache.org/schema/core
java.lang.RuntimeException: Failed to execute start task. Reason:
org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized
xbean element mapping: chrisPersistenceAdapter in namespace
http://activemq.apache.org/schema/core
at
org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:98)
at
org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at
org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:129)
at
org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at
org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.activemq.console.Main.runTaskClass(Main.java:225)
at org.apache.activemq.console.Main.main(Main.java:106)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException:
Unrecognized xbean element mapping: chrisPersistenceAdapter in namespace
http://activemq.apache.org/schema/core
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:273)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:155)
at
org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49)
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1255)
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1245)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseChildExtensionBean(XBeanNamespaceHandler.java:763)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseNestedPropertyViaIntrospection(XBeanNamespaceHandler.java:599)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.tryParseNestedPropertyViaIntrospection(XBeanNamespaceHandler.java:566)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addNestedPropertyElements(XBeanNamespaceHandler.java:535)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:226)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:271)
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:155)
[ ... snip ... ]
5) From some digging on the web I've seen the following thread which seems
to describe a similar problem
http://www.mail-archive.com/[email protected]/msg01191.html
However I don't understand what the response is saying (I don't grok xbean
at all :-(. I tried to put in this xml
<build>
<plugins>
<plugin>
<groupId>org.apache.xbean</groupId>
<artifactId>maven-xbean-plugin</artifactId>
<executions>
<execution>
<configuration>
<namespace>http://activemq.org/chris/1.0</namespace>
</configuration>
<goals>
<goal>mapping</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
into the pom.xml file (at the top of the activemq source tree), but then
the maven build failed. I also failed to understand how the namespace
declared above had any linkage to my package (which was
org.apache.acticemq.store.chris).
Yours, very confused.
-- Chris