2015-11-24 47 views
0

我正在使用grails jms-1.3插件,我遇到問題,我的jms偵聽器Service在應用程序完全啓動並運行之前開始使用activeMQ中的消息。當我嘗試向DB寫入一些消息時,這會導致錯誤。 所以我的問題是,我如何設法開始手動從隊列中消費。這樣我可以將autoStartup設置爲false。grails jms在完成啓動後開始監聽

這裏是我的例子代碼的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 = { 
    } 
} 
+1

這似乎是固定在最新的快照(請參見:https://github.com/gpc/jms/commit/dee0630d0073d9611da3d0a0efbf8b8b33565ccd)嘗試使用':JMS:1.3 SNAPSHOT' –

+0

您的權利,感謝這個提示。 – physi

回答

1

的問題是,插件啓動(Grails的部分)的數據源插件之前處理消息已經完成了它自己的啓動。

好消息是,這個appears to be fixed在最新的SNAPSHOT插件版本中。

使用的快照改變你的插件爲這樣::jms:1.3-SNAPSHOTBuildConfig.groovy

1

什麼工作對我來說是對引導文件手動啓動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() 

這就解決了這個問題。