Agile Saturday #1 Keynote by Vasco Duarte from Anton Arhipov on Vimeo.
See the other videos from the event at agile.ee.
Agile Saturday #1 Keynote by Vasco Duarte from Anton Arhipov on Vimeo.
(* 100M 1.1) = 110.00000000000001
(class (* 100M 1.1)) = java.lang.Double
Double there is!!!
The same kind calculation gives BigDecimal as a result in Scala:
scala.BigDecimal(1.5) * 1.5
BigDecimal = 2.25
public boolean sendMessage() throws Exception { Connection connection = null; InitialContext initialContext = null; try { //Step 1. Create an initial context to perform the JNDI lookup. initialContext = getContext(0); //Step 2. Perfom a lookup on the queue Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue"); //Step 3. Perform a lookup on the Connection Factory ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("/ConnectionFactory"); //Step 4.Create a JMS Connection connection = cf.createConnection(); //Step 5. Create a JMS Session Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //Step 6. Create a JMS Message Producer MessageProducer producer = session.createProducer(queue); //Step 7. Create a Text Message TextMessage message = session.createTextMessage("This is a text message"); System.out.println("Sent message: " + message.getText()); //Step 8. Send the Message producer.send(message); //Step 9. Create a JMS Message Consumer MessageConsumer messageConsumer = session.createConsumer(queue); //Step 10. Start the Connection connection.start(); //Step 11. Receive the message TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000); System.out.println("Received message: " + messageReceived.getText()); return true; } finally { //Step 12. Be sure to close our JMS resources! if (initialContext != null) { initialContext.close(); } if(connection != null) { connection.close(); } } }
from("bean:myBean?methodName=send").to("jms:queue:exampleQueue"); from("jms:queue:exampleQueue").to("bean:myBean?methodName=receive");
package my.app; import org.apache.camel.Processor; import org.apache.camel.Exchange; import org.apache.camel.spring.SpringRouteBuilder; public class MyRouteBuilder extends SpringRouteBuilder { protected void configureImportRoute() { String filesUri = "file:files/payments" + "?initialDelay=3000" + "&delay=1000" + "&useFixedDelay=true" + "&include=.*[.]xml" + "&move=backup/${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.xml" + "&moveFailed=files/${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.xml.error"; from(filesUri).convertBodyTo(MyBean.class).transacted().to("importProcessor"); String executionTriggerUri = "timer:executionTimer" + "?fixedRate=true" + "&daemon=true" + "&delay=3000" + "&period=3000"; from(executionTriggerUri) .pipeline("bean:myDao?method=listItemsForExecution") .to("executioncProcessor"); }
package my.dummy.app; import org.apache.camel.Processor; import org.apache.camel.Exchange; import org.apache.camel.spring.SpringRouteBuilder; public class Route extends SpringRouteBuilder { public void configure() { from("timer:TriggerA?delay=100&period=1").to("A"); from("timer:TriggerB?delay=100&period=1").to("B"); from("timer:TriggerC?delay=100&period=1").to("C"); } }
package my.dummy.app; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.log4j.Logger; import java.util.Random; public class A /*B*/ /*C*/ implements Processor { Random r = new Random(); private static final Logger log = Logger.getLogger(Processor.class); public void process(Exchange exchange) throws Exception { Thread.sleep(r.nextInt(1000)); log.info("processing " + exchange + " in " + getClass().getName()); } }
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelcontext id="importing" xmlns="http://camel.apache.org/schema/spring"> <packagescan> <package>my.dummy.app</package> </packagescan> </camelcontext> <bean class="my.dummy.app.A" id="A"> <bean class="my.dummy.app.B" id="B"> <bean class="my.dummy.app.C" id="C"> </beans>I noticed that there's a DelegateProcessor in Camel that could be used to wrap the real processors. So I can use it to synchronize the routes like this:
package my.dummy.app; import org.apache.log4j.Logger; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; import org.apache.camel.processor.DelegateProcessor; public class RouteSynchronizer extends DelegateProcessor { private Logger log = Logger.getLogger(RouteSynchronizer.class); private final static Object sync = new Object(); public void process(Exchange exchange) throws Exception { synchronized (sync) { log.debug("begin exchange processing by " + Thread.currentThread().getName()); super.process(exchange); try { if (exchange.isFailed()) { throw new RuntimeCamelException(exchange.getException()); } } finally { log.debug("end exchange processing by " + Thread.currentThread().getName()); } } } }
12-08-2009 15:06:01,970 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:02,298 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.B 12-08-2009 15:06:02,313 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:02,313 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:03,032 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.C 12-08-2009 15:06:03,032 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:03,032 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:03,173 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.A 12-08-2009 15:06:03,173 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:03,173 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:03,579 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.B 12-08-2009 15:06:03,579 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:03,579 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:04,251 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.C 12-08-2009 15:06:04,251 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:04,251 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:04,626 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.A 12-08-2009 15:06:04,626 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:04,626 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:05,251 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.B 12-08-2009 15:06:05,251 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:05,251 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:05,688 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.C 12-08-2009 15:06:05,688 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerC?delay=100&period=1 12-08-2009 15:06:05,688 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:05,782 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.A 12-08-2009 15:06:05,782 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerA?delay=100&period=1 12-08-2009 15:06:05,782 DEBUG RouteSynchronizer - begin exchange processing by timer://TriggerB?delay=100&period=1 12-08-2009 15:06:06,298 INFO Processor - processing Exchange[Message: [Body is null]] in ee.hansa.markets.ktp.payments.tmp.B 12-08-2009 15:06:06,298 DEBUG RouteSynchronizer - end exchange processing by timer://TriggerB?delay=100&period=1
from("...").synchronize().to("processorA"); from("...").synchronize().to("processorA");
String uri = "file:files" +
"?initialDelay=3000" +
"&delay=1000" +
"&useFixedDelay=true" +
"&include=.*[.]xml" +
"&move=backup/${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.xml" +
"&moveFailed=files/${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.xml.error";
from(uri).process(someProcessor).to("someBean");