--- apiVersion: v1 kind: List items: - apiVersion: v1 kind: ConfigMap metadata: labels: funktion.fabric8.io/kind: Connector provider: fabric8 project: connector-grape version: 1.1.23 group: io.fabric8.funktion.connector name: grape data: deployment.yml: | --- apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: funktion.fabric8.io/kind: Subscription connector: grape spec: replicas: 1 template: metadata: labels: funktion.fabric8.io/kind: Subscription connector: grape spec: containers: - image: fabric8/connector-grape:1.1.23 name: connector schema.yml: | --- component: kind: component scheme: grape syntax: grape:defaultCoordinates title: Grape description: Grape component allows you to fetch, load and manage additional jars when CamelContext is running. label: management,deployment producerOnly: true javaType: org.apache.camel.component.grape.GrapeEndpoint groupId: org.apache.camel artifactId: camel-grape version: 2.18.1 componentProperties: {} properties: defaultCoordinates: kind: path required: true type: string javaType: java.lang.String deprecated: false description: Maven coordinates to use as default to grab if the message body is empty. exchangePattern: kind: parameter type: string javaType: org.apache.camel.ExchangePattern enum: - InOnly - RobustInOnly - InOut - InOptionalOut - OutOnly - RobustOutOnly - OutIn - OutOptionalIn deprecated: false defaultValue: InOnly description: Sets the default exchange pattern when creating an exchange. synchronous: kind: parameter type: boolean javaType: boolean deprecated: false defaultValue: false description: Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported). documentation.adoc: |+ [[Grape-GrapeComponent]] Grape Component ~~~~~~~~~~~~~~~ Available as of Camel 2.16?? http://docs.groovy-lang.org/latest/html/documentation/grape.html[Grape] component allows you to fetch, load and manage additional jars when `CamelContext` is running. In practice with Camel Grape component you can add new components, data formats and beans to your `CamelContext` without the restart of the router. [[Grape-Options]] Grape options ^^^^^^^^^^^^^ // component options: START The Grape component has no options. // component options: END // endpoint options: START The Grape component supports 3 endpoint options which are listed below: {% raw %} [width="100%",cols="2,1,1m,1m,5",options="header"] |======================================================================= | Name | Group | Default | Java Type | Description | defaultCoordinates | | | String | *Required* Maven coordinates to use as default to grab if the message body is empty. | exchangePattern | | InOnly | ExchangePattern | Sets the default exchange pattern when creating an exchange. | synchronous | | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported). |======================================================================= {% endraw %} // endpoint options: END [[Grape-Settingupclassloader]] Setting up class loader ^^^^^^^^^^^^^^^^^^^^^^^ Grape requires using Groovy class loader with the `CamelContext`. You can enable Groovy class loading on the existing Camel Context using the `GrapeComponent#grapeCamelContext()` method: [source,java] -------------------------------------------------------------------------------- import static org.apache.camel.component.grape.GrapeComponent.grapeCamelContext; ... CamelContext camelContext = grapeCamelContext(new DefaultCamelContext()); -------------------------------------------------------------------------------- You can also set up the Groovy class loader used be Camel context by yourself: [source,java] ------------------------------------------------------------------------------------ camelContext.setApplicationContextClassLoader(new GroovyClassLoader(myClassLoader)); ------------------------------------------------------------------------------------ [[Grape-URIformat]] URI format ^^^^^^^^^^ Grape component supports only producer endpoints. [source,java] ----------------------------- grape:defaultMavenCoordinates ----------------------------- For example the following snippet loads Camel FTP component: [source,java] ------------------------------------------------ from("direct:loadCamelFTP"). to("grape:org.apache.camel/camel-ftp/2.15.2"); ------------------------------------------------ You can also specify the Maven coordinates by sending them to the endpoint as the exchange body: [source,java] ---------------------------------------------------------- from("direct:loadCamelFTP"). setBody().constant("org.apache.camel/camel-ftp/2.15.2"). to("grape:defaultMavenCoordinates"); ---------------------------------------------------------- [[Grape-AddingtheGrapecomponenttotheproject]] Adding the Grape component to the project ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Maven users will need to add the following dependency to their `pom.xml` for this component: [source,xml] ------------------------------------------------------------ org.apache.camel camel-grape x.y.z ------------------------------------------------------------ [[Grape-Defaultpayloadtype]] Default payload type ^^^^^^^^^^^^^^^^^^^^ By default Camel Grape component operates on the String payloads: [source,java] ------------------------------------------------------------------------------------------------ producerTemplate.sendBody("grape:defaultMavenCoordinates", "org.apache.camel/camel-ftp/2.15.2"); ------------------------------------------------------------------------------------------------ But of course Camel build-in??link:type-converter.html[type conversion API] can perform the automatic data type transformations for you. In the example below Camel automatically converts binary payload into the String: ?? [source,java] ----------------------------------------------------------------------------------------------------------- producerTemplate.sendBody("grape:defaultMavenCoordinates", "org.apache.camel/camel-ftp/2.15.2".getBytes()); ----------------------------------------------------------------------------------------------------------- [[Grape-Headers]] Headers ^^^^^^^ The following headers are recognized by the Grape component: [width="100%",cols="10%,10%,10%,10%,60%",options="header",] |======================================================================= |Header |Java constant |Endpoint type |Value type |Description |`CamelGrapeCommand` |`GrapeConstants.GRAPE_COMMAND` |Producer |`org.apache.camel.component.grape.GrapeCommand` |The command to be performed by the Grape endpoint. Default to `grab`. |======================================================================= [[Grape-Loadingcomponentsatruntime]] Loading components at runtime ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to load the new component at the router runtime, just grab the jar containing the given component: [source,java] ------------------------------------------------------------------------- ProducerTemplate template = camelContext.createProducerTemplate(); template.sendBody("grape:grape", "org.apache.camel/camel-stream/2.15.2"); template.sendBody("stream:out", "msg"); ------------------------------------------------------------------------- [[Grape-Loadingprocessorsbeanatruntime]] Loading processors??bean??at runtime ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to load the new processor??bean ??with your custom business login at the router runtime, just grab the jar containing the required bean: [source,java] ----------------------------------------------------------------------------------------------------------------- ProducerTemplate template = camelContext.createProducerTemplate(); template.sendBody("grape:grape", "com.example/my-business-processors/1.0"); int productId = 1; int price = template.requestBody("bean:com.example.PricingBean?method=currentProductPrice", productId, int.class) ----------------------------------------------------------------------------------------------------------------- ?? [[Grape-LoadingdeployedjarsafterCamelcontextrestart]] Loading deployed jars after Camel context restart ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ After you download new jar, you usually would like to have it loaded by the Camel again after the restart of the `CamelContext`. It is certainly possible, as Grape component keeps track of the jar files you have installed. In order to load again the installed jars on the context startup, use the??`GrapeEndpoint.loadPatches()`??method in your route:?? ?? [source,java] ------------------------------------------------------------------------- import static org.apache.camel.component.grape.GrapeEndpoint.loadPatches; ...?? camelContext.addRoutes( new RouteBuilder() {?? @Override?? public void configure() throws Exception {?? loadPatches(camelContext); ?? from("direct:loadCamelFTP"). to("grape:org.apache.camel/camel-ftp/2.15.2");?? } }); ------------------------------------------------------------------------- ?? [[Grape-Managingtheinstalledjars]] Managing the installed jars ^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you would like to check what jars have been installed into the given `CamelContext`, send message to the grape endpoint with the??`CamelGrapeCommand` header set to `GrapeCommand.listPatches`: [source,java] ---------------------------------------------------------------------------------------- from("netty-http4:http://0.0.0.0:80/patches"). setHeader(GrapeConstats.GRAPE_COMMAND, constant(CamelGrapeCommand.listPatches)). to("grape:list");?? ---------------------------------------------------------------------------------------- Connecting the to the route defined above using the HTTP client returns the list of the jars installed by Grape component: [source,java] --------------------------------------- $ curl http://my-router.com/patches grape:org.apache.camel/camel-ftp/2.15.2 grape:org.apache.camel/camel-jms/2.15.2 --------------------------------------- If you would like to remove the installed jars, so these won't be loaded again after the context restart, use the??`GrapeCommand.``clearPatches` command: [source,java] ----------------------------------------------------------------------------------------- from("netty-http4:http://0.0.0.0:80/patches"). setHeader(GrapeConstats.GRAPE_COMMAND, constant(CamelGrapeCommand.clearPatches)). setBody().constant("Installed patches have been deleted.");?? ----------------------------------------------------------------------------------------- [[Grape-SeeAlso]] See Also ^^^^^^^^ * link:configuring-camel.html[Configuring Camel] * link:component.html[Component] * link:endpoint.html[Endpoint] * link:getting-started.html[Getting Started]