Etzel Art of Digital Manufacturing
Bize ulaşın
Lunex 1.6.0 kullanım kılavuzu

Groovy ile dönüşüm ve script yazın

Groovy ile nesne hesaplayın; Set Body, Script ve dosya referansını ayırın.

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.

  1. Bir Set Body adımı ekleyin ve seçin.
  2. Properties → Language → Groovy seçin.
  3. Expression alanına body.toUpperCase() yazın.
  4. Adıma sağ tıklayıp Use only this step seçin.
  5. Input body type → Text, Body → hello girin ve Simulate seçin.
  6. Output → Before hello, After HELLO olmalı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ı

İfadeOkuduğu bilgi
bodyO adıma gelen body.
headers['OrderId']Mesaj başlığı.
exchangeProperties['sourceSystem']Exchange property.
variables['total']İlgili değişken.
exchangeMesaj 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']
  1. Set Body adımını tek başına seçin.
  2. Input body type → JSON value seçin.
  3. Body’yi girin:
{"id":"A-100","quantity":2,"unitPrice":125.50}
  1. 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

  1. Source → Files → Create file ile normalize-name.groovy oluşturun. İçeriği body.toUpperCase() olsun; Saved durumunu bekleyin.
  2. Groovy Set Body’nin mevcut Expression alanını temizleyin. Boş alanda açılan Expression file seçicisinden normalize-name.groovy seçin.
  3. 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.
  4. 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.

BelirtiKontrol
groovy dili/sınıfı yüklenemiyorcamel-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 gelmediSet 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.

Lunex’i kendi entegrasyonunuzla görün

Kılavuzda okuduklarınızı kendi sistemlerinizle deneyelim. Demo için bize yazın.