Вызов удаленного сервиса с использованием JMS - PullRequest
0 голосов
/ 01 марта 2012

У меня есть два проекта, один сервисный проект, другой потребительский проект,
Потребительский проект использует сервисы другого проекта, и вызов должен быть асинхронным с использованием 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' }


}

Примечание: На данный момент оба проекта находятся на одной машине (то есть 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 ]

1 голос
/ 03 марта 2012

если вы используете отдельные процессы, то вам нужно использовать другой транспорт, чем виртуальная машина (только для одной виртуальной машины), также один из ваших процессов запускает брокер?Если нет, то один из них должен встроить посредник (или запустить его извне) и выставить его через транспорт (например, TCP) ...

1 голос
/ 03 марта 2012

Конфигурация in vm activemq (vm: // localhost) работает только в пределах одной виртуальной машины. Если ваши 2 проекта работают в разных виртуальных машинах, попробуйте настроить внешнего брокера AMQ.

...