Почему Camel отправляет содержимое тела сообщения, а не само сообщение при использовании компонента Bean?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему Camel отправляет содержимое тела сообщения, а не само сообщение при использовании компонента Bean?

Сообщение Anonymous »

Я создал класс Java для сообщений о событиях EIP. Я ожидал получить сообщение по адресу Observer.accept(Object o) при использовании компонента Camel's Bean, но вместо этого я получил событие. Хотя это удобно, поскольку мне не нужно самому извлекать событие из тела сообщения, у меня нет доступа к возможным заголовкам и вложениям сообщения.EventMessageTest.java
package name.igb.eip.integration.styles.test;

import java.time.Instant;
import java.util.List;
import java.util.Vector;
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy;
import org.apache.camel.model.RouteDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class EventMessageTest {

static final Logger log = LoggerFactory.getLogger( EventMessageTest.class );

public static void main( final String... args ) throws Exception {

try ( CamelContext cc = new DefaultCamelContext(); ) {

cc.setNameStrategy( new DefaultCamelContextNameStrategy( "Messaging Sample" ) );

cc.getRegistry().bind( "Subject", new Subject( "Subject" ) );
cc.getRegistry().bind( "Observer", new Observer( "Observer" ) );

final List observers = new Vector();
observers.add( new Observer( "Observer 1" ) );
observers.add( new Observer( "Observer 2" ) );
observers.add( new Observer( "Observer 3" ) );

cc.addRoutes( new RouteBuilder() {

@Override
public void configure() {
final RouteDefinition route =
from( "timer:Event?repeatCount=1" )
.log( "creating endpoint " + Subject.class.getSimpleName() + "..." )
.bean( Subject.class, "get()" ) // Subject.get() returns an Event
.log( "creating..." )
.process().message( m -> {
log.info( "...{}",
m, m.getBody( Event.class ).getClass().getSimpleName() );
} )
.routeId( "Event route" );

for ( final Observer observer : observers ) {
log.info( "creating endpoint {}...", observer.id );
route
.to( "bean:Observer?method=accept" ) // this sends Event to Observer
// this alternative sends Message to Observer N
.process().message( m -> {
observer.accept( m );
} );
}
}
} ); // addRoutes( RouteBuilder() )

cc.start();
Thread.sleep( 2000 );
cc.stop();
cc.close();
}
catch ( final Exception e ) {
e.printStackTrace();
}
} // main()

} // EventMessageTest

class Subject implements Supplier {

String id;
Event event;

Subject( final String id ) {
this.id = id;
}

@Override
public Event get() {
event = new Event();
return event;
}

} // Subject

class Event {
String id = Instant.now().toString();
} // Event

class Observer implements Consumer {

String id;

Observer( final String id ) throws Exception {
this.id = id;
}

Observer setId( final String id ) {
this.id = id;
return this;
}

@Override
public void accept( final Object o ) {
// Why is o an Event and not a Message here if Observer is created
// by RouteDefinition.to( "bean:Observer?method=accept" )?
EventMessageTest.log.info( "\n{} receiving {}...",
id, o.getClass().getSimpleName() );
}

} // Observer

Вывод

