Bu makaledeki modül: Integration Flow Helper
SAP CPI'da Camel Simple ifadeleri: header'lar, özellikler ve örneklerle ${…}
SAP CPI'da Camel Simple ifadeleri nasıl çalışır: ${header.x}, ${property.x}, ${in.body}, tarihler, Content Modifier sırası, Router koşulları ve hiçbir şey döndürmeyen hatalar.

SAP Cloud Integration (SAP CPI) iFlow'larındaki dinamik değerlerin neredeyse tamamı, Apache Camel'in ifade dili Simple ile yazılır: bir alıcı adresindeki header, bir Content Modifier'daki özellik, bir dosya adındaki tarih, bir Router'daki koşul. Söz dizimi kısadır, ${…}, ve fark etmeden küçük bir hata yapmak kolaydır.
Bu makale her gün kullanacağınız ifadeleri, bir Content Modifier'ın bunları hangi sırayla değerlendirdiğini, header'lar ile exchange property'ler arasındaki farkı ve bir ifadenin sessizce hiçbir şey döndürmemesine yol açan hataları ele alıyor.
SAP CPI'da Simple ifadesi nedir
SAP Integration Suite her iFlow'u Apache Camel üzerinde çalıştırır. Bir adım çalıştığında Camel, alandaki her ${…} ifadesini geçerli mesajdan gelen bir değerle değiştirir: bir header, bir exchange property, mesaj gövdesi ya da geçerli tarih gibi yerleşik bir fonksiyon. İfadenin çevresindeki metin olduğu gibi kalır; böylece Order-${header.orderId}.xml, Order-4711.xml olur.
Simple ifadelerini Content Modifier'ın Expression türündeki değerlerinde ve mesaj gövdesinde, birçok alıcı adaptörünün adres ve sorgu alanlarında, Non-XML türündeki Router ve Filter koşullarında ve bir e-posta konusu ya da SFTP dosya adı gibi alanlarda yazabilirsiniz. Dışsallaştırılmış parametreler benzer görünür ama farklıdır: {{receiverHost}} yalnızca bir kez, iFlow'u dağıttığınızda değiştirilir; ${…} ise her mesaj için değerlendirilir.
Her gün kullanacağınız ifadeler
Birkaç ifade çoğu iFlow'u karşılar ve düz metinle serbestçe karıştırılabilir. Örneğin bir Content Modifier gövdesi, header'lardan, özelliklerden ve fonksiyonlardan eksiksiz bir XML belgesi oluşturabilir:
<Order>
<Id>${property.orderId}</Id>
<Customer>${header.customerId}</Customer>
<ReceivedOn>${date:now:yyyy-MM-dd}</ReceivedOn>
<Flow>${camelId}</Flow>
<MessageLog>${property.SAP_MessageProcessingLogID}</MessageLog>
</Order>| İfade | Ne döndürür |
|---|---|
${header.orderId} | orderId mesaj header'ı |
${property.orderId} | orderId exchange property'si (Camel ${exchangeProperty.orderId} biçimini de kabul eder) |
${in.body} veya ${body} | Geçerli mesaj gövdesi, metin olarak |
${date:now:yyyy-MM-dd} | Bugünün tarihi, verilen Java tarih kalıbında |
${camelId} | Çalışan integration flow'un adı |
${property.SAP_MessageProcessingLogID} | Geçerli mesajın işleme günlüğü kimliği |
${header.CamelHttpResponseCode} | Son HTTP çağrısının döndürdüğü durum kodu |
Content Modifier header'ları, özellikleri ve gövdeyi nasıl değerlendirir
Bir Content Modifier sekmelerini sabit bir sırayla işler: önce Message Header tablosu, sonra Exchange Property tablosu, ardından Message Body. Her tablonun içinde satırlar yukarıdan aşağıya işlenir.
Bu sıra, bir ifadenin neyi görebileceğini belirler. Bir özellik satırı, aynı Content Modifier'da daha önce oluşturulan bir header'ı okuyabilir; gövde ise ikisini de kullanabilir. Bir header satırı, aynı Content Modifier'ın oluşturduğu bir özelliği okuyamaz, çünkü header değerlendirilirken o özellik henüz yoktur; bunun yerine boş bir değer okunur. Buna ihtiyacınız varsa özelliği daha önceki bir Content Modifier'da ayarlayın ya da değeri önce işlenen header tablosuna taşıyın.
- Expression kaynak türü: değer bir Simple ifadesidir, örneğin
${date:now:yyyyMMdd}-${header.orderId}. - Header veya Property kaynak türü: başka bir header'ı ya da özelliği adıyla kopyalar, etrafında
${…}olmadan. - XPath kaynak türü: XML gövdesinden bir değer okur (aşağıda bağlantısı verilen XPath makalesine bakın).
- Constant, Local Variable, Global Variable ve Number Range kaynak türleri sabit ve saklanan değerler içindir.
Header mı, exchange property mi? Hangisini kullanmalı
Bir header mesajla birlikte taşınır. Alıcı adaptörleri header'ları çağırdığınız sisteme gönderebilir ve header'lar bir ProcessDirect çağrısıyla başka bir iFlow'a geçer. Bir exchange property ise geçerli iFlow'un exchange'i içinde kalır ve kendi başına hiçbir zaman bir alıcıya gönderilmez.
Sürprizlerin çoğu iki ayrıntıdan kaynaklanır. Header adları büyük/küçük harfe duyarlı değildir; bu yüzden ${header.OrderID} ve ${header.orderid} aynı header'ı okur. Exchange property adları ise büyük/küçük harfe duyarlıdır; bu yüzden ${property.OrderID} ile ${property.orderId} iki ayrı özelliktir ve ikincisi hiç var olmayabilir.
- Yalnızca bu iFlow'un ihtiyaç duyduğu değerler için özellik kullanın: kimlikler, sayaçlar, bayraklar, yükün saklanan kopyaları.
- Bir adaptörün veya sonraki iFlow'un alması gereken değerler için header kullanın ve tenant'tan çıkmaması gereken header'ları silin.
- Büyük değerleri header'lara koymayın: her çağrıyla birlikte taşınırlar.
Router ve Filter'da Simple koşulları
Bir Router rotasında veya Non-XML türündeki bir Filter'da koşul, bir değerle karşılaştırılan bir Simple ifadesidir. Yaygın operatörler =, !=, >, >=, <, <=, contains, in ve regex'tir ve and ya da or ile birleştirilir. Metin değerleri tek tırnak içine alınır:
${header.orderType} = 'EXPRESS'
${property.amount} > 1000 and ${header.country} in 'DE,AT,CH'
${header.CamelHttpResponseCode} != '200'Bir koşuldaki header veya özellik yoksa koşul yalnızca yanlış olur ve mesaj başka bir rotaya, çoğu zaman varsayılan rotaya gider. Bilinmeyen header'lar ve özellikler makalesi, bunu üretime ulaşmadan nasıl yakalayacağınızı gösterir.
Kitegra nasıl yardımcı olur
Kitegra, SAP Integration Suite tasarımcısı için bir tarayıcı uzantısıdır. Tasarımcıdaki bir alana ${ veya $ yazdığınızda, iFlow'un o noktasına uyan adları gösterir: Content Modifier'larda, Groovy ve JavaScript betiklerinde ve iFlow'un başka yerlerinde ayarlanan header'lar ve özellikler, SAP ve Camel'in standart header'ları ve ifadeleri, {{…}} parametreleri, değişkenler ve Data Store adları. Yalnızca bazı yollarda ayarlanan bir ad “Yalnızca bazı yollarda ayarlanır” olarak işaretlenir.
Lint paneli kapatılmamış bir ${ ifadesini, bir ifadenin içindeki fazla boşlukları ve iFlow'da hiçbir şeyin ayarlamadığı header'ları ya da özellikleri işaretler. XPath satırları için örnek bir yük (payload) size yol önerileri de verir; bunu XPath makalesi anlatıyor. Uzantı bir iFlow'un içeriğini asla kaydetmez, dağıtmaz veya düzenlemez; tenant'ınız yalnızca, kapatılabilen ve adı belli dört işlemden birine tıkladığınızda değişir.
İfadelerinizin gerçekte hangi değerleri ürettiğini görmek için bir mesajı adım adım trace edin ve her adımdan önceki header'ları ve özellikleri okuyun.
Kitegra hesabı olmadan modül başına 5 iFlow'da çalışır. Free planı 50, Starter 100 ve Pro 300 iFlow'u kapsar. Ekip planlarında her üye Pro alır; Startup Team'de modül başına 300 iFlow vardır, Growth Team ve Scale Team'de ise sınır yoktur. Kitegra'in lansman döneminde, oturum açan herkes Free planında bile tüm araçları kullanabilir. Planları karşılaştırın.
Bir sonraki iFlow'unuzda deneyin
Kitegra'ın SAP Integration Suite tasarımcısında neler yaptığını okuyun veya onu Kitegra'in diğer Chrome uzantılarıyla birlikte görün.
Sık sorulan sorular
SAP CPI'da ${header.x} ile ${property.x} arasındaki fark nedir?
${header.x}, mesajla birlikte taşınan ve alıcılara ve diğer iFlow'lara ulaşabilen bir mesaj header'ını okur. ${property.x} ise geçerli iFlow'un içinde kalan bir exchange property'yi okur.
Header ve özellik adları büyük/küçük harfe duyarlı mı?
Header adları değil: ${header.OrderID} ve ${header.orderid} aynı header'ı okur. Exchange property adları ise duyarlıdır; bu yüzden ${property.OrderID} ve ${property.orderId} farklı özelliklerdir.
Aynı Content Modifier'da bir özellikten ayarladığım header neden boş?
Bir Content Modifier önce header tablosunu, sonra özellik tablosunu, ardından gövdeyi değerlendirir. Bir header, aynı adımda oluşturulan bir özelliği okuyamaz; özelliği daha önceki bir adımda ayarlayın.
Bugünün tarihini bir dosya adına veya alana nasıl koyarım?
Herhangi bir Java tarih kalıbıyla ${date:now:yyyy-MM-dd} kullanın; örneğin zaman damgası için ${date:now:yyyyMMddHHmmss}.
{{parameter}} bir Simple ifadesi mi?
Hayır. {{…}}, iFlow dağıtıldığında bir kez değiştirilen dışsallaştırılmış bir parametreyi belirtir. ${…} ise Camel tarafından her mesaj için değerlendirilir.
Bir ifade var olmayan bir header'ı adlandırırsa ne olur?
Hiçbir hata vermeden boş bir değer döndürür; bu yüzden sorun daha sonra yanlış bir rota veya boş bir alan olarak ortaya çıkar. Bir lint denetimi veya bir kontrol adımı onu daha erken yakalar.