RabbitMQ and Camel with Multiple connection factories - spring

I am trying to implement routing solution in which i need to read messages from one queue of rabbit mq and put message on different rabbit mq/different queue.
I was able to make read and write separately from queues but it is not working together.
Here is camel configuration file :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="amqp.spring.camel.component"/>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" createConnector="false" disabled="true" />
<template id="wfcTemplate" />
<template id="routerTemplate" />
<route>
<from uri="spring-amqp:exchange1:queue1:ABCD?type=topic&autodelete=false&durable=true" />
<log message="Message available on a RabbitMQ Queue : ${body}" />
<to uri="spring-amqp:exchange2:queue2:EFGH?type=topic&autodelete=false&durable=true" />
</route>
</camelContext>
<rabbit:connection-factory id="producerConnectionFactory" connection-factory="producerConnectionFactory" />
<rabbit:template id="routerTemplate" connection-factory="producerConnectionFactory" message-converter="messageConverter" exchange="exchange2" />
<rabbit:admin connection-factory="producerConnectionFactory" />
<bean id="producerConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="host" value="10.0.10.100"/>
<property name="port" value="5672"/>
<property name="username" value="shailesh"/>
<property name="password" value="shailesh"/>
<property name="virtualHost" value="vh1"/>
</bean>
<rabbit:connection-factory id="consumerConnectionFactory" connection-factory="consumerConnectionFactory"/>
<rabbit:template id="wfcTemplate" connection-factory="consumerConnectionFactory" message-converter="messageConverter" exchange="exchange1" />
<rabbit:admin connection-factory="consumerConnectionFactory"/>
<bean id="consumerConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="host" value="10.0.10.101"/>
<property name="port" value="5672"/>
<property name="username" value="shailesh"/>
<property name="password" value="shailesh"/>
<property name="virtualHost" value="vh2"/>
</bean>
<!-- converters -->
<bean id="jsonMessageConverter" class="amqp.spring.converter.XStreamConverter"/>
<bean id="textMessageConverter" class="amqp.spring.converter.StringConverter"/>
<bean id="messageConverter" class="amqp.spring.converter.ContentTypeConverterFactory">
<property name="converters">
<map>
<entry key="application/json" value-ref="jsonMessageConverter"/>
<entry key="application/xml" value-ref="textMessageConverter"/>
</map>
</property>
<property name="fallbackConverter" ref="textMessageConverter"/>
</bean>
</beans>
There error I am getting is as follows :
[pache.camel.spring.Main.main()] SpringCamelContext INFO Total 1 routes, of which 1 is started.
[pache.camel.spring.Main.main()] SpringCamelContext INFO Apache Camel 2.10.3 (CamelContext: camel-1) started in 0.589 seconds
[PConsumer.SpringAMQPExecutor-1] route1 INFO Message available on a RabbitMQ Queue : Hello, world! Fri Feb 08 14:14:33 CST 2013
[l-1) thread #0 - amqp-producer] SpringAMQPProducer ERROR Could not deliver message via AMQP
java.lang.NullPointerException
at amqp.spring.camel.component.SpringAMQPProducer$AMQPProducerTask.run(SpringAMQPProducer.java:150)[camel-spring-amqp-1.4.jar:]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.7.0_11]
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_11]
at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_11]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)[:1.7.0_11]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)[:1.7.0_11]
at java.lang.Thread.run(Thread.java:722)[:1.7.0_11]

Related

Spring JMS 4.1 + ActiveMQ handle stress request

