【问题标题】:grails jms start listening after apllication is completly launchedgrails jms 在应用程序完全启动后开始监听
【发布时间】:2016-02-27 06:25:11
【问题描述】:

我正在使用 grails jms-1.3plugin 并且我有一个问题,即我的 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中不存在这个启动方法。

有没有办法,或者有什么其他的建议?

Bootstrap.groovy(不起作用)

class BootStrap {
    def jmsConnectionFactory

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

    }
    def destroy = {
    }
}

【问题讨论】:

  • 这似乎已在最新的 SNAPSHOT 中修复(请参阅:github.com/gpc/jms/commit/…)尝试使用 :jms:1.3-SNAPSHOT
  • 你的权利,谢谢你的提示。

标签: grails jms activemq


【解决方案1】:

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

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

要使用 SNAPSHOT,请更改您的插件::jms:1.3-SNAPSHOT in your BuildConfig.groovy

【讨论】:

    【解决方案2】:

    对我有用的是在 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()
    

    这样就解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 2010-12-30
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多