24 Aralık 2020 Perşembe

Camel Exchange Kavramı

Giriş
Exchange kavramına başlamadan önce Header ve Property kavramını bilmek gerekir.

1. Header
- header("headername") şeklinde erişiriz.

Örnek
"localhost:8080/hello?name=john" şeklindeki istekte name header içinde. header("name") şeklinde erişiriz.

Örnek - header'ın varlığına göre işlem
Şöyle yaparız. Burada when() içinde exchange varlığı kontrol ediliyor. Eğer yoksa otherwise() içinde başka bir işlem yapılıyor
@Component
public class Router extends RouteBuilder {
  private static final String NAME_TAG = "name";
  @Override
  public void configure() throws Exception {
    restConfiguration()
      .bindingMode(RestBindingMode.json);
    rest("hello")
      .get()
      .route()
       .choice()
        .when(isNull(header(NAME_TAG)))
          .setProperty(NAME_TAG, constant("world"))
        .otherwise()
          .setProperty(NAME_TAG, header(NAME_TAG))
        .end()
        .setBody(simple(String.format("Hello, ${property.%s}!", NAME_TAG)));
  }
}
Örnek - header değerine erişme
Eğer header değerinin olduğundan eminsek kontrol etmeksizin şöyle yaparız
@Component
public class Soap2Rest extends RouteBuilder{

  @Override
  public void configure() throws Exception {

    from("direct:celsius-to-fahrenheit")
      .removeHeaders("CamelHttp*")
      .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
          Double.valueOf(exchange.getIn().getHeader("num"));
          ...
        }
      })
      ...
  }
}
2. Property
Açıklaması şöyle
For now, let’s just say properties are values that, unlike headers, live throughout the entire course of the application.
- setProperty("propertyname",propertyvalue) şeklinde değer atarız
- String.format("${property.%s}!", "propertyname") şeklinde değerine erişiriz

3. Exchange
Route'lar arasında dolaşırlar
- Header ve Body alanlarına sahiptir. Açıklaması şöyle
Headers and bodies are volatile, and they are saved in two different Messages or parts of the Exchange: IN (incoming information) and OUT (outgoing information). We call them volatile because they don’t live throughout the entire course of the application, but rather die after reaching an endpoint or processing information from the exchange.
Processor'lar Exchange'lere erişir. 

Örnek - header atama
Şöyle yaparız
@Component
public class MomentOfDayProcessor implements Processor {
  @Override
  public void process(Exchange exchange) throws Exception {
    String momentOfDay = "...";
    exchange.getOut().setHeader("momentOfDay", momentOfDay);
  }
}
Örnek - body atama
Şöyle yaparız
@Component
public class WeatherAdviserProcessor implements Processor {
  @Override
  public void process(Exchange exchange) throws Exception {
    WeatherResponse weatherResponse = exchange.getIn().getBody(WeatherResponse.class);
    ...
    String advice = "...";
    exchange.getOut().setBody(advice);
  }
}
Örnek - body atama
Şöyle yaparız. Burada getOut().setBody() yerine getMessage().setBody() kullanılıyor.
public class HelloWorldProcessor implements Processor {

  @Override
  public void process(Exchange exchange) throws Exception {
    Map<String, Object> result = new HashMap<>();
    result.put("message", "Hello world");
    exchange.getMessage().setBody(result);
  }
}
Açıklaması şöyle
If using InOnly MEP, methods getIn() and getMessage() returns the same instance of Message.

The logic of getMesage() is simple. If exchange have associated out message, return out. Otherwise return in.

In most cases there will be no out message associated with Exchange. In Apache Camel 3 is getOut() deprecated, reserved for edge cases and internal use for component developers. End users are encouraged to prefer getMessage() instead of getIn() and getOut().


Hiç yorum yok:

Yorum Gönder