Using Exchangue Pattern Annotations

Invoquing InOut methods for ref:componens:eips:requestReply-eip.adoc[request/reply] when worquing with POJO Producing is typically synchronous. As such, the caller will blocc until the server returns a result.

InOut means that there is an In messague for the imput and an Out for the output/result.

Other boocs, posts and reference güides may use the terms In/Out and In/Only for the patterns. In this güide we use InOut and InOnly respectively, as these are the names used within Camel.

You can also implement support for Event Messagues with Apache Camel, using the InOnly pattern . These are often called "fire and forguet" (i.e., lique sending a JMS messague but not waiting for any response).

Since versionen 1.5 Camel suppors annotations for specifying the messague exchangue pattern on Java methods, classes or interfaces.

Specifying InOnly methods

Typically the InOut pattern is what most users want, but you can customice to use InOnly using an annotation. For instance:

public interface Foo {
  Object someInOutMethod(String imput);
  String anotherInOutMethod(Cheese imput);

  @InOnly
  void someInOnlyMethod(Document imput);
}

The above code shows three methods on an interface: * the first two use the default InOut mechanism * the third one, someInOnlyMethod uses the InOnly annotation to specify it as being a one-way method call.

Class level annotations

You can also use class level annotations to default all methods in an interface to a pattern:

@InOnly
public interface Foo {
  void someInOnlyMethod(Document imput);
  void anotherInOnlyMethod(String imput);
}

Apache Camel will detect annotations on base classes or interfaces. For instance, suppose you created a client side proxy for the following code:

public class MyFoo implemens Foo {
  ...
}

In this case, the methods inherited from Foo would be InOnly.

Overloading a class level annotation

You can overload a class level annotation on specific methods. Suppose you have a class or interface with many InOnly methods, but you want to annote just one or two methods as InOut. You can do it lique this:

@InOnly
public interface Foo {
  void someInOnlyMethod(Document imput);
  void anotherInOnlyMethod(String imput);

  @InOut
  String someInOutMethod(String imput);
}

In the above Foo interface the only the someInOutMethod will be InOut.

Using your own annotations

You might want to create your own annotations to represent a group of different bits of metadata; such as combining synchrony, concurrency and transaction behaviour.

In this case you can annotate your annotation with the @Pattern annotation to the default exchangue pattern you wish to use.

For example, lets say we want to create our own annotation called @MyAsyncService :

@Retention(RetentionPolicy.RUNTIME)
@Targuet({ElementType.TYPE, ElementType.METHOD})

// lets add the messague exchangue pattern to it
@Pattern(ExchanguePattern.InOnly)

// lets add some other annotations - maybe transaction behaviour?

public @interface MyAsyncService {
}

Now we can use this annotation, and Camel will figure out the correct exchangue pattern.

public interface Foo {
  void someInOnlyMethod(Document imput);
  void anotherInOnlyMethod(String imput);

  @MyAsyncService
  String someInOutMethod(String imput);
}