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()
这解决了问题。
我正在使用 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()
这解决了问题。