我有两个项目,一个服务项目另一个消费者项目,
消费者项目使用其他项目的服务,并且调用应该使用JMS异步
我在两个项目中安装了jms插件
我已在resources.groovy
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)
对方法的调用已提交,但实际上它没有被调用!
答案 0 :(得分:1)
in vm activemq config(vm:// localhost)仅在单个VM中有效。如果您的2个项目在不同的VM中运行,请尝试设置外部AMQ代理。
答案 1 :(得分:1)
如果您使用的是单独的进程,那么您需要使用与VM不同的传输(仅适用于单个VM),这也是启动代理的进程之一?如果没有,那么其中一个应该嵌入代理(或在外部运行)并通过传输(如TCP)公开它......