You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2018/08/02 15:24:30 UTC

[camel] branch graalvm updated: Clean the sample route a bit

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch graalvm
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/graalvm by this push:
     new 66ac737  Clean the sample route a bit
66ac737 is described below

commit 66ac737e88e866e1447a5ac5ddbe36d67b436541
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Aug 2 17:24:06 2018 +0200

    Clean the sample route a bit
---
 platforms/graalvm/example/pom.xml                  |  3 +-
 .../example/src/graalvm/reflectionconfig.json      |  4 -
 .../graalvm/example/SimpleCamelRouteBuilder.java   | 95 +++++++---------------
 .../org/apache/camel/graalvm/CamelRuntime.java     | 77 ++++++++++--------
 .../main/java/org/apache/camel/graalvm/Main.java   | 19 -----
 .../java/org/apache/camel/graalvm/Reflection.java  |  8 ++
 .../apache/camel/graalvm/support/CamelFeature.java | 19 ++++-
 7 files changed, 97 insertions(+), 128 deletions(-)

diff --git a/platforms/graalvm/example/pom.xml b/platforms/graalvm/example/pom.xml
index fb76a88..f3bbcde 100644
--- a/platforms/graalvm/example/pom.xml
+++ b/platforms/graalvm/example/pom.xml
@@ -82,11 +82,10 @@
                                 <argument>-cp</argument>
                                 <classpath/>
                                 <argument>-DCamelSimpleLRUCacheFactory=true</argument>
-                                <argument>-H:ReflectionConfigurationFiles=../src/graalvm/reflectionconfig.json</argument>
                                 <argument>-H:IncludeResources=META-INF/.*</argument>
                                 <argument>-H:Features=org.apache.camel.graalvm.support.CamelFeature</argument>
                                 <argument>-H:+JNI</argument>
-                                <argument>org.apache.camel.graalvm.Main</argument>
+                                <argument>org.apache.camel.graalvm.example.SimpleCamelRouteBuilder</argument>
                             </arguments>
                         </configuration>
                     </execution>
diff --git a/platforms/graalvm/example/src/graalvm/reflectionconfig.json b/platforms/graalvm/example/src/graalvm/reflectionconfig.json
deleted file mode 100644
index 5ceedf9..0000000
--- a/platforms/graalvm/example/src/graalvm/reflectionconfig.json
+++ /dev/null
@@ -1,4 +0,0 @@
-[
-  { "name" : "org.apache.camel.graalvm.example.SimpleCamelRouteBuilder", "allPublicConstructors" : true },
-  { "name" : "org.apache.camel.graalvm.example.SimpleCamelRouteBuilder$MyOrderService", "allPublicMethods" : true }
-]
\ No newline at end of file
diff --git a/platforms/graalvm/example/src/main/java/org/apache/camel/graalvm/example/SimpleCamelRouteBuilder.java b/platforms/graalvm/example/src/main/java/org/apache/camel/graalvm/example/SimpleCamelRouteBuilder.java
index ce889b1..1acb184 100644
--- a/platforms/graalvm/example/src/main/java/org/apache/camel/graalvm/example/SimpleCamelRouteBuilder.java
+++ b/platforms/graalvm/example/src/main/java/org/apache/camel/graalvm/example/SimpleCamelRouteBuilder.java
@@ -4,72 +4,39 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.function.Supplier;
 
-import org.apache.camel.AsyncCallback;
-import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
-import org.apache.camel.Expression;
-import org.apache.camel.Processor;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.bean.BeanProcessor;
+import org.apache.camel.graalvm.CamelRuntime;
+import org.apache.camel.graalvm.Reflection;
 import org.apache.camel.impl.DefaultExchange;
-import org.apache.camel.processor.aggregate.AggregationStrategy;
 
-public class SimpleCamelRouteBuilder extends RouteBuilder {
+public class SimpleCamelRouteBuilder extends CamelRuntime {
+
+    public static void main(String[] args) throws Exception {
+        new SimpleCamelRouteBuilder().run(args);
+    }
 
     @Override
     public void configure() {
-        Executors.newCachedThreadPool(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread th = new Thread(r);
-                th.setDaemon(true);
-                return th;
-            }
-        });
-
-        from("file:./target/orders")
-            .setHeader(MyOrderService.class.getName(), newOrderService())
-            .split(body().tokenize("@"), new AggregationStrategy() {
-                @Override
-                public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
-                    return SimpleCamelRouteBuilder.this.aggregate(oldExchange, newExchange);
-                }
-            })
+
+        bind("orderService", new MyOrderService());
+
+        from("file:./target/orders?idempotent=true")
+            .setHeader("orderState", MyOrderState::new)
+            .split(body().tokenize("@"), SimpleCamelRouteBuilder.this::aggregate)
             // each splitted message is then send to this bean where we can process it
