我有两个项目,一个是服务项目,另一个是消费者项目,
消费者项目使用其他项目的服务,调用应该使用 JMS 异步
我在两个项目中都安装了 jms 插件
我在两个项目中都定义了 JMSConnectionFactory,如下 resources.groovy
import org.springframework.jms.connection.SingleConnectionFactory
import org.apache.activemq.ActiveMQConnectionFactory
beans = {
jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { brokerURL = 'vm://localhost' }
}
注:这两个项目现在都在同一台机器上(即本地主机)
现在从消费者的 Controller 我正在从 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
}
}
现在,当 Controller 提交对服务的调用时,它已成功提交但未到达实际服务
我也试过
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' }
}
从消费者的 Controller 我调用这个服务如下
jmsService.send(app:'queue.notification',service:'hello',method: 'sayHello', params.body)
调用方法被提交,但实际上它没有被调用!
最佳答案
in vm activemq 配置 (vm://localhost) 仅在单个 VM 中有效。如果您的 2 个项目在不同的虚拟机中运行,请尝试设置外部 AMQ 代理。
关于spring - 使用 JMS 调用远程服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522350/