Reputation: 127
I am trying to move my simple spring integration application from XML context to Groovy contex. Unfortunately, a couldn't find any useful examples how to work with namespaces in Groovy context. I started from the simplest part, inbound gateway binded with MQ:
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="<brokerUrl>"/>
</bean>
</property>
</bean>
<int:channel id="plainRequestChannel"/>
<int:channel id="errorChannel"/>
<int:channel id="plainReplyChannel"/>
<int-jms:inbound-gateway id="gateway" request-destination-name="QUEUE.IN"
default-reply-queue-name="QUEUE.OUT"
request-channel="plainRequestChannel"
error-channel="errorChannel"
reply-channel="plainReplyChannel"
connection-factory="jmsFactory"/>
My Groovy equivalent of this context (doesn't work):
package spring4
import org.apache.activemq.jms.pool.PooledConnectionFactory
import org.apache.activemq.spring.ActiveMQConnectionFactory;
beans {
xmlns intjms:"http://www.springframework.org/schema/integration/jms"
xmlns integration:"http://www.springframework.org/schema/integration"
amqConnectionFactory (ActiveMQConnectionFactory) {
brokerURL = "<brokerUrl>"
}
jmsFactory (PooledConnectionFactory) {bean ->
bean.destroyMethod = 'stop'
connectionFactory = ref('amqConnectionFactory')
}
integration.channel(id:'plainRequestChannel')
integration.channel(id:'plainReplyChannel')
integration.channel(id:'errorChannel')
intjms.'inbound-gateway'(
id:"gateway",
'request-destination-name': "QUEUE.IN",
'default-reply-queueName': "QUEUE.OUT",
'request-channel': ref('plainRequestChannel'),
'error-channel': ref('errorChannel'),
'reply-channel': ref('plainReplyChannel'),
'connection-factory': ref('jmsFactory')
)
}
As I mentioned, It doesn't work. Error:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jms.listener.DefaultMessageListenerContainer#0': Cannot resolve reference to bean '<jmsFactory>' while setting bean property 'connectionFactory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '<jmsFactory>' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.context.support.GenericGroovyApplicationContext.<init>(GenericGroovyApplicationContext.java:151)
at my.pack.integration.SpringGroovyBootstraper.main(SpringGroovyBootstraper.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '<jmsFactory>' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
... 19 more
Please, what am I doing wrong? Also, I would appreciate if you recommend me any links to related tutorials/examples/docs
Upvotes: 0
Views: 537
Reputation: 127
Well, this particular problem has been solved: I just removed ref
. So my context now looks like this:
package spring4
import org.apache.activemq.jms.pool.PooledConnectionFactory
import org.apache.activemq.spring.ActiveMQConnectionFactory;
beans {
//importBeans("classpath:spring4/IntegrationProperties.groovy")
xmlns intjms:"http://www.springframework.org/schema/integration/jms"
xmlns integration:"http://www.springframework.org/schema/integration"
amqConnectionFactory (ActiveMQConnectionFactory) {
brokerURL = "<brokerUrl>"
}
jmsFactory (PooledConnectionFactory) {bean ->
bean.destroyMethod = 'stop'
connectionFactory = amqConnectionFactory
}
integration.channel(id:'plainRequestChannel')
integration.channel(id:'plainReplyChannel')
integration.channel(id:'errorChannel')
intjms.'inbound-gateway'(
id:'gateway',
'request-destination-name': "QUEUE.IN",
'default-reply-queueName': "QUEUE.OUT",
'request-channel': 'plainRequestChannel',
'error-channel': 'errorChannel',
'reply-channel': 'plainReplyChannel',
'connection-factory': 'jmsFactory'
)
}
Upvotes: 0
Reputation: 174524
Have you looked at the groovy dsl?
It hasn't had much activity lately but it might give you some pointers (it has a JMS module).
You might also want to look at the new (actively maintained) Java DSL.
Upvotes: 1