создание нескольких подписчиков / активаторов услуг для програмирования канала - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь использовать Spring интеграции SI в своем приложении, я создаю каналы и активаторы услуг программно, у меня есть 2 вопроса, во-первых, я логика обработки сообщений в методе процесса активатора службы, является этот анти-паттерн?

@Component
public abstract class IChannelProcessor {

    @Loggable
    Logger logger;

    public void handleMessage(Message<IMessage> message) {

        try {

            boolean messagePreprocessed = false, messageProcessed = false, messagePostprocessed = false;

            messagePreprocessed = preProcessMessage(message);
            if (messagePreprocessed)
                messageProcessed = processMessage(message);
            if (messageProcessed)
                messagePostprocessed = postProcessMessage(message);
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
    }

    public abstract boolean preProcessMessage(Message<IMessage> message);

    public abstract boolean processMessage(Message<IMessage> message);

    public abstract boolean postProcessMessage(Message<IMessage> message);
}

и позже я подписываюсь на каналы, как показано ниже

channelProcessor = (IChannelProcessor) obj;
                        serviceActivatorHandler = new ServiceActivatingHandler(channelProcessor, "handleMessage");
                        String processorChannelName = config.get(processName, Constants.PARAMETER_KEY_CHANNEL);
                        utils.createInputChannel(processorChannelName).subscribe(serviceActivatorHandler);

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

Второй вопрос: я пытаюсь создать несколько потребителей (потоков) для канала, отмечая, что мне нужно убедиться, что сообщение обрабатывается только один раз.

Я обнаружил, что отправленный в дополнение к taskExecutor может достичь того, как я могу получить подобную вещь программно в Java

<int:channel id="receiverChannel">
       <int:dispatcher task-executor="workerThreadExecutor"/>
</int:channel>
<task:executor id="workerThreadExecutor" pool-size="15" queue-capacity="10"  rejection-policy="DISCARD" />
<int:service-activator id="worker" ref="workerThread" method="process" input-channel="receiverChannel" />
<bean id="workerThread" class="com.uppi.poc.throttler.WorkerThread" />
...