Currently, My system is using Spring-jms 4.1.6 and ActiveMQ 5.2.0
We facing the issue is that when we have stress requests (50000 continuity requests like DDOS), the server is dying.
I think there are some problems with my config on the consumer side;
The config below is the original config
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd
">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
<!-- Administrated objects -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory" destroy-method="destroy">
<property name="targetConnectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://localhost:${JMS_PORT})"/>
</bean>
</property>
<property name="reconnectOnException" value="false"/>
</bean>
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="test.service" />
</bean>
<!-- Message listener container for services -->
<bean id="errorHandler" class="com.myconsumer.test.LogErrorHandler"/>
<bean
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queue" />
<property name="concurrentConsumers" value="10" />
<property name="maxConcurrentConsumers" value="20" />
<property name="messageListener" ref="serviceExporterDispatcher" />
<property name="errorHandler" ref="errorHandler" />
</bean>
<bean id="securityTokenVerificator" class="com.myconsumer.test.SecurityTokenVerificator">
<property name="authenticationService" ref="authenticationService" />
</bean>
<bean id="businessServiceInterceptor" class="com.myconsumer.test.RemoteInvocationBusinessServiceInterceptor">
<property name="securityTokenVerificator" ref="securityTokenVerificator" />
</bean>
<bean id="requestContextHandler" class="com.myconsumer.test.RequestContextHandler"/>
<bean id="remoteInvocationErrorHandler" class="com.myconsumer.test.RemoteInvocationErrorHandler" />
<bean id="serviceExporterDispatcher" class="com.myconsumer.test.ServiceExporterDispatcher">
<property name="businessServiceInterceptor" ref="businessServiceInterceptor" />
<property name="requestContextHandler" ref="requestContextHandler" />
<property name="remoteInvocationErrorHandler" ref="remoteInvocationErrorHandler" />
</bean>
</beans>
I tried with pool connection but it did not improve anything
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd
">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
<!-- Administrated objects -->
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://localhost:${JMS_PORT})"/>
</bean>
</property>
<!-- <property name="reconnectOnException" value="false"/>
<property name="sessionCacheSize" value="3"/> -->
</bean>
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="test.service" />
</bean>
<!-- Message listener container for services -->
<bean id="errorHandler" class="com.myconsumer.test.LogErrorHandler"/>
<bean
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="pooledConnectionFactory" />
<property name="destination" ref="queue" />
<property name="concurrentConsumers" value="10" />
<property name="maxConcurrentConsumers" value="20" />
<property name="messageListener" ref="serviceExporterDispatcher" />
<property name="errorHandler" ref="errorHandler" />
</bean>
<bean
class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
<property name="concurrency" value="3-10"/>
</bean>
<bean id="securityTokenVerificator" class="com.myconsumer.test.SecurityTokenVerificator">
<property name="authenticationService" ref="authenticationService" />
</bean>
<bean id="businessServiceInterceptor" class="com.myconsumer.test.RemoteInvocationBusinessServiceInterceptor">
<property name="securityTokenVerificator" ref="securityTokenVerificator" />
</bean>
<bean id="requestContextHandler" class="com.myconsumer.test.RequestContextHandler"/>
<bean id="remoteInvocationErrorHandler" class="com.myconsumer.test.RemoteInvocationErrorHandler" />
<bean id="serviceExporterDispatcher" class="com.myconsumer.test.ServiceExporterDispatcher">
<property name="businessServiceInterceptor" ref="businessServiceInterceptor" />
<property name="requestContextHandler" ref="requestContextHandler" />
<property name="remoteInvocationErrorHandler" ref="remoteInvocationErrorHandler" />
</bean>
</beans>
Update config for Producer
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Initialize service invoker properties -->
<bean id="propertyPlaceHolder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties">
<bean factory-bean="resourceUtils" factory-method="getProperties">
<constructor-arg>
<bean factory-bean="resourceLoader"
factory-method="getResource">
<constructor-arg>
<value>service-invoker/service-invoker.properties</value>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</property>
</bean>
<!-- Administrated objects -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory" destroy-method="destroy">
<property name="targetConnectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${broker.url}"/>
</bean>
</property>
</bean>
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="${service.queue}" />
</bean>
<!-- Service Locator -->
<bean id="serviceLocator" class="com.myproducer.test.service.impl.ApplicationServiceLocatorImpl">
<property name="authenticationService" ref="authenticationService"/>
</bean>
<!-- Services -->
<bean id="authenticationService"
class="com.myproducer.test.service.impl.ClientJmsInvokerProxyFactoryBean">
<property name="serviceInterface" value="com.myservicer.test.authentication.v1.AuthenticationService" />
<property name="connectionFactory" ref="connectionFactory" />
<property name="queue" ref="queue" />
<property name="receiveTimeout" value="${receiveTimeout}" />
</bean>
</beans>
Important
My 50000 request is sent frequently, I'm using nodejs to send and send the requests without waiting for the response to test the server.

How can I connect to two different databases, one for reading and one for writing in the same application using Spring?

