1. You kinda answered your first question - failover: is only used on the client side - you don't need it on a networkConnector.
2. I don't quite follow this question - when you shut down tomcat and the JVM your consumer still gets messages? But how when its in the same JVM? Maybe its just the prefetch buffer you're seeing which is confusing you? http://incubator.apache.org/activemq/what-is-the-prefetch-limit-for.html On 9/26/06, nusa <[EMAIL PROTECTED]> wrote:
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.
-- James ------- http://radio.weblogs.com/0112098/
