Понимание Spring-интеграции сервис-активатор - PullRequest
0 голосов
/ 05 февраля 2019

Мне дали задание внести некоторые изменения в проект spring-integration, который был разработан десять лет назад, и я знаю, как он работает, поэтому я посмотрел некоторые из spring-integration учебных пособий, хотя я этого не делалпонять это полностью, я получил некоторые базовые знания об этом.Теперь я пытаюсь понять приведенный ниже фрагмент конфигурации spring-integration конфигурации spring.integration.version 2.2.4.RELEASE перед внесением изменений

<!-- Currency Pull from NetSuite -->
<int:gateway id="currencySyncGateway" service-interface="com.integration.service.INetSuiteCurrencyPullService" default-request-channel="currenciesFromNetSuite" />


<bean id="nsCurrencyPullService" class="com.integration.service.impl.NetSuiteCurrencyPullService" />
<int:channel id="currenciesFromNetSuite" />
<int:service-activator input-channel="currenciesFromNetSuite" ref="nsCurrencyPullService" method="getCurrencies" output-channel="pushCurrenciesToDB" />

<bean id="msSqlCurrencyPushService" class="com.integration.service.impl.MSSQLCurrencyPushService" />
<int:channel id="pushCurrenciesToDB" />
<int:service-activator input-channel="pushCurrenciesToDB" ref="msSqlCurrencyPushService" method="saveCurrenciesToDB" />

Ниже приведены соответствующие классы для указанных выше компонентов

INetSuiteCurrencyPullService

public interface INetSuiteCurrencyPullService {

    List<Currency> getCurrencies(String in);

}

NetSuiteCurrencyPullService

public class NetSuiteCurrencyPullService implements INetSuiteCurrencyPullService {

    @Autowired
    INetSuiteClient restletClient;

    @Override
    public List<Currency> getCurrencies(String in) {
        LOGGER.info("Retrieving currencies from NetSuite...");
        PullCurrenciesRestletResponse response = restletClient.pullCurrencies();
        LOGGER.debug("Restlet response: {}", response);

        if ("SUCCESS".equals(response.getError().getCode())) {
            LOGGER.info("Received restlet response: executionTimeMillis=" + response.getExecutionTimeMillis() + ", count=" + response.getCurrencies().size());
            return response.getCurrencies();
        } else {
            String msg = "Error retrieving currencies from NetSuite: " + response.getError().getMessage();
            LOGGER.error(msg);
            throw new RuntimeException(msg);
        }
    }

}

MSSQLCurrencyPushService

public class MSSQLCurrencyPushService implements IMSSQLCurrencyPushService {

    @Autowired
    CurrencyConversionRepository currencyConversionRepository;

    @Override
    public List<Currency> saveCurrenciesToDB(List<Currency> in) {
        // logic to save Currency in DB     
        return in;
    }
}

Итак, мое понимание вышеspring-integration конфигурирование после запуска приложения (исправьте, если оно неверно)
1. Spring инициализирует прокси-объект для INetSuiteCurrencyPullService first
2. Затем запускает nsCurrencyPullService bean
3. Затем вызывает getCurrencies метод nsCurrencyPullService
4. И передает вывод saveCurrenciesToDB метод msSqlCurrencyPushService

Пожалуйста, помогите мне с моими вопросами ниже
Так что вышеуказанные шаги выполняются только в течение весныЗапуск приложения?
Или это происходит через регулярные промежутки времени после запуска приложения?
Если оно выполняется через равные промежутки времени, где я могу проверить частоту опроса вызова nsCurrencyPullService?

1 Ответ

0 голосов
/ 05 февраля 2019

То есть вышеуказанные шаги выполняются только во время весеннего запуска приложения?

Создание инфраструктуры (компонента) выполняется один раз, во время инициализации контекста приложения.Компоненты соединены вместе, используя MessageChannel s.Когда вызывается шлюз, полезная нагрузка упаковывается в сообщение и отправляется на канал.По умолчанию каналы имеют значение DirectChannel с, что означает, что служба вызывается непосредственно в потоке вызывающего абонента.

Выход первой службы отправляется по каналу второй службе;снова в ветке звонящего.Результат этой службы возвращается вызывающей стороне в результате вызова метода.

частота опроса

В этом сценарии опроса нет;сообщения отправляются в потоке интеграции вызывающим абонентом шлюза.

Современный способ сделать то же самое - использовать DSL.

@Bean
public IntegrationFlow() {
    return IntegrationFlows.from(INetSuiteCurrencyPullService.class)
         .handle("bean1", "method1")
         .handle("bean2", "method2")
         .get();
}
...