Use Case: I am running a spring application which has orders. I can create plans for these orders. My dev environment/db does not have any orders and they come from a different application (we share the same db). So, Is there a way I can read orders from production database but when I create a plan, it gets saved to dev database?
My persistence.xml is as below
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="Demo_PU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.entity.ErrorMessage</class>
<class>com.entity.ErrorMessageTxt</class>
<class>com.entity.ErrorMessageTxtId</class>
<class>com.entity.Language</class>
<class>com.entity.TextEntity</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.InformixDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.cache.region.factory_class"
value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.generate_statistics" value="false" />
<property name="hibernate.connection.useUnicode" value="true" />
<property name="hibernate.connection.characterEncoding"
value="UTF-8" />
<!-- Adding timeouts for Lock Mode and Query -->
<property name="javax.persistence.query.timeout" value="60000" />
<property name="javax.persistence.lock.timeout" value="60000" />
</properties>
</persistence-unit>
</persistence>
My spring-config.xml is as below
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<context:component-scan base-package="com.project"/>
<context:component-scan base-package="com.project2"/>
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor"/>
<task:scheduler id="myScheduler"/>
<bean id="qa-informix" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/dcSysCommon"/>
</bean>
<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:META-INF/persistence.xml</value>
</list>
</property>
<property name="dataSources">
<map>
<entry key="localDataSource" value-ref="qa-informix" />
</map>
</property>
<property name="defaultDataSource" ref="qa-informix"/>
</bean>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="pum" />
<property name="jpaDialect">
<bean class="com.project.utils.IsolationSupportHibernateJpaDialect"/>
</property>
<property name="persistenceUnitName" value="PYD_PU" />
</bean>
<!-- bean post-processor for JPA annotations -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<!-- this enables the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
<bean id="interpolator" class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="messageInterpolator" ref="interpolator" />
</bean>
<bean class="com.project3.common.core.bo.LanguageBusinessObject" primary="true" />
<bean name="restUtils" class="com.project1.utils.RestUtils" />
<bean id="srvPropertyFile" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="srvPropertyFile" />
</bean>
<bean id="beanConfig" class="io.swagger.jaxrs.config.BeanConfig">
<property name="title" value="Swagger UI for QAS"/>
<property name="version" value="1.0.0" />
<property name="schemes" value="http" />
<property name="host" value="#{srvPropertyFile.hostName}:#{srvPropertyFile.pydPort}" />
<property name="basePath" value="planyourday/#{srvPropertyFile.countryCode}/#{srvPropertyFile.dcNumber}"/>
<property name="resourcePackage" value="com.project1.resources"/>
<property name="license" value="Apache 2.0 License"/>
<property name="licenseUrl" value="http://www.apache.org/licenses/LICENSE-2.0.html"/>
<property name="scan" value="true"/>
</bean>
<bean id="apiListingResource" class="com.project1.utils.SwaggerApiListingResource"/>
<bean id="swaggerSerializers" class="io.swagger.jaxrs.listing.SwaggerSerializers" scope="singleton"/>
</beans>
In my Jetty server config, I am defining the srvPropertyFile which references to the environment.properties file which has the database connection to dev db.
How should I manage my persistence context so that the entity manager used while reading orders and the entity manager used while creating plans connects to different databases?
you have to configure two persistence unit, data source and transaction manager(one for read and other for write) each.
While using entity manager specify the persistence unit like below.
PersistenceUnit(unitName = "x")
EntityManagerFactory entityManagerFactory;

Image not displayed in spring-boot version 1.5.3

I have been trying for more than an hour to display an image in my SpringBoot version 1.5.3 application.
I'm trying to display an image in my html page, which is the path:
And have used the image as:
<img src="images/DataServicesAdminAppLogo.png" width="40" height="40" class="d-inline-block align-top" alt="" hspace="10"/>
in my html page. But in vain. The image is not getting displayed.
Can someone please help?
UPDATE:
Network Inspector:
ApplicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- <context:component-scan base-package="com.csaa.mdm"></context:component-scan> -->
<util:properties id="configLocProperties"
location="file:${app.config.home}/config/config.properties" />
<context:property-placeholder
location="file:${app.config.home}/config/config.properties" />
<bean id="configProperties"
class="com.csaa.mdm.adminApp.util.ApplicationPropertyConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="location">
<value>file:${app.config.home}/config/config.properties
</value>
</property>
</bean>
<bean id="applicationPropertyUtil" class="com.csaa.mdm.adminApp.util.ApplicationPropertyUtil">
<property name="propertyConfigurer" ref="configProperties" />
</bean>
<bean id="metaCryptoUtil" class="com.csaa.mdm.adminApp.util.CryptoUtil">
<property name="userId" value="${oracle.meta.username}"></property>
<property name="password" value="${oracle.meta.password}"></property>
<property name="key" value="123456789012345678901234"></property>
</bean>
<!-- Create datasource and give connection properties -->
<bean id="metaDatasource" primary="true"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${oracle.db.driver}" />
<property name="url" value="${oracle.db.dev.connection}" />
<property name="username" value="#{metaCryptoUtil.userId}" />
<property name="password" value="#{metaCryptoUtil.password}" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="metaDatasource" />
</bean>
<!-- Create the dao object and pass the datasource to it -->
<bean id="adminDao" class="com.csaa.mdm.adminApp.dao.AdminDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean id="adminUtil" class="com.csaa.mdm.adminApp.util.AdminUtil">
<property name="configProperties" ref="configLocProperties"></property>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate" />
</beans>