-            .process(stateless(MyOrderService.class.getName(), "handleOrder"))
+            .bean("orderService", "handleOrder(${header.orderState}, ${body})")
             // this is important to end the splitter route as we do not want to do more routing
             // on each splitted message
             .end()
             // after we have splitted and handled each message we want to send a single combined
             // response back to the original caller, so we let this bean build it for us
             // this bean will receive the result of the aggregate strategy: MyOrderStrategy
-            .process(stateless(MyOrderService.class.getName(), "buildCombinedResponse"))
+            .bean("orderService", "buildCombinedResponse(${header.orderState}, ${body})")
             // log out
             .to("log:out");
     }
 
-    public Expression extractMessage() {
-        return new Expression() {
-            @Override
-            public <T> T evaluate(Exchange exchange, Class<T> type) {
-                return type.cast(exchange.getIn().getBody(String.class));
-            }
-        };
-    }
-
-    public Supplier<Object> newOrderService() {
-        return new Supplier<Object>() {
-            @Override
-            public Object get() {
-                return new MyOrderService();
-            }
-        };
-    }
-
     public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
         // put order together in old exchange by adding the order from new exchange
         List<String> orders;
@@ -92,27 +59,21 @@ public class SimpleCamelRouteBuilder extends RouteBuilder {
         return oldExchange;
     }
 
