Language, seçtiğiniz adımın bir değeri nasıl hesaplayacağını veya bir koşulu nasıl değerlendireceğini belirler. Aynı akışta farklı adımlar farklı diller kullanabilir. Projenin tamamını Groovy’ye veya JavaScript’e çevirmeniz gerekmez.
Dil seçimi için Designer → adım → Properties → Language açın. Listedeki her seçenek genel amaçlı bir programlama dili değildir: Header yalnızca bir başlığı okurken Groovy bir hesaplama veya dönüşüm betiği çalıştırır. Sağ panel rehberi, Language ve Expression alanlarının yerini açıklar.
Üç farklı kararı ayırın
Body, header, property ve variable’ın nerede tutulduğunu temel kavramlar açıklar. Dil seçimi bu alanların yerini değiştirmez; onları nasıl okuyacağınızı belirler.
| Karar | Örnek | Ne belirler? |
|---|---|---|
| Akışın tanımı | .camel.yaml, Designer/Code | Adımları, sıralarını ve bağlantıları. |
| Adımın expression dili | Simple, Groovy, JSONPath | O adımda değer/koşul hesaplamasını. |
| Özel kod veya kaynak | Java bean, .groovy, XSLT dosyası | Akışın çağırdığı yeniden kullanılabilir işlevi veya dönüşümü. |
Language → Java, bir expression değerlendirir; Java route dosyası veya Bean/Process kullanımıyla aynı seçim değildir. XSLT ise bu Language listesindeki bir seçenek olarak aranmaz; XSLT component’i ve kaynak dosyasıyla kullanılır.
Nereden başlamalısınız?
| Yapacağınız iş | İlk seçenek | Örnek |
|---|---|---|
| Değişmeyen değer yazmak | Constant | Order received |
| Mesajdan bir metin üretmek veya basit karşılaştırma yapmak | Simple | Order ${body[id]} |
| Bir header/property’yi olduğu gibi almak | Header / ExchangeProperty | OrderId — bu iki dilde ${…} yazılmaz. |
| JSON içinden alan/liste seçmek | JSONPath | $.order.id |
| XML içinden alan veya koşul seçmek | XPath | string(/order/@id) |
| Birden çok alanı hesaplamak veya yeni bir nesne kurmak | Groovy | [id: body.id, units: body.quantity] |
| JSON üzerinde sorgu/dönüşüm yapmak | JQ | .order.id |
| Satırlara veya ayraçlara göre parçalamak | Tokenize | Split’in bölme ifadesi; ayraç ayrı ayarlanır. |
| Mevcut Java işlevini kullanmak | Bean Method veya Bean adımı | Kayıtlı bean ve çağrılacak method. |
Bir dil değiştirildiğinde eski ifadenin otomatik çevrildiğini varsaymayın. Simple’daki ${body[id]}, JSONPath’teki $.id ve Groovy’deki body.id aynı sözdizimi değildir. Yeni dilin ifadesini yazın, veri türünü kontrol edin ve aynı örneği yeniden çalıştırın.
Dil seçicisindeki seçenekler
Aşağıdaki tablo, editörde sunulan seçeneklerin amaçlarını karşılaştırır. Runtime’ın ilgili dil kütüphanesini yükleyebilmesi ve script kaynaklarını bulabilmesi de gerekir. Katalogda görünmek, her ortamda bütün bağımlılıkların önceden kurulu olduğu anlamına gelmez.
Değer okuma ve kısa ifadeler
| Seçenek | YAML anahtarı | Kullanımı / farkı |
|---|---|---|
| Constant | constant | Sabit değer; ${body} metnini mesajdan okumaz. |
| Simple | simple | Body, header, property, metin üretimi ve koşullar için günlük başlangıç. |
| CSimple | csimple | Derlenen Simple ifadeleri; derleme ve tür hazırlığı gerektirir. Simple seçimini yalnız adı benziyor diye değiştirmeyin. |
| Header | header | Expression alanına yazılan isimdeki mesaj başlığını okur. |
| ExchangeProperty | exchangeProperty | İlgili exchange property değerini okur; application.properties anahtarı değildir. |
| Variable | variable | İlgili kapsamda tanımlanmış değişkeni okur; önce o değişkenin nasıl oluşturulduğunu belirleyin. |
| Bean Method | method | Registry’deki Java bean’in method’unu çağırır; bean ve bağımlılıkları hazırlanmalıdır. |
| Ref | ref | Registry’de kayıtlı mevcut expression/predicate’i kullanır; rastgele dosya yolu değildir. |
| Language | language | Adıyla çözümlenen özel bir dil uygulamasını kullanır; uygulama runtime’da kayıtlı olmalıdır. |
Yapısal veri ve bölme
| Seçenek | YAML anahtarı | Kullanımı / farkı |
|---|---|---|
| JSONPath | jsonpath | JSON verisinde alan veya liste seçimi; tek sonuç ile liste sonucunu ayırın. |
| JQ | jq | JSON sorgulama, filtreleme ve dönüşüm; JSONPath ile aynı ifade sözdizimini kullanmaz. |
| XPath | xpath | XML düğümü, metni veya koşulu; namespace ve sonuç türü önemlidir. |
| XQuery | xquery | XML üzerinde sorgu ve daha kapsamlı XML üretimi/dönüşümü. |
| Tokenize | tokenize | Metni ayraç/desene göre parçalara ayırır; sıklıkla Split ile kullanılır. |
| XML Tokenize | xtokenize | XML parçalarını XML yapısını gözeterek ayırır. Düz metin ayıracıyla aynı iş değildir. |
| HL7 Terser | hl7terser | HL7 mesaj alanlarını konum gösterimiyle okur; HL7 veri ve kütüphane hazırlığı gerekir. |
| DataSonnet | datasonnet | Yapısal veri dönüşümleri; giriş/çıkış media type ayarlarını dönüşümle birlikte belirleyin. |
Script, nesne ifadeleri ve özel çalışma biçimleri
| Seçenek | YAML anahtarı | Kullanımı / farkı |
|---|---|---|
| Groovy | groovy | Java nesneleriyle çalışabilen script; yeni nesne, koşul ve çok adımlı hesaplama için uygundur. |
| JavaScript | js | Runtime içindeki JavaScript değerlendirmesi. Tarayıcı DOM’u, Node.js veya npm ortamı değildir. |
| Python | python | Camel’in Python dil uygulamasında ifade çalıştırır. Bilgisayarınızdaki Python/pip paketlerinin burada bulunduğunu varsaymayın. |
| Java | java | Çalışma zamanında derlenen Java ifadesi; gerekli sınıfların classpath’te bulunması gerekir. |
| Jactl | jactl | Jactl sözdiziminde script; Groovy veya JavaScript ifadesi doğrudan taşınmaz. |
| MVEL | mvel | MVEL ifade/template değerlendirmesi; kendi sözdizimi ve kütüphanesi vardır. |
| OGNL | ognl | Nesne özellikleri ve method’ları üzerinden ifade değerlendirme. Simple’ın tamamıyla aynı dil değildir. |
| SpEL | spel | Spring Expression Language ifadeleri; projenin tamamının Spring uygulaması olması anlamına gelmez. |
| Wasm | wasm | Hazırlanmış WebAssembly işlevini çağırır; modül ve çağrı sözleşmesi ayrıca sağlanır. |
JavaScript ve Python’ın runtime bağlamı ve bağımlılıkları kendi JavaScript ve Python referanslarında açıklanır. Listeyi bir dil öğrenme zorunluluğu olarak değerlendirmeyin; çoğu akış için birkaç uygun dil yeterlidir.
Expression nerede kullanıldığına göre ne yapar?
| Adım | İfadenin sonucu |
|---|---|
| Set Body | Yeni body olur. |
| Set Header / Set Property | Adı belirtilen header/property değerine yazılır. |
| Choice / Filter / Validate | Doğru/yanlış koşulu olarak kullanılır. |
| Split | Bölünecek liste, metin veya uygun parçalanabilir değeri üretir. |
| Script | Script’in dönüş değerini body’ye otomatik yazmaz; mesaj değişikliği script içinde açıkça yapılır. |
Bu yüzden “Groovy yazdım ama body değişmedi” durumunda önce kullanılan adımı kontrol edin. Groovy rehberi, Set Body ile Script farkını aynı girdi üzerinde gösterir.
JSONPath ve XPath ile küçük denemeler
Bir Set Body adımını tek başına seçip Use only this step kullanın. Aşağıdaki değerleri Properties ve Input arasında girin:
| Deneme | Language / Expression | Input | Beklenen sonuç |
|---|---|---|---|
| JSON’dan kimlik | JSONPath / $.order.id | JSON text: {"order":{"id":"A-100"}} | A-100 |
| XML’den kimlik | XPath / string(/order/@id); Expression properties → Result Type: java.lang.String | XML: <order id="A-100"/> | A-100 |
JSONPath için camel-jsonpath, XPath için camel-xpath bağımlılığını hazırlayın. JSONPath JSON metnini kendisi okuyabilir; Groovy ile body.order.id yazacaksanız body’nin nesne olması gerekir. XPath’in düğüm listesi üretmesiyle String üretmesi de farklıdır. XML namespace’leri ve bulunamayan JSON alanları için JSONPath ve XPath seçeneklerini inceleyin; hatayı gizlemek yerine beklenen eksik-alan davranışını belirleyin.
Bağımlılıkları ve veri türünü hazırlayın
Mevcut camel.jbang.dependencies listesini koruyarak gereken kütüphaneyi ekleyin. Örneğin yalnız camel-console bulunan bir projede bu rehberin Groovy/JSON örnekleri için:
camel.jbang.dependencies=camel-console,camel-groovy,camel-jackson,camel-jsonpath,camel-xpath
Her dil için bu listenin tamamı gerekli değildir. Bağımlılıkların geliştirme, simülasyon ve paketlenmiş çalışma ortamında çözümlendiğini doğrulayın. Simülasyon gerekli bağımlılığı hazırlarken ilk deneme uzayabilir. Ağ/depo erişimi veya uyumsuz sürüm hatası, expression’ın sözdizimi hatasından farklıdır. Ayrıntılar bağımlılık rehberindedir.
Body’nin metin, nesne veya liste olması sonucu değiştirir. {"id":"A-100"} görünen bir JSON text, Groovy açısından henüz bir Map değildir. Gerçek route’ta Unmarshal → JSON / Jackson, simülasyonda nesneyi doğrudan veriyorsanız JSON value kullanın. Sonuçta üretilen nesneyi HTTP/mesajlaşma çıkışına JSON metni olarak vermek için gerektiğinde Marshal ekleyin.
Öğrenme sırası: Simple ile değer ve koşul yazma → Groovy ile dönüşüm ve script → EIP’lerle akışı yönlendirme.