I am embedding an ActiveMQ broker directly inside an app (long
story). I
am doing so explicitly with Java code (i.e., "broker = new
BrokerService();", etc.). I would like to completely avoid any
writing of
files when performing normal JMS tasks, such as sending and receiving
messages (again, long story... access control issues). [This may
change
later, but for now, I am trying to avoid disk use. Persistence is
not a
concern.] I do this to create/start the broker:
m_broker = new BrokerService();
m_broker.setBrokerName(S_STR_BROKER_NAME);
m_broker.addConnector("vm://" + S_STR_BROKER_NAME);
m_broker.setUseJmx(false);
m_broker.setPersistent(false);
m_broker.setPersistenceAdapter(null);
m_broker.start();
However, when I start the broker, I see the following log output:
INFO [main]: ActiveMQ 5.0.0 JMS Message Broker (mainbroker) is
starting
INFO [main]: For help or more information please see:
http://activemq.apache.org/
INFO [main]: AMQStore starting using directory: activemq-data/
mainbroker
INFO [main]: Kaha Store using data directory
activemq-data/mainbroker/kr-store/state
INFO [main]: Active data files: []
WARN [main]: The ReferenceStore is not valid - recovering ...
INFO [main]: Kaha Store successfully deleted data directory
activemq-data/mainbroker/kr-store/data
INFO [main]: Journal Recovery Started from: DataManager:(data-)
INFO [main]: Recovered 0 operations from redo log in 0.015 seconds.
INFO [main]: Finished recovering the ReferenceStore
INFO [main]: Using Persistence Adapter: MemoryPersistenceAdapter
INFO [main]: Kaha Store using data directory
activemq-data/mainbroker/kr-store/data
INFO [main]: Connector vm://mainbroker Started
INFO [main]: ActiveMQ JMS Message Broker (mainbroker,
ID:yurik2.engr.akamai.com-54085-1207691353487-0:0) started
So, on the one hand, it is using MemoryPersistenceAdapter (as I
want, I
think), but also it's initializing some Kaha stuff (and also Journal
stuff... not sure if that's separate or the same thing) -- which I'd
rather it not do, if possible.
Later, when the in-VM client (which, unlike the above broker
initialization code, is constrained by rather strict security rules
about
file writing) does a JMS send(), I get a security exception:
javax.jms.JMSException: access denied (java.io.FilePermission
activemq-data/mainbroker/kr-store/data read)
at
org
.apache
.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:
49)
at
org
.apache
.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:
1178)
at
org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1640)
at
org
.apache
.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:
226)
at
org
.apache
.activemq
.ActiveMQMessageProducerSupport
.send(ActiveMQMessageProducerSupport.java:240)
at com.akamai.edgejava.tests.JmsTest.doGet(JmsTest.java:142)
__NOTE__ This is where I do send().
...etc...
Caused by: java.security.AccessControlException: access denied
(java.io.FilePermission activemq-data/mainbroker/kr-store/data read)
at
java
.security
.AccessControlContext.checkPermission(AccessControlContext.java:323)
at
java
.security.AccessController.checkPermission(AccessController.java:546)
at
java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkRead(SecurityManager.java:
871)
at java.io.File.list(File.java:971)
at java.io.File.listFiles(File.java:1090)
at
org
.apache
.activemq
.kaha.impl.data.DataManagerImpl.<init>(DataManagerImpl.java:70)
at
org
.apache.activemq.kaha.impl.KahaStore.getDataManager(KahaStore.java:
358)
at
org
.apache.activemq.kaha.impl.KahaStore.getMapContainer(KahaStore.java:
221)
at
org
.apache
.activemq
.store
.kahadaptor
.KahaReferenceStoreAdapter
.getMapReferenceContainer(KahaReferenceStoreAdapter.java:198)
at
org
.apache
.activemq
.store
.kahadaptor
.KahaReferenceStoreAdapter
.createTopicReferenceStore(KahaReferenceStoreAdapter.java:165)
at
org
.apache
.activemq
.store
.amq
.AMQPersistenceAdapter
.createTopicMessageStore(AMQPersistenceAdapter.java:414)
at
org
.apache
.activemq
.broker
.region
.DestinationFactoryImpl
.createDestination(DestinationFactoryImpl.java:114)
at
org
.apache
.activemq
.broker.region.AbstractRegion.createDestination(AbstractRegion.java:
399)
at
org
.apache
.activemq
.broker
.jmx.ManagedTopicRegion.createDestination(ManagedTopicRegion.java:56)
at
org
.apache
.activemq
.broker.region.AbstractRegion.addDestination(AbstractRegion.java:116)
at
org
.apache
.activemq
.broker.region.RegionBroker.addDestination(RegionBroker.java:259)
at
org
.apache.activemq.broker.region.RegionBroker.send(RegionBroker.java:
382)
at
org
.apache
.activemq.broker.TransactionBroker.send(TransactionBroker.java:224)
at
org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:125)
at
org
.apache
.activemq
.broker
.CompositeDestinationBroker.send(CompositeDestinationBroker.java:95)
at
org
.apache
.activemq.broker.MutableBrokerFilter.send(MutableBrokerFilter.java:
135)
at
org
.apache
.activemq
.broker.TransportConnection.processMessage(TransportConnection.java:
434)
...etc...
It's trying to read "activemq-data/mainbroker/kr-store/data", which
is not
allowed for reasons I won't go into here. Why is it trying to do
this
Kaha stuff, if I want memory persistence only? Is there a way to
disable
this?
Thank you so much.