= Direct VM Component
:doctitle: Direct VM
:shortname: direct-vm
:artifactid: camel-directvm
:description: Call another endpoint from any Camel Context in the same JVM synchronously.
:since: 2.10
:supportlevel: Stable
:component-header: Both producer and consumer are supported
:core:
//Manually maintained attributes
:camel-spring-boot-name: directvm

*Since Camel {since}*

*{component-header}*

The Direct-Vm component provides direct, synchronous invocation of
any consumers in the JVM when a producer sends a message exchange. +
 This endpoint can be used to connect existing routes in the same camel
context, as well from other camel contexts in the *same* JVM.

This component differs from the xref:direct-component.adoc[Direct] component in
that xref:direct-vm-component.adoc[Direct-VM] supports communication across
CamelContext instances - so you can use this mechanism to communicate
across web applications (provided that camel-core.jar is on the
system/boot classpath).

At runtime you can swap in new consumers, by stopping the existing
consumer(s) and start new consumers. +
 But at any given time there can be at most only one active consumer for
a given endpoint.

This component allows also to connect routes deployed in different OSGI
Bundles as you can see here after. Even if they are running in different
bundles, the camel routes will use +
 the same thread. That autorises to develop applications using
Transactions - Tx.

image::camel-direct-vm.png[image]

== URI format

----
direct-vm:someName
----

Where *someName* can be any string to uniquely identify the endpoint


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


== Samples

In the route below we use the direct component to link the two routes
together:

[source,java]
----
from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("direct-vm:processOrder");
----

And now in another CamelContext, such as another OSGi bundle

[source,java]
----
from("direct-vm:processOrder")
    .to("bean:orderService?method=process")
    .to("activemq:queue:order.out");
----

And the sample using XML DSL:

[source,xml]
----
<route>
 <from uri="activemq:queue:order.in"/>
 <to uri="bean:orderService?method=validate"/>
 <to uri="direct-vm:processOrder"/>
</route>

<route>
 <from uri="direct-vm:processOrder"/>
 <to uri="bean:orderService?method=process"/>
 <to uri="activemq:queue:order.out"/>
</route>
----



include::spring-boot:partial$starter.adoc[]
