Camel 3.0 - IdeasPage edited by Christian MuellerChanges (4)
Full ContentCamel 3.0 Ideas
Camel is now almost 6 years old and its second revision camel-2.x is more than 4.5 years old already. Camel is extremely mature, used in production by a large number of organizations from small to large and even governments. We feel like we really hit the initial target of simplifying integration. Camel's middleware abstraction api and the eip based routing brought a lot of positive feedback from users. There is however more that could be done to simplify the work of integration developers who need new components (not shipped with camel for licensing - copyleft of commercial - or other reasons) or new integration patterns or algorithms or even new tools. We learned a lot in the past years and benefited from a strong and continuously growing community. It's time to put what we learned to good use and re-engineer your favourite integration framework yet again. The middleware abstractions look pretty solid, and aside from some possible reshuffling we don't expect major changes. As a consequence, most of the components will retain the same general feel. The core will however be rearchitected to become even more pluggable and modular. We will however spare no effort to make a new Camel 3 be as backward compatible as possible and when not possible at least provide a painless migration path. This is a mindmap of ideas for improving Camel 3.0. Fell free to discuss this on the Camel Mailing Lists if you have other ideas or feedback. JDK supportWe should drop support for JDK6, and require JDK7 as minimim version. eg build and compile the release with JDK7. JDK8 Java DSLIt would be good to have a camel-java8-dsl component that offers a JDK8 DSL which uses all the nice new stuff from JDK8 with higher order functions, closures, et all. Clearer Architecture of Camel CoreGoals:
So why should this be important? Currently components depend on camel-core as a whole and there are no further rules which classes the components should use and which classes should be private to core. Even classes from the impl package are needed. So this means that any refactoring we do in camel core could affect all components. As camel is growing steadily this can become quite problematic. Split camel-core into multiple parts (hadrian)(+1: cmueller, hadrian) There are multiple benefits and less constraints. A separate api jar would allow the definition of a 'route container' which is currently one of the roles of the CamelContext. This allows primarily alternative implementations of camel for constrained environments (such as real time systems, for instance). Processors/Routes/Components written against the api could be deployed on any camel implementation (as long as all necessary features are supported).
These should be structured in a way that these big building blocks do not have cyclic dependencies. Any other cycles can be ignored in this step. Allowed depdencies ( "->" means may use, may depend on):
Define scope and rules for camel-core packages (champion?)In extension to the previous paragraph each camel package should have a clear scope that defines what to put in the package and what not. There should be rules that define what dependencies are allowed for classes in a package. The minimum goal is to guarantee that by following the rules dependency cycles can not happen. Additionally the rules should minimize dependencies between packages to achieve loose coupling between packages and high coherence inside a package. More flexible routes at runtime (claus)(+1: hadrian) When routes is added in Camel 2.x architecture, global cross cutting concerns such as error handlers, interceptors, onCompletion etc. is applied when the route is added. We need to separate this and have those applied during routing. The Channel needs to do this and therefore it must be more dynamic than its currently is. And we need to enlist the various global cross cutting concerns by their xxxDefintions in the CamelContext, so we can access them at any time. This allows end users also much more easily to add/remove interceptors, error handlers and whatnot at runtime. And it makes it much easier to add routes generated from JAXB or other sources, as we don't need to prepare or anyhow mold the RouteDefinition given. See ticket CAMEL-3024 for some details. Fix routes with multiple inputs (claus)The current implementation of routes with multiple inputs is to clone the route, which means you essentially got 2+ routes if a route has multiple inputs. However routes with multiple inputs is seldom used. The actual solution will depend on the api refactoring. Route initialization logic for Java DSL and XML DSLs (claus)The Java DSL does its route initialization slightly a bit different than the XML DSLs, due the nature of it, and the fact the fluent builders can do additional logic, which the JAXB model of XML DSLs does not. We should align the initialization logic so Java DSL and XML DSLs does the same thing. They setup the pure model at first. So the configure method in the RouteBuilder should setup the model as the XML DSL would do. Then the prepare route logic which follows could be the same in all cases. This would also allow us to ensure when people use multiple RouteBuilder classes in Java DSL, then context scoped onException, interceptors is applied for all RouteBuilders. Add OnException, Interceptor, etc. to JAXB model for a CamelContextDefinition (claus)Configuring context scoped onException, interceptors etc. is woven into the RouteDefinition as part of the route initialization logic. When we have a dynamic routing engine (see above) that can at runtime support this without the need for woven into the routes. Then we should also ensure the context scoped onException, interceptors etc. is available in a CamelContextDefinition. This ensures the models is always 100% kept as it was provided, and we can fully export the model to XML and other languages (having a supported render). Tighten up route definitions (claus)Currently cross cutting concerns such as error handlers, interceptors, onCompletion etc. can be define anywhere in the route. We should tighten this up and only allow this to be configured in the start of the route. This also ensures when end users use code assistance in their route development, the IDE will not popup a big list which includes these cross cutting concerns. See also next note. (ProcessorDefinition will therefore be trimmed) Message History EIP/Message Store (Christian Ohr)(+1: hadrian) Remove not used componentsWe should consider removing
The BAM has not changed in 5 years, and very seldom used by end users. And neither has the functionality you need. There is much better solutions outside ASF Camel for a BAM solution. Old ideasTo be better defined and moved to the section above or removed Support for asynchronous transactionsWhen using the asynchronous routing engine it would be desirable of transactional context could be propagated to the new threads. With the Asynchronous Routing Engine it would be great if we could support asynchronous transaction as well. See CAMEL-2729 and CAMEL-2902 Stream cachingWe could add support for using HawtDB as the persistent store for streams which overflow to disk store. EIPThe Resequencer EIP currently doesn't support persistence, we could introduce this and let it leverage HawtDB such as we did with the Aggregator2 EIP. Schedule in DSLWe could consider adding DSL syntax sugar for scheduling routes. For example currently you have to use Quartz or a ScheduledPollingConsumer which has the delay option. We could add DSL which has something like: schedule().every(5).minute().pollFrom("xxx").to("yyyy")
OSGi enhancements
Easier commit/rollback for component developersMaybe expose some interface having commit / rollback methods to make it easier for component developers to implement custom logic. Currently they may not know about OnCompletion and how to use UnitOfWork on Exchange to do this today. Unify uri/ref+1: claus, cmueller Instead of having both uri and ref for endpoints, we should unify this and only use uri. If people want to use ref, then they can do that using "ref:xx" as an uri. This would simplify code as we dont have to check for either one. remove the xxxRef options+1: claus, cmueller In favor of the xxx option, we should remove the duplicated xxxRef options from our components. This make our code and documentation more lean. We should deprecate it as soon as possible and remove it in Camel 3.0. Less Spring dependenciesDONE in Camel 2.9 In camel-core we use the Spring JMX annotations to more easily enlist our MBeans. We should move that logic to camel-spring. And introduce a Camel specific annotations to replace those. For example ActiveMQ does that. This allows us to use camel-core with JMX without any spring JARs at all. End users can still use the Spring JMX annotations in their custom code / components. They just need camel-spring on the classpath. Likewise we should move the ResourceEndpoint from camel-spring to camel-core. This ensures that resource loading on classpath works with Camel as we can leverage the ClassResolver. For example OSGi blueprint does not work with the Spring ResourceEndpoint. Also this ensures the components that uses ResourceEndpoint will no longer be dependent on Spring. Then we are down to have Spring JAR dependency in: camel-jms and camel-mail. Introduce Camel JMX annotationsDONE in Camel 2.9 See above about less Spring dependency. Refactor UnitOfWorkThe implementation of DefaultUnitOfWork seems to have transformed itself into a to broad concern where unit of work is doing a bit more work than the transactional aspect that ties to its name. This is also needed by the refactor of the Message History EIP. Improvements to ThreadPoolProfile for thread managementWe could move ThreadPoolProfile from org.apache.camel.spi to org.apache.camel and have it in the root package. Tighten up onExceptionWe should consider tighten up the onException DSL a bit, for example to make it more clear that if you have processing steps in there, they only occur after the message has been exhausted. So maybe we need to have a onExhausted to make this clear onException(IOException.class).maximumRedeliveries(3) .onExhausted().handled(true).to("log:ignoreMe"); So in this example its only after the 3 failed redeliveries, then its exhausted, and then we handle the message and route it to a log where we ignore the message. Also currently you can do this:
onException(IOException.class).maximumRedeliveries(3)
.handled(true);
Which will handle the message and after this let the error handler deal with the message. See CAMEL-5059. Likewise there has been ideas to move onRedeliverRef to <redeliveryPolicy> as currently its to be configured outside the policy. Add composite EIP to compose a number of EIPs into a single EIPIt would be nice if we have a DSL to compose a number of child EIPs into a single EIP itself. eg a bit like <pipeline>. This would allow people to make it easier to group together a number of EIPs into a single "unit". This allows for example the error handler to redeliver to the composite EIP instead of at the point of failure within the group. There are use-cases where people want to do that. And today the solution is to split this into a new route, which you then disable error handler by setting it to no error handler. And then call the route using the direct endpoint. So instead if you could do <composite> ... stuff goes here </composite> then that would be neater, as you dont have to split into multiple routes. I think there is an old JIRA ticket created about this a long time ago.
Change Notification Preferences
View Online
|
View Changes
|
Add Comment
|
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence
- [CONF] Apache Camel > Camel 3.0 - Ideas confluence