Свойство Exchange обновляется синхронно с ArrayList <> во время обработки - PullRequest
0 голосов
/ 26 июня 2018

Я использую Apache Camel с SpringBoot для обработки \ обработки некоторых данных.

Я всегда думал, что свойства exchange можно изменить только путем извлечения данных из свойства через exchange.getProperty(..), обработки данных и установки новых данных в свойство через setProperty(..).

Но теперь я вижу, что мое свойство взамен изменяется во время обработки моего извлеченного массива.

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

Я загружаю список слов в ArrayList<String> и запускаю метод retainAll, чтобы сохранить слово, которое мне не нужно. Моя идея заключается в том, что оригинальная недвижимость в обмен не будет изменена. Но когда я запускаю debug в unittest, я вижу, что после завершения метода retainAll(..) обновляется не только локальный ArrayList<String>, но и свойство, содержащее все слова.

Я что-то пропускаю (возможно, неправильно retainAll метод?) Или это ошибка?

StringsProccessor.class:

package com.mydummytest;

import java.util.ArrayList;
import java.util.stream.Collectors;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component
public class StringsProcessor implements Processor {

    @SuppressWarnings("unchecked")
    @Override
    public void process(Exchange exchange) throws Exception {
      ArrayList<String> input = (ArrayList<String>) exchange.getProperty("words");
      String toRetain = (String) exchange.getProperty("retain");

      input.retainAll(input.stream()
      .filter(s -> s.equals(toRetain))
      .collect(Collectors.toList())
      );
    }
}

StringsProcessorTest.class:

package com.mydummytest;

import java.util.ArrayList;
import java.util.Collections;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class StringsProcessorTest {

  private Exchange exchange;
  private StringsProcessor proc;

  @BeforeEach
  void beforeEach() {
    // camel classes
    CamelContext ctx = new DefaultCamelContext();
    exchange = new DefaultExchange(ctx);
    proc = new StringsProcessor ();

    ArrayList<String> words = new ArrayList<String>();
    Collections.addAll(words, "fox", "racoon", "eagle", "salmon");

    String retain = "salmon";

    exchange.setProperty("words", words);
    exchange.setProperty("retain", retain);
  }

  @Test
  void testProcessing() throws Exception {
    proc.process(exchange);
  }

}

1 Ответ

0 голосов
/ 27 июня 2018

Ответ заключался в использовании нового экземпляра списка массивов для хранения значения во время обработки (метод, который я получил от getProperty, был ссылкой на исходное свойство, как указали @ClausIbsen и @Bedla) .

Класс StringProcessor.java должен выглядеть следующим образом:

package com.mydummytest;

import java.util.ArrayList;
import java.util.stream.Collectors;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component
public class StringsProcessor implements Processor {

    @SuppressWarnings("unchecked")
    @Override
    public void process(Exchange exchange) throws Exception {
      ArrayList<String> input = (ArrayList<String>) exchange.getProperty("words");
      String toRetain = (String) exchange.getProperty("retain");

      ArrayList<String> processed = input.stream()
      .filter(s -> s.equals(toRetain))
      .collect(Collectors.toList())
      );

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