пользовательский процессор ожидания, создающий слишком много журнала - PullRequest
0 голосов
/ 24 января 2019

Я создал собственный обработчик журналов.который я использую, чтобы поставить ожидание, используя «Длительность штрафа».

Ниже приведен мой код для достижения этой цели.Процессор работает как положено. Но когда он запускается, я вижу, как генерируется множество журналов.я могу видеть, что журналы продолжают печатать " файл потока пуст (плохо) !!! ".Простым решением было бы закомментировать журнал, но процессор все равно вызывался так много раз.Я всегда, хотя, если я увеличу , получим значение, процессор будет вызван в этот большой интервал.

поэтому мой вопрос: как уменьшить нагрузку на процессор и сократить количество вызовов метода onTrigger?

@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
    final ComponentLog logger = getLogger();
    FlowFile flowFile = session.get();
    if (flowFile != null) {
        logger.info("flow file is not null.");
        String state = flowFile.getAttribute("_wait_state");
        if (state == null || state.isEmpty()) {
            logger.info("\"_wait_state\" attribute is missing, going into WAIT.");
            flowFile = session.putAttribute( flowFile, "_wait_state", "1");
            flowFile = session.penalize(flowFile);
            context.yield();//to save CPU cycles....
            session.transfer( flowFile, POINT_TO_SELF_RELATIONSHIP );
        } else {
            logger.info("\"_wait_state\" attribute is available, breaking WAIT.");
            flowFile = session.removeAttribute( flowFile, "_wait_state" );
            session.transfer( flowFile, SUCCESS_RELATIONSHIP); 
        }
    } else {
        logger.info("flow file is null (bad)!!!.");
    }
}

enter image description here

1 Ответ

0 голосов
/ 24 января 2019

Процессор обычно получает файл нулевого потока, это может произойти по двум причинам ...

1) В процессоре настроено более одной параллельной задачи, и платформа обнаруживает, что во входящей очереди есть файл потока, поэтому планирует запуск процессора, затем одна из задач получает файл потока, а другая переходит к выполнить и файлов потока не осталось.

2) Процессор имеет аннотацию @TriggerWhenEmpty, которая переопределяет вышеуказанное поведение и выполняет процессор все время, независимо от того, находятся ли потоковые файлы в очереди.

Большинство процессоров начинают свой onTrigger с чего-то вроде:

FlowFile flowFile = session.get();
if (flowFile == null) {
  return;
}
...