使用JMS调用远程服务

时间:2012-03-01 19:06:46

标签: spring grails jms activemq

我有两个项目,一个服务项目另一个消费者项目,
消费者项目使用其他项目的服务,并且调用应该使用JMS异步

我在两个项目中安装了jms插件

我已在resources.groovy

中的两个项目中定义了JMSConnectionFactory
import org.springframework.jms.connection.SingleConnectionFactory
import org.apache.activemq.ActiveMQConnectionFactory

beans = {
       jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { brokerURL = 'vm://localhost' }


}

注意:这两个项目现在都在同一台机器上(即localhost)

现在来自消费者的控制器我正在从ServiceProvider项目调用服务

jmsService.send(service:'serviceProvider', params.body)

在ServiceProvider中,服务定义如下

import grails.plugin.jms.*
class ServiceProviderService {

def jmsService

    static transactional = true
    static exposes = ['jms1']

def createMessage(msg) {
        print "Called1"
        sleep(2000) // slow it down
        return null
    }


}

现在当控制器提交对服务的调用时,它会成功提交,但不会到达实际服务

我也试过

jmsService.send(app: "ServiceProvider", service: "serviceProvider", method: "createMessage", msg, "standard", null) 

更新

现在我已经将activeMQ插件安装到服务提供商,使其成为嵌入式代理(jms已经存在)

并创建了一项服务

package serviceprovider

class HelloService {
    boolean transactional = false
    static exposes = ['jms']
    static destination = "queue.notification"

    def onMessage(it){
        println "GOT MESSAGE: $it"
    }

    def sayHello(String message){
        println "hello"+message
    }
}
现在,两个项目中的

resources.groovy都是

import org.springframework.jms.connection.SingleConnectionFactory
import org.apache.activemq.ActiveMQConnectionFactory

beans = {
    jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { brokerURL = 'tcp://127.0.0.1:61616' }
}
来自消费者控制器的

我正在调用此服务,如下所示

jmsService.send(app:'queue.notification',service:'hello',method: 'sayHello',  params.body)

对方法的调用已提交,但实际上它没有被调用!

2 个答案:

答案 0 :(得分:1)

in vm activemq config(vm:// localhost)仅在单个VM中有效。如果您的2个项目在不同的VM中运行,请尝试设置外部AMQ代理。

答案 1 :(得分:1)

如果您使用的是单独的进程,那么您需要使用与VM不同的传输(仅适用于单个VM),这也是启动代理的进程之一?如果没有,那么其中一个应该嵌入代理(或在外部运行)并通过传输(如TCP)公开它......