Я использую 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);
}
}