JMS Message consumed despite transaction rollback

I have a simple XA test setup, using JMS and JDBC. I use Atomikos 3.9.3, ActiveMQ 5.10.1 and DB2, with their proper XA drivers.
Sending messaged works ok, it is transactional. But the consume case does not - despite throwing an exception, the JMS message is consumed.
The strange thing is that it seems to be timing related - usually the first time the transaction is rolled back, and the message is still there - but one of the subsequent attempts to consume the message from the queue is successful.
This is my spring configuration for consuming messages:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
<bean id="xaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
<constructor-arg value="mulejms" />
<constructor-arg value="mulejms" />
<constructor-arg value="tcp://localhost:61616" />
</bean>
<bean id="atomikosConnectionFactoryBean" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="amq1" />
<property name="xaConnectionFactory" ref="xaConnectionFactory" />
</bean>
<bean id="msgHandler" class="com.findonnet.messaging.MessageHandlerImpl">
<property name="sequenceDAO" ref="sequenceDAO" />
</bean>
<!-- End Messaging related beans -->
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="DB2" />
<property name="xaDataSource" ref="db2DataSource" />
</bean>
<bean id="db2DataSource" class="com.ibm.db2.jcc.DB2XADataSource">
<property name="serverName" value="localhost" />
<property name="portNumber" value="50000" />
<property name="databaseName" value="HWEXT" />
<property name="driverType" value="4" />
<property name="user" value="hwextdev" />
<property name="password" value="hwextdev" />
</bean>
<!-- ===================================================== -->
<!-- ==== TRANSACTION MANAGER CONFIG ===================== -->
<!-- ===================================================== -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="true" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" />
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<!-- enable transaction annotations, and use the correct transaction manager! -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="sequenceDAO" class="com.findonnet.persistence.MessageSequenceDAO">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ========================================= -->
<!-- ==== JMS CONFIG FOR SPRING=============== -->
<!-- ========================================= -->
<jms:annotation-driven container-factory="listenerContainer" />
<jms:listener-container connection-factory="atomikosConnectionFactoryBean"
transaction-manager="transactionManager" concurrency="1"
factory-id="listenerContainer" />
</beans>
I have #Transactional and #JmsListener(destination = "test.q1") annotations on my MessageHandlerImpl.handleOrder() method.
I have no idea what I'm doing wrong.
Turns out everything was working fine, the messages ended up in the dead letter queue. I feel stupid now.

property 'configurationClass' is not writable or has an invalid setter method. Does the parameter type of the setter

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<util:properties id="hibernateProperties" location="classpath:hibernate.properties" />
<bean id="usermanagementSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="usermanagementDataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="hibernateProperties" ref="hibernateProperties" />
</bean>
<jee:jndi-lookup id="usermanagementDataSource" jndi-name="java:jboss/datasources/usermanagementDS" />
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
<property name ="startupTransactionService" value="true"/>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="30" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="User" class="com.ecom.data.access.model.User"/>
<bean id="myFactory" class="com.ecom.data.access.dao.MyFactory"/>
</beans>
I am using hibernate 4 spring 3 maven 3, i have this configuratiobn file and here I am using local session factory and it compile correctly but it gives the error
when I am using the JBoss server to deploy it then server console gives the error 'configurationClass' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? please help me to sort out this problem
Your bean definition suggests that you are trying to configure Hibernate 3, not Hibernate 4. You have probably followed incorrect example or tutorial. In Hibernate 4 there is no configurationClass property. Just remove it:
<bean id="usermanagementSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="usermanagementDataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="hibernateProperties" ref="hibernateProperties" />
</bean>
With Hibernate 4, you also don't need to provide configuration XML. All you can do is to specify packages to be scanned for #Entity classes:
<property name="packagesToScan" value="com.ecom.data.access.model" />

Resources