Hi I need a simple queue.
This queue will be persistent and it will use a database in the backend to store the messages. It will receive produced messages small in size (just one or two string attributes) in bursts of 10~100. It will consume messages by a pool of 100~300 message driven beans (tomee). Each message will be consumed and will trigger a long-running job that may take from 1 minute to 1 hour to complete. If the job fails, I want the message to return to the queue so it can be consumed again, no matter how many retries. I don't want to send invalid messages to a "poisoned messages queue". Architecture is simple. The queue will run in a single activeMQ instance and consumers are MDBs from a single TomEE+ web application. So, here's what I have so far activemq.xml========================================= <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}"> <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" producerFlowControl="true"> <pendingMessageLimitStrategy> <constantPendingMessageLimitStrategy limit="1000" /> </pendingMessageLimitStrategy> </policyEntry> <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb"> </policyEntry> </policyEntries> </policyMap> </destinationPolicy> <persistenceAdapter> <jdbcPersistenceAdapter dataSource="#oracle-ds" /> </persistenceAdapter> <systemUsage> <systemUsage> <memoryUsage> <memoryUsage limit="1 gb" /> </memoryUsage> <storeUsage> <storeUsage limit="100 gb" /> </storeUsage> <tempUsage> <tempUsage limit="50 gb" /> </tempUsage> </systemUsage> </systemUsage> <transportConnectors> <transportConnector name="tcp" uri="tcp://0.0.0.0:61616" /> </transportConnectors> </broker> <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" /> <property name="username" value="*****" /> <property name="password" value="******" /> <property name="poolPreparedStatements" value="true" /> <property name="maxActive" value="100" /> </bean> tomee.xml========================================= <Resource id="Default JMS Resource Adapter" type="ActiveMQResourceAdapter"> BrokerXmlConfig = broker:(tcp://localhost:61616) ServerUrl = tcp://localhost:61616 ThreadPoolSize = 200 </Resource> <Resource id="MyJmsConnectionFactory" type="javax.jms.ConnectionFactory"> ResourceAdapter = Default\ JMS\ Resource\ Adapter PoolMaxSize = 200 </Resource> <Resource id="JobQueue" type="javax.jms.Queue" /> MDB========================================= @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "JobQueue"), @ActivationConfigProperty(propertyName = "maxMessagesPerSessions", propertyValue = "1"), @ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "200"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }) ========================================= With this configuration, I am still facing some interruptions. Sometimes, TomEE simply stops consuming the queue (once or twice per week), so I have to restart it. I am still checking the logs for anything suspicious. I am using TomEE+ 1.6.0 stable (quite old, I know) and a standalone AMQ 5.10 stable in a linux environment and oracle JDK 7. But I'd like some advice on how to properly set up activemq / tomee in this scenario (that's why I am sending this email to both activemq and tomee lists) Thank you very much, any help is welcome. [] Leo