grails jms 在应用程序完全启动后开始监听

grails jms start listening after apllication is completly launched

我正在使用 grails jms-1.3 插件,但我遇到了问题,我的 jms 侦听器服务在应用程序完全启动和 运行 之前就开始使用来自 activeMQ 的消息。当我尝试将一些消息写入数据库时​​,这会导致错误。 所以我的问题是,我怎样才能设法手动从队列中开始消费。这样我就可以将 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中并没有这个start方法。

有没有什么办法,或者有什么建议吗?

Bootstrap.groovy(无效)

class BootStrap {
    def jmsConnectionFactory

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

    }
    def destroy = {
    }
}

问题是插件在数据源插件(Grails 的一部分)完成其自身启动之前开始处理消息。

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

要使用 SNAPSHOT,请将您的插件更改为::jms:1.3-SNAPSHOT 在您的 BuildConfig.groovy

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

例如

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()

这解决了问题。