Groovy, mesaj içindeki alanları hesaplamak ve yeni bir nesne üretmek için kullanılabilir. Set Body → Language → Groovy seçildiğinde ifadenin sonucu yeni body olur. Script adımında ise değiştirilecek mesaj alanını script’in içinde açıkça belirtirsiniz.
Ön koşul: proje runtime’ında camel-groovy bulunmalıdır. JSON metni ayrıştırıp yeniden üretecekseniz camel-jackson da gerekir. Mevcut bağımlılık listesini koruyarak ekleme işlemi yapılandırma rehberindedir.
İlk örnek: metni büyük harfe çevirin
Body’nin türü, header’lar ve çalışma değişkenleri için önce mesaj ve veri başvurusuna bakabilirsiniz.
- Bir Set Body adımı ekleyin ve seçin.
- Properties → Language → Groovy seçin.
- Expression alanına
body.toUpperCase()yazın. - Adıma sağ tıklayıp Use only this step seçin.
- Input body type → Text, Body → hello girin ve Simulate seçin.
- Output → Before
hello, AfterHELLOolmalıdır.
Alanların ekrandaki yerini sağ panel görselinde görebilirsiniz.
Code’daki adım:
- setBody:
groovy:
expression: body.toUpperCase()
Bu örnek String body bekler. Body null veya JSON nesnesiyse aynı method çağrısı uygun değildir. Dil değiştirmek mesajın türünü dönüştürmez. Büyük/küçük harf kuralı işinizde dile bağlıysa gerekli locale’i script’te açıkça seçin.
Groovy’nin gördüğü mesaj alanları
| İfade | Okuduğu bilgi |
|---|---|
body | O adıma gelen body. |
headers['OrderId'] | Mesaj başlığı. |
exchangeProperties['sourceSystem'] | Exchange property. |
variables['total'] | İlgili değişken. |
exchange | Mesaj işleme bağlamı; örneğin exchange.message üzerinden mesajı değiştirme. |
Simple’daki ${body} gösterimini Groovy alanına taşımayın. Groovy doğrudan body değişkenini kullanır. Dilin sunduğu bağlam ve script yükleme biçimleri Groovy referansında açıklanır.
Nesne dönüştürün ve beklenen sonucu karşılaştırın
calculate-order.camel.yaml dosyasına bu tam route’u ekleyin:
- route:
id: calculate-order
from:
uri: direct:calculateOrder
steps:
- setBody:
groovy:
expression: |
if (body.id == null || body.quantity == null || body.unitPrice == null) {
throw new IllegalArgumentException('id, quantity and unitPrice are required')
}
if (body.quantity <= 0 || body.unitPrice < 0) {
throw new IllegalArgumentException('quantity must be positive and unitPrice non-negative')
}
def total = new BigDecimal(body.unitPrice.toString()) * body.quantity
result = [orderNumber: body.id, total: total, currency: 'TRY']
- Set Body adımını tek başına seçin.
- Input body type → JSON value seçin.
- Body’yi girin:
{"id":"A-100","quantity":2,"unitPrice":125.50}
- Simulate seçin. Beklenen nesne:
{"orderNumber":"A-100","total":251.00,"currency":"TRY"}
Sayı 251.0 veya 251 biçiminde görüntülenebilir; değer aynıdır. Script’in ürettiği Map, alanları düzenlenmiş bir nesnedir; bir sonraki sisteme yazılacak JSON metni henüz değildir. İşinizde para hassasiyeti, yuvarlama ve kesirli miktar kurallarını ayrıca belirleyin.
Çok satırlı örnekte def total yerel değişken, result = … sonuçtur. Hesaplanan sonucu açıkça atayın; bir log satırının veya ara işlemin dönüş değerine güvenmeyin.
Gerçek giriş JSON metniyse
Route’taki Groovy Set Body’den önce şu adımı ekleyin:
- unmarshal:
json:
library: Jackson
Set Body’den sonra şunu ekleyin:
- marshal:
json:
library: Jackson
Üç adımı birlikte JSON text girdisiyle simüle edin. Sıra JSON metni → nesne → hesaplanan nesne → JSON çıktısı olur. Alan sırası/boşluk yerine alan değerlerini karşılaştırın. Veri dönüşümü ve mesaj türleri bu ayrımı ayrıntılandırır.
Set Body ile Script farkını deneyin
Set Body, expression sonucunu body’ye yazar. Script, sırf bir değer hesaplandı diye body’yi değiştirmez. Script ile değiştirmek için:
- script:
groovy:
expression: |
exchange.message.setHeader('Normalized', true)
exchange.message.setBody(body.toUpperCase())
Bu adımı tek başına Text → hello ile simüle edin. Son body HELLO, Normalized başlığı boolean true olur. Script alanına yalnız body.toUpperCase() yazsaydınız dönüş değeri body’ye otomatik atanmayacaktı. Script adımının sözleşmesi.
Yalnız bir değer değiştirecekseniz Set Body/Set Header/Set Property ile niyeti görünür tutun. Daha büyük ve tekrar kullanılan işlevleri ayrı script veya Java bean olarak düzenleyin.
Script’i proje dosyasına taşıyın
- Source → Files → Create file ile
normalize-name.groovyoluşturun. İçeriğibody.toUpperCase()olsun; Saved durumunu bekleyin. - Groovy Set Body’nin mevcut Expression alanını temizleyin. Boş alanda açılan Expression file seçicisinden
normalize-name.groovyseçin. - Oluşan dosya bağlantısına tıklayarak script’i açabilirsiniz. Clear file reference ile dosya bağlantısını kaldırıp tekrar satır içi expression yazabilirsiniz; bu işlem dosyanın kendisini silmez.
- Aynı Text girdisiyle yeniden Simulate çalıştırın.
Editörün seçimi YAML’de şu referansı üretir:
- setBody:
groovy:
expression: resource:normalize-name.groovy
Dosya route ile aynı projenin kaynaklarında bulunmalıdır. Çalıştırma kaynak çözümlemesi dosyayı bulamıyorsa Code’da açık classpath biçimi resource:classpath:normalize-name.groovy kullanıp dosyanın runtime paketine girdiğini doğrulayın. Bir dosyayı referans etmek içeriğini route’un içine kopyalamaz; Git’e hem route’u hem script’i gönderin. Kaynakları dağıtıma taşıma hangi sürümün çalışacağını açıklar.
Null, eksik alan ve hata davranışı
Opsiyonel müşteri adı için body.customer?.name ?: 'Unknown' gibi açık bir varsayılan kullanabilirsiniz. ?. null nesneye erişimde yardımcı olur; ?: null veya Groovy açısından boş/false sayılan sonuçta sağdaki değeri seçer. 0 iş için geçerli bir değerse bu kısaltmayı sayısal varsayılan için düşünmeden kullanmayın.
Zorunlu alanlar için hata üretin veya script’ten önce Validate ekleyin. Yukarıdaki hesaplama örneğini quantity=0, eksik unitPrice ve metin olarak yanlış bir fiyatla yeniden deneyin; Output → Failure içindeki nedeni inceleyin. Gerçek runtime’da hatanın yanıta veya dead letter’a nasıl çevrileceğini hata yönetiminde belirleyin.
| Belirti | Kontrol |
|---|---|
groovy dili/sınıfı yüklenemiyor | camel-groovy, bağımlılık erişimi ve runtime’ın yeniden başlatılması. |
toUpperCase bulunamadı | Body metin mi? JSON nesnesindeki belirli metin alanını mı dönüştürmelisiniz? |
| Sonuç body’ye gelmedi | Set Body mi Script mi kullanılıyor; result veya açık mesaj ataması doğru mu? |
| Script dosyası bulunamadı | Dosya adı, resource yolu, proje kaydı ve commit/build içeriği. |
| Simülasyon doğru, gerçek giriş hatalı | JSON value ile verdiğiniz nesne gerçek girişte JSON metni olabilir; Unmarshal adımını kontrol edin. |
Script içindeki dosya/ağ çağrılarını bir bağlantı component’inin yerine gizlemeyin. Entegrasyon giriş/çıkışlarını Components ile görünür tutun; simülasyonun dış alıcı örnekleri gerçek bağlantı kabul testi yerine geçmez.