19:24:13.404 [main] INFO n.i.e.i.s.test.EventMessageTest$1 - creating endpoint Observer 1...
19:24:13.408 [main] INFO n.i.e.i.s.test.EventMessageTest$1 - creating endpoint Observer 2...
19:24:13.408 [main] INFO n.i.e.i.s.test.EventMessageTest$1 - creating endpoint Observer 3...
19:24:14.553 [Camel (camel-1) thread #1 - timer://Event] INFO Event route - creating endpoint Subject...
19:24:14.559 [Camel (camel-1) thread #1 - timer://Event] INFO Event route - creating...
19:24:14.559 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.s.test.EventMessageTest$1 - ...Message
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer receiving Event...
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer 1 receiving DefaultMessage...
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer receiving Event...
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer 2 receiving DefaultMessage...
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer receiving Event...
19:24:14.560 [Camel (camel-1) thread #1 - timer://Event] INFO n.i.e.i.styles.test.EventMessageTest -
Observer 3 receiving DefaultMessage...

Это ошибка или особенность (и почему, если последнее)?
Если я изменю следующие две строки на:
...
class Observer implements Consumer {
...
public void accept( final Message o ) {
...

Я получаю:
java.lang.ClassCastException: class name.igb.eip.integration.styles.test.Event
cannot be cast to class org.apache.camel.Message (name.igb.eip.integration.styles.test.Event
and org.apache.camel.Message are in unnamed module of loader 'app')
at name.igb.eip.integration.styles.test.Observer.accept(EventMessageTest.java:1)
...

поэтому, очевидно, C a m e l н е с м о т р и т н а п а р а м е т р т и п а C o n s u m e r < / к о д > . < / p > < b r / > < h 3 > P O M ( д л я т е с т и р о в а н и я M R E ) < / h 3 > < b r / > < p r e c l a s s = " l a n g - x m l P r e t t y p r i n t - o v e r r i d e " > < c o d e > & l t ; p r o j e c t x m l n s = & q u o t ; h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0 & q u o t ; < b r / > x m l n s : x s i = & q u o t ; h t t p : / / w w w . w 3 . o r g / 2 0 0 1 / X M L S c h e m a - i n s t a n c e & q u o t ; < b r / > x s i : s c h e m a L o c a t i o n = & q u o t ; h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0 h t t p : / / m a v e n . a p a c h e . o r g / m a v e n - v 4 _ 0 _ 0 . x s d & q u o t ; & g t ; < b r / > & l t ; m o d e l V e r s i o n & g t ; 4 . 0 . 0 & l t ; / m o d e l V e r s i o n & g t ; < b r / > < b r / > & l t ; g r o u p I d & g t ; n a m e . i g b & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; e i p & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 0 . 0 . 1 - S N A P S H O T & l t ; / v e r s i o n & g t ; < b r / > < b r / > & l t ; p r o p e r t i e s & g t ; < b r / > & l t ; p r o j e c t . b u i l d . s o u r c e E n c o d i n g & g t ; U T F - 8 & l t ; / p r o j e c t . b u i l d . s o u r c e E n c o d i n g & g t ; < b r / > & l t ; p r o j e c t . r e p o r t i n g . o u t p u t E n c o d i n g & g t ; U T F - 8 & l t ; / p r o j e c t . r e p o r t i ng.outputEncoding>
23

8.0.1
4.1.0
6.0.0.Final
4.8.2
2.0.16
1.5.15
5.14.2
1.4





javax
javaee-api
${javaee.version}


jakarta.enterprise
jakarta.enterprise.cdi-api
${jakarta.enterprise.cdi-api.version}
provided


org.jboss.weld.se
weld-se-shaded
${weld-se.version}



org.apache.camel
camel-core
${camel.version}



org.apache.camel
camel-test-junit5
${camel.version}
test



org.apache.camel
camel-componentdsl
${camel.version}



org.apache.camel
camel-direct
${camel.version}



org.apache.camel
camel-groovy
${camel.version}



org.apache.camel
camel-mail
${camel.version}



org.apache.camel
camel-jms
${camel.version}



org.apache.camel
camel-sjms
${camel.version}



org.apache.camel
camel-sjms2
${camel.version}



org.slf4j
slf4j-api
${slf4j.version}



ch.qos.logback
logback-core
${logback.version}



ch.qos.logback
logback-classic
${logback.version}



org.mockito

mockito-core
${mockito.version}
test





install




org.apache.camel
camel-maven-plugin
${camel.version}



com.github.exampledriven
hierarchy-maven-plugin
${hierarchy-maven-plugin.version}








Подробнее здесь: https://stackoverflow.com/questions/793 ... lf-when-us
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»