Apache Vamel: Как проверить, например, набор набора <customObject> -- java поле с участием apache-camel пол Связанный проблема

Apache Camel: How to test for instance of Set<CustomObject>


1
vote

проблема

русский

Кто-нибудь знает, как тестировать для различных типов коллекции в маршруте?

 <код> // This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> // 2. Set<BadMessage> .process(new MyGoodBadMessageProcessor()) // Split the result List .split(body()).choice()     // How do you test for a Set<GoodMessage>??     .when(body().isInstanceOf(Set<GoodMessage>)         .to("direct:good")     .otherwise()         .to("direct:bad") .endChoice()   

<Сильный> Фон : (Если кто-то может увидеть лучший способ сделать это) У меня есть процессор, который в настоящее время работает следующим образом:

 <код> @Override public void process(Exchange exchange) throws Exception {     Message message = exchange.getIn();     Set<UnknownMessage> unknownMessages = message.getBody(Set.class);     Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();      for(UnknownMessage msg: unknownMessages) {         // Simplified logic here         if (msg.isGood()) {             goodMessages.add(msg.getGoodMessage());         }     }      message.setBody(goodMessages); }   

Я хотел бы обновить это так, чтобы теперь включить Badmessage (ы) для отчетности:

 <код> @Override public void process(Exchange exchange) throws Exception {     Message message = exchange.getIn();     Set<UnknownMessage> unknownMessages = message.getBody(Set.class);     Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();     Set<BadMessage> badMessages = new HashSet<BadMessage>();      List result = new ArrayList();      for(UnknownMessage msg: unknownMessages) {         // Simplified logic here         if (msg.isGood()) {             goodMessages.add(msg.getGoodMessage());         } else {             badMessages.add(msg.getBadMessage());         }     }      result.add(goodMessages)     result.add(badMessages)     message.setBody(result); }   
Английский оригинал

Does anyone know how to test for different types of Collection in a route?

// This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> // 2. Set<BadMessage> .process(new MyGoodBadMessageProcessor()) // Split the result List .split(body()).choice()     // How do you test for a Set<GoodMessage>??     .when(body().isInstanceOf(Set<GoodMessage>)         .to("direct:good")     .otherwise()         .to("direct:bad") .endChoice() 

Background: (In case someone can see a better way of doing this) I have a Processor that currently works as follows:

@Override public void process(Exchange exchange) throws Exception {     Message message = exchange.getIn();     Set<UnknownMessage> unknownMessages = message.getBody(Set.class);     Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();      for(UnknownMessage msg: unknownMessages) {         // Simplified logic here         if (msg.isGood()) {             goodMessages.add(msg.getGoodMessage());         }     }      message.setBody(goodMessages); } 

I'd like to update this as to now include the BadMessage(s) for reporting:

@Override public void process(Exchange exchange) throws Exception {     Message message = exchange.getIn();     Set<UnknownMessage> unknownMessages = message.getBody(Set.class);     Set<GoodMessage> goodMessages = new HashSet<GoodMessage>();     Set<BadMessage> badMessages = new HashSet<BadMessage>();      List result = new ArrayList();      for(UnknownMessage msg: unknownMessages) {         // Simplified logic here         if (msg.isGood()) {             goodMessages.add(msg.getGoodMessage());         } else {             badMessages.add(msg.getBadMessage());         }     }      result.add(goodMessages)     result.add(badMessages)     message.setBody(result); } 
</div
     

Список ответов

2
 
vote

Вы не можете получить тип коллекции таким образом (ничего общего с верблюдом). Как вы обновили ваш <код> process метод не требует создания другой конечной точки для плохих сообщений.

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

 

You cannot get the type of collection in this way (nothing to do with camel). The way you've updated your process method does not need creating a different end point for bad messages.

One possible way to send this to a different end point based on message type is add a processor before the choice which inspects the type of the message and adds a header. Your choice statement can then work based on this header.

</div
 
 
0
 
vote
vote
Лучший ответ
 

Следующий предикат будет работать, хотя может дать неверные результаты, когда набор пуст: /

 <код> Public class IsGoodMessage implements Predicate {     @Override     public boolean matches(Exchange exchange) {         Message message = exchange.getIn();         Set unknownSet = message.getBody(Set.class);         for (Object o : unknownSet) {             if (o instanceof GoodMessage) {                 return true;             } else {                 return false;             }         }         return false;     } }   

Это помогло: Как узнать, что Тип каждого объекта находится в ArrayList & lt; Объект & gt ;?

Обновление : После некоторого дальнейшего чтения лучший способ сделать это - использовать заголовок / свойство, чтобы помочь отличить тип сообщения.

Шаг 1: Обновите процессор для создания карты, которая идентифицирует разные типы сообщений.

 <код> "GOOD_MSGS" -> List<GoodMessage> "BAD_MSGS" -> List<BadMessage>   

Шаг 2: Создайте фасоль Splitter, который разбивает эту карту, а затем создает заголовок с помощью ключа карты с предыдущего шага. (См. «SLICMESSAGE» здесь http://camel.apache.org/splitter.html )

Шаг 3: В маршруте используйте эти заголовки, чтобы направить сообщения соответственно

 

The following Predicate would work, although might give incorrect results when the Set is empty :/

Public class IsGoodMessage implements Predicate {     @Override     public boolean matches(Exchange exchange) {         Message message = exchange.getIn();         Set unknownSet = message.getBody(Set.class);         for (Object o : unknownSet) {             if (o instanceof GoodMessage) {                 return true;             } else {                 return false;             }         }         return false;     } } 

This helped: How do I find out what type each object is in a ArrayList<Object>?

UPDATE: After some further reading, a better way to do this is to use a Header/Property to help distinguish the message type.

STEP 1: Update Processor to produce a Map that identifies different message types.

"GOOD_MSGS" -> List<GoodMessage> "BAD_MSGS" -> List<BadMessage> 

STEP 2: Create a splitter bean that splits this Map and then creates a header using the key of Map from the previous step. (see "splitMessage" here http://camel.apache.org/splitter.html)

STEP 3: In the route use these headers to route the messages accordingly

</div
 
 

Связанный проблема

1  Установка поля _ID с использованием SQLite & ContentProvider в Android  ( Setting the id field using sqlite contentprovider in android ) 
Я пытаюсь настроить ContentProvider в приложении Android, чтобы держать информацию о домах. Я хотел бы иметь возможность установить поле _id, чтобы быть таким...

40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки?  ( Can you tell on runtime if youre running java from within a jar ) 
У меня есть приложение, которое некоторые из моих пользователей работают от Eclipse, и другие запускают его, используя файл JAR. Я хочу, чтобы некоторые дей...

2  Изменить формат дата в DTO JSON на возвращении через @Responsebode  ( Change date format in dto json on returning through responsebody ) 
Я просто хочу изменить формат даты в моем DTO, возвращенный @Responseboodbody Мой вопрос не Этот вопрос как мой выход Список JSON и я печатаю его по почте...

2  Мой бар jmenu не показывает  ( My jmenu bar is not showing up ) 
Мой jmenubar не показывает, когда я запускаю свое приложение. Как я могу это исправить ?? Поэтому, когда я бегу свой Jframe, мне нужно увидеть мой jmenubar ...

4  403 доступ запрещен на указанный URL в Tomcat 7.0.52  ( 403 access denied to specified url in tomcat 7 0 52 ) 
Я недавно мигрировал сервер Tomcat из <код> 7.0.49 на <код> 7.0.52 . В Tomcat он содержит 2 веб-приложений, которые работали ранее, после миграции на эту вер...

0  Случайные 7-значные номера на andich android  ( Random 7 digit numbers on click android ) 
Я хотел бы, чтобы вы помогли мне в этом коде. Я могу генерировать случайные числа, но не в точном количестве. Вопрос: Как я могу генерировать 7 случайных ци...

0  Прямоугольник и круг Collision Java, используя .Наиград  ( Rectangle and circle collision java using intersection ) 
Я делаю игру на прорыв для школьного проекта. Единственная проблема, которую я бегу в, это мяч, подпрыгивая, когда мяч и кирпичи сталкиваются. Я использовал B...

0  карта JSON на провал строки в Java  ( Json map to string failure in java ) 
В Java я пытаюсь преобразовать карту в JSon строку. используя код ниже <код> private void sendResponse(Map<String, String> responseMap) throws IOException {...

0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx  ( Transmitting data from another thread slow serial link with java and rxtx libra ) 
<Р> Хорошо, я постараюсь быть как можно более ясно с моей проблемой. Я передача последовательных данных по veeeeeeery медленного радиоканала (с помощью UART-ко...

-1  Как добавить JTable для JPanel  ( How to add a jtable to a jpanel ) 
Мой вопрос может показаться немного глупо, но каждый раз, когда я использую качели, у меня проблемы с таблицами. Таким образом, я работаю над школьным проекто...

3  Итализация через хесмап: «Для» петля с использованием произвольного доступа или итератора?  ( Iterating over a hashmap for loop using random access or iterator ) 
Мне нужно повторить через хешмап, чтобы извлекать значения, хранящиеся в нем. Как бонус, у меня также есть список клавиш. Поэтому у меня есть возможность по...

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows?  ( How to invoke my restful api method integrated with redis on windows ) 
Я пытаюсь запустить образец весеннего загрузочного приложения с Redis. Я использую завод соединения JEDIS и установив его на заводе подключения шаблона Redis....

16  Enum внутри jsp [дубликат]  ( Enum inside a jsp ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST  ( Rest convert xml content passed with post to a java object attribute inside th ) 
<Р> Я работаю с REST сервисов и я хочу передать XML-текст запроса POST. Мой сервер реализован в JAVA. Давайте предположим, что я посылаю этот XML: <код> <ran...

16  Обычная задача Android (эквивалент Cronjob)  ( Android regular task cronjob equivalent ) 
Последний раз, когда этот вопрос был задан (другим пользователем), ответ ответа был: Если это работает в беговой активности, вы можете использовать таймер ...

Связанный проблема

1  Установка поля _ID с использованием SQLite & ContentProvider в Android 
40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки? 
2  Изменить формат дата в DTO JSON на возвращении через @Responsebode 
2  Мой бар jmenu не показывает 
4  403 доступ запрещен на указанный URL в Tomcat 7.0.52 
0  Случайные 7-значные номера на andich android 
0  Прямоугольник и круг Collision Java, используя .Наиград 
0  карта JSON на провал строки в Java 
0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx 
-1  Как добавить JTable для JPanel 
3  Итализация через хесмап: «Для» петля с использованием произвольного доступа или итератора? 
1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows? 
16  Enum внутри jsp [дубликат] 
1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST 
16  Обычная задача Android (эквивалент Cronjob) 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.