You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by patzerbud <pa...@hotmail.com> on 2010/04/15 22:25:10 UTC

virtual topics plus failover

All:

I think I have a relatively simple - and typical - environment but am having
trouble getting failover to work the way I expect it to. Here is my
environment:

ActiveMQ 5.3.1 running on linux (CentOS 5.2) - two nodes; primary & failover
Shared Database (jdbcPersistenceAdapter) 
Multiple JBoss app servers (>2) - these are clustered - for each of three
separate applications
Oracle RAC 10g

I have a virtual topic, let's call it:

VirtualTopic.Orders

and three corresponding consumer queues:

Consumer.App1.VirtualTopic.Orders
Consumer.App2.VirtualTopic.Orders
Consumer.App3.VirtualTopic.Orders

So, JBoss cluster 1 (running app 1) consumes from the first queue,
JBoss cluster 2 (running app 2) consumes from the second, etc.

All three apps publish to the virtual topic and all three apps are expected
to consume all messages - reliably.

All works well when all app servers are running (i.e. consuming msgs). I can
shutdown the primary ActiveMQ instance and everything fails over to the
second. I restart the primary and shutdown the secondary and, again,
everything works as billed with no lost messages. So far, so good.

However, if I shutdown all app servers for one of the applications (let's
say App3) and run the same test as above; as soon as ActiveMQ fails over,
then all messages held for App3 are lost. They now build up from 0 and when
I shutdown the failover MQ node, everything goes back to the primary but,
again, it starts over from 0 for the "missing" application.

What I expect to happen is that when the failover (secondary) MQ node takes
over it recognizes there are already n msgs queued up for the "missing"
application and to just keep adding to those.

It's like I want a durable queue subscriber - so I can take advantage of
Virtual Topics (multiple consumers but only 1 msg) but also with durability.

Here is the activemq.xml file on both nodes:

<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd">

    <!-- Allows us to use system properties as variables in this
configuration file -->
    <bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>file:${activemq.base}/conf/credentials.properties</value>
        </property>
    </bean>

    <!--
        The <broker> element is used to configure the ActiveMQ broker.
    -->
    <broker xmlns="http://activemq.apache.org/schema/core"
			brokerName="myBroker"
			persistent="true"
			dataDirectory="${activemq.base}/data"
			destroyApplicationContextOnShutdown="true"
			destroyApplicationContextOnStop="true"
			supportFailOver="true"
			systemExitOnShutdown="true"
			useLocalHostBrokerName="false"
			useShutdownHook="false">

        <!--
			For better performances use VM cursor and small memory limit.
			For more information, see:

            http://activemq.apache.org/message-cursors.html

            Also, if your producer is "hanging", it's probably due to
producer flow control.
            For more information, see:
            http://activemq.apache.org/producer-flow-control.html
        -->

        <destinationPolicy>
            <policyMap>
              <policyEntries>
                <policyEntry topic=">" producerFlowControl="true"
memoryLimit="5mb" useCache="false">
                  <pendingSubscriberPolicy>
                    <vmCursor />
                  </pendingSubscriberPolicy>
                </policyEntry>
                <policyEntry queue=">" producerFlowControl="true"
memoryLimit="5mb" useCache="false">
                  <!-- Use VM cursor for better latency
                       For more information, see:

                       http://activemq.apache.org/message-cursors.html

                  <pendingQueuePolicy>
                    <vmQueueCursor/>
                  </pendingQueuePolicy>
                  -->
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>

		<destinations>
			<topic name="activemq/topic/orders"     
physicalName="VirtualTopic.Orders" />
			<queue name="activemq/queue/app1/orders"
physicalName="Consumer.App1.VirtualTopic.Orders" />
			<queue name="activemq/queue/app2/orders"
physicalName="Consumer.App2.VirtualTopic.Orders" />
			<queue name="activemq/queue/app3/orders"
physicalName="Consumer.App3.VirtualTopic.Orders" />
		</destinations>

        <!--
            The managementContext is used to configure how ActiveMQ is
exposed in
            JMX. By default, ActiveMQ uses the MBean server that is started
by
            the JVM. For more information, see:

            http://activemq.apache.org/jmx.html
        -->
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>

        <persistenceAdapter>
			<jdbcPersistenceAdapter dataSource="#oracle-ds"/>
        </persistenceAdapter>

        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
        </transportConnectors>

    </broker>

    <!--
        Enable web consoles, REST and Ajax APIs and demos
        Take a look at activemq-jetty.xml for more details
    -->
    <import resource="jetty.xml"/>

	<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
	  <property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"/>
	  <property name="url" value="jdbc:oracle:thin:@oradb01:1521:ords1"/>
	  <property name="username" value="username"/>
	  <property name="password" value="password"/>
	  <property name="maxActive" value="200"/>
	  <property name="poolPreparedStatements" value="true"/>
	</bean>

</beans>

Any help would be greatly appreciated!

TIA,

Mike L. (aka patzerbud)

-- 
View this message in context: http://old.nabble.com/virtual-topics-plus-failover-tp28260238p28260238.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.