Верблюд: Как транслировать компонент из SQL с помощью StreamList - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь использовать компонент Camels SQL для потоковой передачи из базы данных с использованием outputType = StreamList. Я получаю ResultIterator из класса Java с ConsumerTemplate:

public Flux<String> CreateFlux () {
ConsumerTemplate consumer = camelContext.createConsumerTemplate();

    ResultSetIterator resultSetIterator = consumer.receiveBody(
            "sql:SELECT DATA FROM TRANSAKSJON WHERE REQ_ID='" + recId + "'?outputType=StreamList", ResultSetIterator.class);
    ...
    while (result.hasNext()) {
        Map<String, String> map = (Map<String, String>) result.next();
        String data = map.get("DATA");

    }
}

При попытке выполнить итерацию ResultsetIterator я получаю следующую ошибку:

org.h2.jdb c .JdbcSQLException : Объект уже закрыт [90007-197]

После проверки я вижу, что соединение закрыто. connection = {HikariProxyConnection@16287} "HikariProxyConnection@1048081993 упаковка com.zaxxer.hikari.pool.ProxyConnection.ClosedConnection"

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

Версия верблюда: 2.24.1

Обновление 1: после просмотра исходного кода он предназначен. onDone закрывает соглашение. Я пытаюсь настроить UnitOfWork на свой defaultExchange, чтобы держать соединение открытым, пометив обмен как не выполненный.

Update2: удалось заставить его работать, установив UnitOf Work:

        ProducerTemplate pTmp = camelContext.createProducerTemplate();

        DefaultExchange defaultExchange = new DefaultExchange(camelContext);
        UnitOfWork unitOfWork = new DefaultUnitOfWork(defaultExchange);
        defaultExchange.setUnitOfWork(unitOfWork);
        pTmp.send("direct:DbStream", defaultExchange);

Маршрут DbStream выполняет SQL выбор, описанный выше

1 Ответ

1 голос
/ 14 февраля 2020

Не используйте receiveBody, а просто получите, чтобы получить Exchange обратно. Затем вы можете получить итератор из его тела сообщения, а после использования вы можете выполнить обмен (см. Javado c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...