grails jms在完成apllication之后开始监听

时间:2015-11-24 17:21:35

标签: grails jms activemq

我使用grails jms-1.3插件,我遇到了问题,我的jms侦听器服务在应用程序完全启动并运行之前就开始使用来自activeMQ的消息。当我尝试将一些消息写入DB时,这会导致错误。 所以我的问题是,如何设法从手动开始使用队列。这样我就可以将autoStartup设置为false。

这是我的示例grails代码:

ConsumerService.groovy

package jmsstartstop

import grails.plugin.jms.Queue

class ConsumerService {
    static exposes = ["jms"]
    @Queue(name="liesMich")
    def receiveMessage(String msg) {
        log.info("Received Message:" + msg)
    }
}

resources.groovy

import org.apache.activemq.ActiveMQConnectionFactory
import org.springframework.jms.connection.SingleConnectionFactory

beans = {
    jmsConnectionFactory(SingleConnectionFactory) {
        targetConnectionFactory = { ActiveMQConnectionFactory cf ->
            brokerURL = grailsApplication.config.jms.brokerURL
        }
    }
}

Config.groovy中

jms{
    brokerURL='tcp://localhost:61616'
    containers {
        standard {
            autoStartup = false
        }
    }
}

我正在寻找的是类似jmsConnectionFactory.getTargetConnectionFactory().start()的内容,可以在Bootstrap.groovy中调用,也可以在控制器中手动调用。但不幸的是,TargetConnectionFactory中不存在这种启动方法。

有没有办法做到这一点,还是有任何其他建议?

Bootstrap.groovy (无效)

class BootStrap {
    def jmsConnectionFactory

    def init = { servletContext ->
        jmsConnectionFactory.??WHATEVER??.start()

    }
    def destroy = {
    }
}

2 个答案:

答案 0 :(得分:1)

问题是插件在Datasource插件(Grails的一部分)完成它自己的启动之前开始处理消息。

好消息是这个插件的最新SNAPSHOT版本中的appears to be fixed

要使用SNAPSHOT,请更改您的插件::jms:1.3-SNAPSHOT

中的BuildConfig.groovy

答案 1 :(得分:1)

对我来说有用的是在Bootstrap文件上手动启动JMSListener服务:

e.g。

In listener.groovy:
class ClientListenerService {

    boolean transactional = true
    static exposes = ["jms"]
    static destination = "com.moviesxd.api.domain.Client_QUEUE"
    static isTopic = false
    static container = "manualStart"


In bootstrap.groovy:

def clientRequestListenerJmsListenerContainer

...

clientRequestListenerJmsListenerContainer.start()

这解决了这个问题。