Как правильно реализовать связующее? - PullRequest
0 голосов
/ 28 февраля 2019

Вопрос был сильно отредактирован во время обсуждения с Олегом

Я пытаюсь реализовать механизм связывания для BigQuery в Spring Cloud Stream.

Полный код приложения доступенна GitHub .

Пока что я написал класс BigQueryBinderConfiguration, который возвращает BigQueryBinder следующим образом

@Configuration @EnableConfigurationProperties({ BigQueryConfiguration.class })
public class BigQueryBinderConfiguration {
    @Autowired BigQueryConfiguration configuration;

    @Bean
    BigQueryBinder bigQueryMessageChannelBinder(BigQueryConfiguration configuration, BigQueryProvisioningProvider provisioningProvider) {

        return new BigQueryBinder(configuration, provisioningProvider);
    }

    @Bean BigQueryProvisioningProvider provisioningProvider() {
        return new BigQueryProvisioningProvider(configuration);
    }
}

Моя проблема в том, что когдапри этом другие мои связующие (Кролик и Кафка) больше не узнаются.

Мой протокол тестирования выглядит следующим образом: я запускаю свое приложение и проверяю в интерфейсе администратора rabbitmq, регистрируется ли мое приложение как потребитель.Это не тот случай, когда этот код не комментируется.

При отладке вызова bigQueryMessageChannelBinder(....) я наблюдаю следующие вещи:

Метод DefaultBinderFactory#getBinder(...) всегда возвращает мой экземпляр BigQueryBinder.Отладка показывает, что вызов this.context.getBeansOfType(Binder.class); возвращает список, который содержит только мой BigQueryBinder.Я озадачен, потому что другие связующие находятся в моем classpath, и если я удаляю фабричный метод BigQueryBinderConfiguration#bigQueryMessageChannelBinder(....), все работает нормально.

Я обнаружил во время отладки, что DefaultBinderFactory является классом, который являетсяиспользуется для привязки связывателя к имени конфигурации.Я также обнаружил, что реализации Binder не должны появляться в Map<String, Binder> binders.Но, к сожалению, моя реализация Binder появляется в этом списке.Я думаю, это как-то связано с природой бобов.Но как?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Исходя из разговоров в этом выпуске # 1623 .

Я хочу получать / создавать сообщения из / в каналы Spring Cloud Stream на внутреннюю шину событий от Axon Framework.

Является ли модель на этой фотографии правильной?

Модель приложения с внутренним и внешним переплетом

Если это правильно, я думаю, что мы должны использовать каналы изПоток в пользовательском связывателе путем внедрения bean-компонентов или других методов.

В классе TestChannelBinder каналы были созданы в коде пользователя с помощью вызывающего конструктора. Как использовать каналы, управляемые Spring Cloud Stream, в пользовательском связывателе?

private SubscribableChannel provisionDestination(String name, boolean pubSub) {
        String destinationName = name + ".destination";
        SubscribableChannel destination = this.provisionedDestinations
                .get(destinationName);
        if (destination == null) {
            destination = pubSub ? new PublishSubscribeChannel() : new DirectChannel();
            ((AbstractMessageChannel) destination).setBeanName(destinationName);
            ((AbstractMessageChannel) destination).setComponentName(destinationName);
            this.provisionedDestinations.put(destinationName, destination);
        }
        return destination;
    }
0 голосов
/ 28 февраля 2019

Я думаю, что лучшее, что вы можете сделать, - это сначала взглянуть на наш новый TestChannelBinder.java .По сути, это полноценное связующее, поддерживаемое Spring Integration.Другими словами, Spring Integration и ее каналы играют роль посредника сообщений, таким же, как Rabbit, Kafka, GCP и другие связующие.Что важно в этом связующем, так это в том, что он эффективно демонстрирует минимальный уровень того, что требуется для реализации работающего связующего.

...