Hi, I manage to integrate Tomcat_5.5.17, ActiveMQ_4.0.1 ( embeded broker ), and Spring_1.2.8 using the following config :
1. activemq.xml <?xml version="1.0" encoding="UTF-8"?> <beans> <!--beans xmlns="http://activemq.org/config/1.0"--> <!-- Allows us to use system properties as variables in this configuration file --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:ScanningServer.properties</value> </property> </bean> <broker xmlns="http://activemq.org/config/1.0" useJmx="true" brokerName="brokerDA" useShutdownHook="true" > <!-- Use the following to configure how ActiveMQ is exposed in JMX --> <managementContext> <managementContext connectorPort="1099" jmxDomainName="org.apache.activemq"/> </managementContext> <!-- In ActiveMQ 4, you can setup destination policies --> <destinationPolicy> <policyMap> <policyEntries> <policyEntry queue="MYQUEUE.QUEUE>"> <dispatchPolicy> <strictOrderDispatchPolicy /> </dispatchPolicy> <subscriptionRecoveryPolicy> <lastImageSubscriptionRecoveryPolicy /> </subscriptionRecoveryPolicy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy> <persistenceAdapter> <journaledJDBC journalLogFiles="5" dataDirectory="../activemq-data" dataSource="#oracle-ds"/> </persistenceAdapter> <transportConnectors> <transportConnector name="default" uri="tcp://localhost:61616" /> <transportConnector name="stomp" uri="stomp://localhost:61613"/> </transportConnectors> <networkConnectors> <networkConnector name="default" uri="failover:tcp//localhost" failover="true"/> </networkConnectors> </broker> <!-- Oracle DataSource Sample Setup --> <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ... </bean> </beans> 2. applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- This will start the broker from inside Spring. --> <bean id="brokerDA" class="org.apache.activemq.xbean.BrokerFactoryBean"> <property name="config" value="/WEB-INF/activemq.xml"/> <property name="start" value="true"/> </bean> <!-- JMS ConnectionFactory to use. It depends on the broker to make sure that the JMS connection created AFTER the the broker starts. --> <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory" depends-on="brokerDA"> <property name="brokerURL"> <value>${brokerURL}</value> </property> </bean> <!-- Spring JMS Template --> <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <!-- Lets wrap in a pool to avoid creating a connection per send --> <bean class="org.springframework.jms.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="jmsFactory" /> </bean> </property> </bean> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue" autowire="constructor"> <constructor-arg> <value>org.apache.activemq.spring.Test.spring.queue</value> </constructor-arg> </bean> <!-- a sample POJO which uses a Spring JmsTemplate --> <bean id="producer" class="com.ProducerBean"> <property name="template"> <ref local="myJmsTemplate"/> </property> <property name="destination"> <ref local="destination"/> </property> </bean> <!-- a sample POJO consumer --> <bean id="consumer" class="com.ConsumerBean" init-method="start"> <property name="template"> <ref local="myJmsTemplate"/> </property> <property name="destination"> <ref local="destination"/> </property> </bean> <!-- End ActiveMQ. --> </beans> First problem, the failover did not work. I got the following error log : 13:30:32,751 ERROR [web.context.ContextLoader] Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService' defined in ServletContext resource [/WEB-INF/activemq.xml]: Cannot create inner bean 'default' while setting bean property 'networkConnectors' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'default' defined in ServletContext resource [/WEB-INF/activemq.xml]: Error setting property values; nested exception is PropertyAccessExceptionsException (1 errors) org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'default' defined in ServletContext resource [/WEB-INF/activemq.xml]: Error setting property values; nested exception is PropertyAccessExceptionsException (1 errors) PropertyAccessExceptionsException (1 errors) org.springframework.beans.MethodInvocationException: Property 'uri' threw exception; nested exception is java.io.IOException: DiscoveryAgent scheme NOT recognized: [failover] java.io.IOException: DiscoveryAgent scheme NOT recognized: [failover] at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:24) at org.apache.activemq.transport.discovery.DiscoveryAgentFactory.findDiscoveryAgentFactory(DiscoveryAgentFactory.java:49) at org.apache.activemq.transport.discovery.DiscoveryAgentFactory.createDiscoveryAgent(DiscoveryAgentFactory.java:56) at org.apache.activemq.network.DiscoveryNetworkConnector.setUri(DiscoveryNetworkConnector.java:57) ... Caused by: java.io.IOException: Could not find factory class for resource: META-INF/services/org/apache/activemq/transport/discoveryagent/failover at org.apache.activeio.util.FactoryFinder.doFindFactoryProperies(FactoryFinder.java:87) at org.apache.activeio.util.FactoryFinder.newInstance(FactoryFinder.java:57) at org.apache.activeio.util.FactoryFinder.newInstance(FactoryFinder.java:46) at org.apache.activemq.transport.discovery.DiscoveryAgentFactory.findDiscoveryAgentFactory(DiscoveryAgentFactory.java:45) If I use the following network configuration : <transportConnector name="default" uri="tcp://localhost:61616" discoveryUri="multicast://default"/> and <networkConnector name="default" uri="multicast://default"/> it works well. My second problem is that the consumer keeps receiving the messages even after I shutdown/startup the Tomcat, even I already specified AUTO_ACKNOWLEDGE : ... public void start() throws JMSException { try { ConnectionFactory factory = template.getConnectionFactory(); connection = factory.createConnection(); // we might be a reusable connection in spring // so lets only set the client ID once if its not set synchronized (connection) { if (connection.getClientID() == null) { connection.setClientID(myId); } } connection.start(); session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); consumer = session.createConsumer(destination, selector, false); consumer.setMessageListener(this); } catch (JMSException ex) { log.error("*** Error Starting Consumer !!!", ex); throw ex; } } ... So, here are my questions : 1. What is the correct syntax for failover ? And where to define it ? 2. what's wrong with my consumer ? Thanks for any help/suggestion. -- View this message in context: http://www.nabble.com/Problem-with-failover-and-consumer-tf2337476.html#a6504024 Sent from the ActiveMQ - User mailing list archive at Nabble.com.
