Ожидание завершения всех потоков в Spring Integration

У меня есть самоисполняемая jar-программа, которая сильно зависит от Spring Integration. Проблема, с которой я столкнулся, заключается в том, что программа завершается до того, как другие компоненты Spring полностью завершили .

Ниже представлена ​​урезанная версия кода, который я использую, при необходимости я могу предоставить дополнительный код / ​​конфигурацию. Точкой входа является метод main (), который загружает Spring и запускает процесс импорта:

public static void main(String[] args) {
    ctx = new ClassPathXmlApplicationContext("flow.xml");
    DataImporter importer = (DataImporter)ctx.getBean("MyImporterBean");
    try {
        importer.startImport();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        ctx.close();
    }
}

DataImporter содержит простой цикл, который отправляет сообщения на шлюз интеграции Spring.Это обеспечивает активный "проталкивающий" подход к потоку, а не обычный подход опроса данных. Вот где возникает моя проблема:

public void startImport() throws Exception {
    for (Item item : items) {
        gatewayBean.publish(item);
        Thread.sleep(200); // Yield period
    }
}

Для полноты XML потока выглядит примерно так:

<gateway default-request-channel="inChannel" service-interface="GatewayBean" />

<splitter input-channel="inChannel" output-channel="splitChannel" />

<payload-type-router input-channel="splitChannel">
    <mapping type="Item" channel="itemChannel" />
    <mapping type="SomeOtherItem" channel="anotherChannel" />
</payload-type-router>

<outbound-channel-adapter channel="itemChannel" ref="DAOBean" method="persist" />

Поток запускается и обрабатывает элементы эффективно, но как только цикл startImport () завершается, основной поток завершается и разрывает все Spring Integration потоки немедленно. Это приводит к состоянию гонки, последние (n) элементов не полностью обрабатываются при завершении программы.

У меня есть идея поддерживать счетчик ссылок для элементов, которые я обрабатываю, но это оказывается довольно сложным, поскольку поток часто разделяет / направляет сообщения нескольким активаторам служб - это означает, что трудно определить, каждый ли товар "закончен".

Я думаю, что мне нужен способ либо проверить, что никакие компоненты Spring не выполняются, либо пометить, что все элементы, отправленные на шлюз, были полностью обработаны перед завершением.

Мой вопрос: как я могу сделать что-то из этого или есть лучший подход к моей проблеме, о котором я не думал?

15
задан seanhodges 19 January 2012 в 12:20
поделиться