2015-04-02 3 views
1

можно использовать интерфейс мультиметода в качестве шлюза с одним каналом?Тот же канал для разных методов

Я использую интеграцию пружин 4.1.2.RELEASE.

Различные методы вызова различных методов API на других серверах.

Мой конфиг/источник выглядит как:

The Gateway:

@MessagingGateway 
public interface TestService 
{ 
    @Gateway(requestChannel="testRequestChannel") 
    public Test findTestById(String test); 

    @Gateway(requestChannel="testRequestChannel") 
    public List<Test> getTests(); 

    .... many more methods .... 
} 

The Service осущ:

@MessageEndpoint 
public class TestServiceImpl 
{ 
    @ServiceActivator(inputChannel = "testRequestChannel")  
    public Test findTestById(String test) 
    { 
    ... 
    } 

    @ServiceActivator(inputChannel = "testRequestChannel")  
    public List<Test> getTests(String test) 
    { 
    ... 
    } 
} 

модели:

@Service 
public class TestModel 
{ 
    @Autowired 
    private TestService testService; 

    public Test findTestById(String test) 
    { 
    return this.testService.findTestById(test); 
    } 
} 

Благодарности

Marcel

ответ

0

Нет, вы не можете этого сделать; с двумя услугами, подписанными на один и тот же канал (по умолчанию), запросы по этому каналу будут циклически распределены по методам поочередно.

Поскольку вы начинаете свой поток со шлюзом, почему бы просто не использовать отдельный канал для каждого?

+0

У меня есть интерфейс с несколькими методами. Для меня звучит ужасно, чтобы создать канал для каждого метода ... Есть ли какие-либо другие решения (простые, как шлюз) для моей проблемы? –

+0

Вам не нужно объявлять каналы, просто дайте им имена unuque. Структура создаст объявления по умолчанию. –

+0

Ну, вы неправильно поняли принципы обмена сообщениями. «Канал» относится к первоклассному гражданину. И его цель - получать сообщения от производителя и доставлять их подписчику. Пожалуйста, прочитайте книгу [(EIP] (http://www.enterpriseintegrationpatterns.com/) для теории. Вы делаете это только с одним каналом, но в этом случае вы должны разместить на нем маршрутизатор и использовать '#gatewayMethod 'SpEL variable, чтобы заполнить заголовок сообщения, который будет использоваться в качестве ключа маршрутизации в этом маршрутизаторе. Однако вы должны предоставлять канал в нисходящем канале в любом случае. Или использовать единую услугу для всех случаев. Именно так работает framewrok! –

Смежные вопросы