我使用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 = {
}
}
答案 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()
这解决了这个问题。