Andrey Vlasenko
Andrey Vlasenko

Reputation: 127

Move Spring XML context to Groovy

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

Answers (2)

Andrey Vlasenko
Andrey Vlasenko

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

Gary Russell
Gary Russell

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

Related Questions