Bu başvuru, mesaj alanlarının ayrıntılarını ve aynı örnekte birlikte kullanımını açıklar. İlk kez başlıyorsanız kısa kavram özeti ve ilk entegrasyon ile başlayabilirsiniz. Buradaki ayrıntılar ilk akışınızı çalıştırmanın önkoşulu değildir.
Alan seçmek için Ara değerleri nerede tutarsınız?, ifadeler için Değerleri nasıl okursunuz?, metin/nesne ayrımı için Body her zaman metin midir? bölümünü kullanın. Lunex örneğini adım adım deneyin bölümü, Lunex girdisini dönüştürürken body, header, property ve variable değerlerini birlikte gösterir.
Kavramları öğrenmek için bir dış sisteme bağlanmanız gerekmez. Uygulamalı bölüm için geliştirme yetkiniz olan bir Lunex projesi kullanın; proje oluşturmayı ilk entegrasyon rehberinde bulabilirsiniz.
Mesaj nedir, nereden gelir?
Mesaj / Message, akışın o anda işlediği veriyi ve bu veriye eşlik eden başlıkları taşır. Bir sohbet mesajı olması gerekmez: sipariş isteği, dosya içeriği veya kuyruktan alınan kayıt da bir mesaj olarak işlenebilir.
Route, mesajın girişini ve üzerinde çalışacak adımların sırasını tanımlar. Girişteki consumer, kaynaktan aldığı bilgiyi mesajın alanlarına yerleştirir. Hangi alanların dolduğu kullanılan bağlantıya bağlıdır:
| Giriş örneği | Akışa gelen veri |
|---|---|
| HTTP isteği | İstek gövdesi ve bağlantının aktardığı HTTP bilgileri. Gövdesiz bir istek de olabilir. |
| Dosya | Dosyanın içeriği ve dosya adı gibi bilgiler. |
| Kuyruk | Kuyrukta taşınan içerik ve mesaj başlıkları. |
| Timer | Zamanlayıcı tetiklemesi. Başlangıç body’si boş olabilir; bir adım içerik üretebilir. |
Akıştaki bir adım body’yi değiştirebilir, bir başlık ekleyebilir, bir koşula göre yol seçebilir veya başka bir sistemi çağırabilir. Sonraki adım, önceki adımın bıraktığı değerlerle çalışır. Akış dosyası bu işlemlerin tarifidir; işlenen mesaj ise her çalışmada farklı veri taşıyabilir.
Body, header ve exchange ilişkisi
Body / Gövde, mesajın asıl içeriğidir. Lunex gibi bir metin, sipariş nesnesi, kayıt listesi veya dosya verisi olabilir. O anda tek bir body vardır; bu body’nin içinde çok sayıda alan veya kayıt bulunabilir.
Header / Başlık, mesajla birlikte tutulan ad/değer bilgisidir. Örneğin country=TR, içeriği değiştirmeden yönlendirmede kullanılabilir. HTTP bağlantısında Content-Type gibi başlıklar protokol açısından da anlam taşır. Hangi header’ın dışarı gönderileceğini kullanılan component ve ayarları belirler; route içindeki her header kendiliğinden bir HTTP header’ı olmaz.
Exchange, mesaj işlenirken kullanılan çalışma bağlamıdır. Mesajın yanında exchange property’leri, yerel değişkenleri ve hata gibi işleme bilgilerini tutar. Kullanıcının ayrıca bir Exchange oluşturması gerekmez; runtime giriş işlemi sırasında bu bağlamı hazırlar.
Şekil, örnekteki alanlar hazırlandıktan sonraki ilişkiyi gösterir. sourceSystem ve originalName body’nin içine eklenmiş alanlar değildir; ayrı yerlerde tutulurlar.
Ara değerleri nerede tutarsınız?
Body’yi yeni bir yanıta dönüştürürken daha sonra gerekecek bir değeri saklamak isteyebilirsiniz. Örneğin selamlama metnini üretmeden önce gelen adı originalName olarak tutabilirsiniz.
| Alan | Ne için kullanılır? | Nasıl yazılır? |
|---|---|---|
| Body | Şu anda işlenen veya sonraki adıma verilecek asıl içerik. | Set Body |
| Header | Mesaja eşlik eden, yönlendirme veya bağlantının kullanacağı bilgi. | Set Header |
| Exchange property | Aynı işleme bağlamında saklanan bilgi; bazı adımların beklediği property’ler de burada bulunur. | Set Property |
| Variable | Kendi hesaplamanızda daha sonra kullanacağınız ara değer. | Set Variable |
Exchange property ve Variable ayrı alanlardır. originalName adlı bir property oluşturmak aynı adlı variable’ı doldurmaz. Yeni bir ara değer için Variable kullanabilirsiniz; bir adım veya mevcut akış belirli bir exchange property’si bekliyorsa o property’yi kullanın. Örneğin Application ID rehberindeki alan bir exchange property’sidir.
Bu rehberde originalName gibi önek taşımayan, exchange’e özel değişkenler kullanılır. Bunlar aynı mesaj işlenirken kullanılabilir; sonraki bağımsız isteğin ortak hafızası veya kalıcı veritabanı kaydı değildir. Camel ayrıca route ve runtime genelinde paylaşılan değişken kapsamları sunar. Bunları seçmek değerleri birden fazla işleme açar; sıradan bir ara değer için yerel kapsamla başlayın. Değişken kapsamları.
Exchange property’ler ve yerel variable’lar dış sistemin isteğine kendiliğinden eklenmez. Hedefe göndermek istediğiniz bilgiyi, o bağlantının beklediği body, header veya parametreye açıkça yerleştirin.
Değerleri nasıl okursunuz?
Expression / İfade, mevcut değerlerden bir sonuç hesaplar. Language, bu ifadenin hangi dilde yazıldığını belirtir. Aşağıdaki örneklerde Language Simple seçilidir; belirtilen header, property ve variable’ın önceden oluşturulduğu varsayılır.
| Simple ifadesi | Okuduğu kaynak | Örnek sonuç |
|---|---|---|
${body} | O andaki body’nin tamamı. | Lunex |
${header.country} | Mesajın country header’ı. | TR |
${exchangeProperty.sourceSystem} | Exchange’in sourceSystem property’si. | help |
${variable.originalName} | Yerel originalName değişkeni. | Lunex |
Merhaba ${body} | Sabit metin ile o andaki body. | Merhaba Lunex |
İfadeyi Expression alanına yazın; ${…} içindeki anahtar adlarını çevirmeyin. Bu yazım Simple’a aittir. Groovy’de body’yi body, bir header’ı headers['country'] ile okursunuz. Dil değişince aynı ifadenin yazımı da değişir. Simple rehberi ve Groovy rehberi daha fazla örnek içerir.
Bir değeri okumak, tek başına onu değiştirmez. İfadenin sonucuyla ne yapılacağını kullandığınız adım belirler: Set Body sonucu body’ye yazar, Set Header seçtiğiniz header’a yazar, Choice ise koşul sonucuna göre bir dal seçer. Simple değer erişimi.
Sabit değer ve yapılandırma değeri
Constant seçip Merhaba ${body} yazarsanız ${body} metnin içinde aynen kalır. Mesajdan değer okumak için Simple seçin. Constant, değişmeyen Merhaba Lunex gibi bir değer için uygundur.
{{service.url}} ise runtime yapılandırmasındaki bir property’yi okur. Örneğin application.properties içindeki service.url=https://example.com değerini kullanır. Bu dosyadaki property ile exchange property farklı kaynaklardır: Set Property, application.properties dosyasını güncellemez; ${exchangeProperty.serviceUrl} yazmak da dosyadan ayar okumaz. Ayarlar ve gizli değerler için yapılandırma rehberini kullanın.
Body her zaman metin midir?
Hayır. Ekranda benzer görünseler de bir metin, nesne ve liste üzerinde yapılabilecek işlemler farklıdır. Simülasyonda Input body type seçimi, değerin adıma hangi biçimde ulaşacağını belirler.
| Girdi türü | Örnek | Anlamı |
|---|---|---|
| Text | Lunex | Düz metin. |
| JSON text | {"name":"Lunex","amount":120} | JSON yazımı içeren metin; henüz ayrıştırılmış bir nesne değildir. |
| JSON value | {"name":"Lunex","amount":120} | Bu örnekte alanları doğrudan okunabilen bir nesne. Liste, sayı veya başka JSON değerleri de verilebilir. |
| XML | <person><name>Lunex</name></person> | XML metni; alan seçmek için XPath gibi uygun bir dil kullanılır. |
| Binary (Base64) | Bir dosyanın Base64 gösterimi | Akışa ikili veri olarak verilir. |
| No body | Gövde yok | Body null olur; header ve property’ler yine bulunabilir. |
JSON value örneğinde Simple ${body[name]} ile Lunex, ${body[amount]} ile 120 okunabilir. Body’de name alanı bulunması ${header.name} alanını oluşturmaz. Nesne alanlarını Simple ile okumak için camel-bean desteği gerekir; mevcut proje bağımlılıklarını koruyarak hazırlayın.
Girişiniz JSON text ise bu tür nesne erişiminden önce Unmarshal → JSON / Jackson ile ayrıştırın. Örneğin aşağıdaki parça mevcut route’un steps listesine eklenir; tam bir route dosyası değildir:
- unmarshal:
json:
library: Jackson
- setBody:
simple: 'Merhaba ${body[name]}'
İki adımı birlikte JSON text {"name":"Lunex","amount":120} ile deneyince sonuç Merhaba Lunex olur. Jackson için camel-jackson bağımlılığı gerekir. Yalnız Set Body’yi seçiyorsanız başlangıç mesajını JSON value verin; seçilmeyen Unmarshal adımı çalışmaz. Bir nesneyi yeniden JSON verisine dönüştürmek için Marshal → JSON / Jackson kullanılır. Content-Type: application/json başlığı eklemek tek başına JSON ayrıştırmaz veya üretmez.
120 sayısıyla "120" metni; null, boş metin "" ve boş nesne {} farklı değerlerdir. Türden emin değilseniz Output → Technical details bölümüne bakın. Girdi türleri ve dosyalar yükleme seçeneklerini açıklar.
Lunex örneğini adım adım deneyin
Bu örnek body’yi değiştirirken özgün adı bir variable’da tutar. Header ve exchange property de ekleyerek alanların birbirinden bağımsız olduğunu gösterir. Dış servis veya çalışan proje runtime’ı gerektirmez; Simulate kullanılır.
- Projenizde Source → Files → Create file ile
message-basics.camel.yamloluşturun. - Code görünümüne aşağıdaki tam dosyayı koyun ve Saved durumunu bekleyin.
- route:
id: message-basics
description: Understand message fields
from:
uri: direct:messageBasics
steps:
- setVariable:
name: originalName
simple: '${body}'
- setHeader:
name: country
constant: TR
- setProperty:
name: sourceSystem
constant: help
- setBody:
simple: 'Merhaba ${body}'
- setBody:
simple: '${body} / ${header.country} / ${exchangeProperty.sourceSystem} / ${variable.originalName}'
- Designer görünümüne geçin. İlk Set Variable adımına sağ tıklayıp Start before, son Set Body adımına sağ tıklayıp End after seçin. Beş adımın da bölüme girdiğini kontrol edin.
- Input → Input body type → Text seçin, Body alanına tırnaksız
Lunexyazın. Headers & properties içindeki iki alanı da{}bırakın. - Simulate seçin. Output → Observed step ile adımları açın; Before ve After görünümlerini karşılaştırın.
| Adımdan sonra | Body | Diğer alanlarda olan |
|---|---|---|
| Başlangıç | Lunex | Örnek header, property ve variable henüz oluşturulmadı. |
| Set Variable | Lunex | originalName değişkeni Lunex oldu. |
| Set Header | Lunex | country header’ı TR oldu. |
| Set Property | Lunex | sourceSystem property’si help oldu. |
| İlk Set Body | Merhaba Lunex | Önceki üç değer aynı kaldı. |
| Son Set Body | Merhaba Lunex / TR / help / Lunex | İfade dört ayrı kaynaktan değer okudu. |
Set Body, ifadenin sonucunu yeni body yapar. İlk Set Body çalıştıktan sonra ${body}, Merhaba Lunex değerini okur. Özgün Lunex değerini son adımda kullanabilmemizin nedeni ilk adımda açıkça originalName değişkenine almamızdır. Set Body referansı.
Bu örnekte özgün değer bir metindir. Bir nesneyi variable veya property’ye almak, o nesnenin bağımsız bir derin kopyasını üretmez; aynı nesnenin içini sonradan değiştiren kod yazıyorsanız bunu değişmez bir anlık görüntü gibi kullanmayın.
Input ve Output’ta hangi alan nerededir?
- Input → Body: Seçili bölümün başlangıç gövdesi.
- Input → Headers & properties: Başlangıç header ve exchange property değerleri. Bunlar JSON nesnesi olarak girilir.
- Output → Before / After → Body: Seçili adımdan önceki veya sonraki gövde.
- Output → Headers / Exchange properties: Kaydedilen başlıklar ve property’ler.
- Output → Compare: Adımın body, header ve property üzerinde yaptığı değişiklikler.
Simülasyon panelinde ayrı bir Variables giriş veya sonuç listesi yoktur. Bu yüzden örnekte değişkeni seçili bölümün içindeki Set Variable ile oluşturuyor ve son body içinde okuyarak doğruluyoruz. Use as input veya indirilen mesaj dosyası body, header ve exchange property’leri taşır; yerel variable’ı yeniden hazırlamak için Set Variable adımını da çalıştırın.
Sonuç beklediğiniz gibi değilse bölüm seçimini ve başlangıç body türünü kontrol edin. Son Set Body’yi tek başına çalıştırmak önceki adımlardaki header, property ve variable’ı oluşturmaz. Kaynak veya girdi değiştikten sonra yeni sonucu görmek için tekrar Simulate seçin. Sonuçları inceleme.
Değerler ne kadar süre yaşar?
Body, header, exchange property ve yerel variable, o işleme ait çalışma verileridir. Body ve diğer alanlar akış boyunca değişebilir. Aynı runtime’daki sıradan bir Direct çağrısı aynı exchange ile devam edebilir; başka bir route’a geçmek değerleri otomatik sıfırlamaz. Buna karşılık yeni bir bağımsız HTTP isteği önceki isteğin yerel değişkenlerini devralmaz. Bölme ve paralel işleme gibi adımlarda ayrıca EIP’nin davranışını kontrol edin.
Saved, akış tanımının kaydedildiğini gösterir; o anki mesajın veya değişkenin kalıcı olarak saklandığı anlamına gelmez. Kalıcılık gerektiğinde amaca göre veritabanı ya da kuyruk kullanın. Message Monitor ise kayıt seviyesi ve saklama süresine bağlı işleme kanıtını gösterir; çalışma değişkenlerinizin ortak veri deposu değildir. Kayıt seviyeleri.
Bu temelin ardından ilk entegrasyonunuzu çalıştırabilir, Designer’ı öğrenebilir veya akış sırası ve Direct çağrısıyla devam edebilirsiniz. Terimlere hızlı dönmek için kavramlar sözlüğünü kullanın.