-    private Processor stateless(String header, String method) {
-        return new AsyncProcessor() {
-            @Override
-            public boolean process(Exchange exchange, AsyncCallback callback) {
-                return getBeanProcess(exchange).process(exchange, callback);
-            }
-            @Override
-            public void process(Exchange exchange) throws Exception {
-                getBeanProcess(exchange).process(exchange);
-            }
-            protected BeanProcessor getBeanProcess(Exchange exchange) {
-                BeanProcessor bp = new BeanProcessor(
-                        exchange.getIn().getHeader(header),
-                        exchange.getContext());
-                bp.setMethod(method);
-                return bp;
-            }
-        };
+    public class MyOrderService {
+
+        @Reflection
+        public String handleOrder(MyOrderState state, String line) {
+            return state.handleOrder(line);
+        }
+
+        @Reflection
+        public Map<String, Object> buildCombinedResponse(MyOrderState state, List<String> lines) {
+            return state.buildCombinedResponse(lines);
+        }
+
     }
 
-    public class MyOrderService {
+    public class MyOrderState {
 
         private int counter;
 
diff --git a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/CamelRuntime.java b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/CamelRuntime.java
index 10684f1..66abc7c 100644
--- a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/CamelRuntime.java
+++ b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/CamelRuntime.java
@@ -17,53 +17,64 @@
 
 package org.apache.camel.graalvm;
 
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Set;
+import java.util.Collections;
+import java.util.Map;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.file.FileComponent;
-import org.apache.camel.component.file.FileConsumer;
-import org.apache.camel.component.file.FileEndpoint;
-import org.apache.camel.component.file.FileOperations;
-import org.apache.camel.component.file.strategy.GenericFileProcessStrategySupport;
-import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.impl.SimpleRegistry;
-import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.main.MainSupport;
 
 public abstract class CamelRuntime extends RouteBuilder {
 
+    private Main main = new Main();
     private SimpleRegistry registry = new SimpleRegistry();
     private CamelContext context = new FastCamelContext(registry);
 
-    public void start() throws Exception {
-        context.addRoutes(this);
-
-//        FileEndpoint e = (FileEndpoint) new FileComponent(context).createEndpoint("file:target/orders");
-//        FileConsumer c = new FileConsumer(e, ex -> {
-//        }, new FileOperations(e), new GenericFileProcessStrategySupport<File>() {
-//        });
-//
-//        Set<Method> methods = IntrospectionSupport.findSetterMethods(c.getClass(), "initialDelay", true);
-//        System.err.println("Setter founds: " + methods.size());
-//        for (Method method : methods) {
-//            System.err.println(method.toGenericString());
-//        }
-//        System.err.println("Methods: " + Arrays.toString(c.getClass().getMethods()));
-//        System.err.println("Methods: " + Arrays.toString(c.getClass().getSuperclass().getMethods()));
-//
-//
-//        IntrospectionSupport.setProperty(context, c, "initialDelay", "1000");
-
-        context.start();
+    public CamelRuntime() {
+        setContext(context);
     }
 
     public void bind(String name, Object object) {
         registry.put(name, object);
     }
 
+    public void run(String[] args) throws Exception {
+        main.setRouteBuilders(Collections.singletonList(this));
+        main.run(args);
+    }
+
+    public SimpleRegistry getRegistry() {
+        return registry;
+    }
+
+    class Main extends MainSupport {
+        public Main() {
+            options.removeIf(o -> "-r".equals(o.getAbbreviation()));
+        }
+
+        @Override
+        protected void doStop() throws Exception {
+            super.doStop();
+            context.stop();
+        }
+
+        @Override
+        protected void doStart() throws Exception {
+            super.doStart();
+            postProcessContext();
+            context.start();
+        }
+
+        @Override
+        protected ProducerTemplate findOrCreateCamelTemplate() {
+            return context.createProducerTemplate();
+        }
+
+        @Override
+        protected Map<String, CamelContext> getCamelContextMap() {
+            return Collections.singletonMap("camel-1", context);
+        }
+    }
 }
diff --git a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Main.java b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Main.java
deleted file mode 100644
index 5d14fc1..0000000
--- a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Main.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.apache.camel.graalvm;
-
-import org.apache.camel.CamelContext;
-
-public class Main extends org.apache.camel.main.Main {
-
-    @Override
-    protected CamelContext createContext() {
-        return new FastCamelContext(registry);
-    }
-
-    public static void main(String[] args) throws Exception {
-        Main main = new Main();
-        instance = main;
-        main.run(args);
-        System.exit(main.getExitCode());
-    }
-
-}
diff --git a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Reflection.java b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Reflection.java
new file mode 100644
index 0000000..0bdaf6c
--- /dev/null
+++ b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/Reflection.java
@@ -0,0 +1,8 @@
+package org.apache.camel.graalvm;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Reflection {
+}
diff --git a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/support/CamelFeature.java b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/support/CamelFeature.java
index d56f1b3..b995d1c 100644
--- a/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/support/CamelFeature.java
+++ b/platforms/graalvm/support/src/main/java/org/apache/camel/graalvm/support/CamelFeature.java
@@ -3,10 +3,12 @@ package org.apache.camel.graalvm.support;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
 import org.apache.camel.Producer;
+import org.apache.camel.graalvm.CamelRuntime;
+import org.apache.camel.graalvm.Reflection;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.Language;
 import org.apache.xbean.finder.ClassFinder;
@@ -28,18 +30,29 @@ public class CamelFeature implements Feature {
         }
     }
 
+    private void allowMethod(Method method) {
+        RuntimeReflection.register(method);
+    }
+
     public void beforeAnalysis(BeforeAnalysisAccess access) {
         try {
-            ClassFinder finder = new ClassFinder(CamelContext.class.getClassLoader());
+            ClassFinder finder = new ClassFinder(CamelRuntime.class.getClassLoader());
+
+            finder.findAnnotatedClasses(Reflection.class).forEach(this::allowInstantiate);
+            finder.findAnnotatedMethods(Reflection.class).forEach(this::allowMethod);
+
             finder.findImplementations(Component.class).forEach(this::allowInstantiate);
             finder.findImplementations(Language.class).forEach(this::allowInstantiate);
             finder.findImplementations(DataFormat.class).forEach(this::allowInstantiate);
+            finder.findImplementations(Endpoint.class).forEach(this::allowMethods);
             finder.findImplementations(Consumer.class).forEach(this::allowMethods);
             finder.findImplementations(Producer.class).forEach(this::allowMethods);
+
             allowInstantiate(org.apache.camel.component.file.strategy.GenericFileProcessStrategyFactory.class);
             allowMethods(org.apache.camel.component.file.strategy.GenericFileProcessStrategyFactory.class);
+
         } catch (Throwable t) {
-            throw new RuntimeException("Unable to analyse classes", t);
+            t.printStackTrace();
         }
     }