I changed ActiveMQ configuration and used ActiveMQ feature: 'Mirrored Queues' to forward all messages to mirrored queues prefixed with qmirror. Here is ActiceMQ configuration:
<destinationInterceptors>
<mirroredQueue copyMessage = "true" postfix="" prefix="qmirror."/>
</destinationInterceptors>
So now when we have copied messages in queues with names: 'qmirror.*' and it is time to log them with Apache Camel. Thus I changed '$ACTIVEMQ_HOME/conf/camel.xml' config file in the following way:
<beans...>
<context:component-scan base-package="info.sargis.dbloggger"/>
<context:annotation-config/>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<package>info.sargis.dbloggger</package>
</camelContext>
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:TWMDB"/>
<property name="username" value="activemq"/>
<property name="password" value="ee0thaXu"/>
<property name="maxActive" value="5"/>
<property name="maxIdle" value="2"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="vm://localhost?create=false&waitForStart=10000&broker.populateJMSXUserID=true"/>
<property name="userName" value="${activemq.username}"/>
<property name="password" value="${activemq.password}"/>
</bean>
</property>
</bean>
</beans>
and created project with structure:
| `-- create_db.sql
|-- payment-dblogger.iml
|-- pom.xml
|-- README.txt
`-- src
|-- data
`-- main
|-- java
| `-- info
| `-- sargis
| `-- dbloggger
| |-- DBLoggerRouteBuilder.java
| `-- logger
| |-- DBLogger.java
| |-- DBLoggerProcessor.java
| `-- Logger.java
`-- resources
|-- log4j.properties
`-- META-INF
`-- spring
`-- camel-context.xml
note that project artifact payment-dblogger-*.jar should be deployed to '$ACTIVEMQ_HOME/webapps/camel/WEB-INF/lib'
Now its time for router :) here everything is simple as well:
package info.sargis.dbloggger;
import org.apache.camel.builder.RouteBuilder;
public class DBLoggerRouteBuilder extends RouteBuilder {
@Override
public void configure() {
from("activemq:topic:qmirror.>").threads().processRef("dbLoggerProcessor");
}
}