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 ) // 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" ) // 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;
Subject( final String id ) {
this.id = id;
}
@Override
@Handler
public Event get() {
return new 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
@Handler
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" )?
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
Мобильная версия