Skip to content

tikalk/fuse.dbsynch.sample

Repository files navigation

dbsynch sample app


this sample demonstrates a spring , activemq and MySql application using XA(JTA) transactions.

the application is meant to copy a database table from one database to another using JMS as the transport.

there are three components:

    * server - this is the activemq broker, activemq is embedded in a spring context.

    * producer - this is a client to the broker, it reads rows from a database table,source_table, and for every row sends 	a JMS message to a queue called source-queue.

    * collector - this is a client that reads messages from source-queue and for every message creates a database row in a 	table called dest_table.


The stack used in the sample:

Spring as a container.
Activemq
MySql
Atomikos 





XA tansactions:
this sample shows two implementations to manage jms and jdbc resources in one transaction.

    * A non xa transaction where both resources are just committed one after the other in a way that if one of them fails 	it will not create a lot of damage, maybe a message will be processed twice.

    * JTA XA transactions using Atomikos, http://www.atomikos.com/Main/WebHome


see the spring files in producer and collector projects , nonxa-XX and atomikos-xa-XX.


things to remember with JTA:
the data base ,driver and data source must be XA enabled.
Performance is poor with XA.
Many data bases do not fully implement JTA.


build:
this is a maven project.
to build the project, from the top most directory,where the parent pom is, execute 'mvn clean install'


the projects are:

    * server - this is the server project mainly used to embed activemq in a spring context.activemq can also be run out of 		the box, but embedding it in a spring application will make it easier to add functionality, for example we can add 	  	beans that connect to the broker with VM transport ,more control on activemq properties.

    * server-runtime - creates a runtime directory for the server.

    * common - a project with common classes for the three components.

    * producer - this is the client that reads the source table and sends a JMS message for every row.

    * producer-runtime - creates a runtime directory for the producer.collector - this is the client that reads the 		messages with the source rows and inserts rows to the dest_table.

    * collector – the client that reads the jms queue and inserts rows to the DB

    * collector-runtime - creates the runtime directory for the collector.



IDE:

to load to intelij IDEA just do: file -> open project , and select the parent pom, idea will do the rest.

to load to eclipse execute 'mvn eclipse:eclipse' from the top directory and load the projects to eclipse.
or use m2eclipse plugin.




Unit tests:

Unit tests with xa will work only with a data base that supports xa, also, an activemq broker must run in order for the unit tests to run. To build without unit tests run maven with

-Dmaven.test.skip=true



PubSub
to demonstrait pubsub domain:

the server publishes a notification to notification.topic every some interval.
see:
/server/src/main/resources/spring/spring-config-notifier.xml

both the producer and collector subscribe to this topic and receive notifications.
see:
/collector/src/main/resources/spring/spring-config-notification.xml
/producer/src/main/resources/spring/spring-config-notification.xml

 the collector can also be a durable subscriber,set the property durable=true in
  collector.properties
  the client id for the collector durable subscription is passed in the
  collector.properties file. to run two instances change the client id for each execution.

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •