<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alone Star</title>
    <description>The latest articles on DEV Community by Alone Star (@nghxni).</description>
    <link>https://dev.to/nghxni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3859018%2F8fdf151c-93b0-482b-9d2f-868801372f7f.png</url>
      <title>DEV Community: Alone Star</title>
      <link>https://dev.to/nghxni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nghxni"/>
    <language>en</language>
    <item>
      <title>LightESB PlatformHttp v1.0.0: DS Data Transform Guide</title>
      <dc:creator>Alone Star</dc:creator>
      <pubDate>Fri, 10 Apr 2026 09:16:15 +0000</pubDate>
      <link>https://dev.to/nghxni/lightesb-platformhttp-v100-ds-data-transform-guide-2d1a</link>
      <guid>https://dev.to/nghxni/lightesb-platformhttp-v100-ds-data-transform-guide-2d1a</guid>
      <description>&lt;h2&gt;
  
  
  Metadata
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Applicable Version: &lt;code&gt;PlatformHttp@v1.0.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Related Service: &lt;code&gt;PlatformHttp@v1.0.0@complex-json-transform-route.xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;PlatformHttp v1.0.0&lt;/code&gt; provides a practical DS data transform route for complex order payloads.&lt;br&gt;&lt;br&gt;
The route uses &lt;code&gt;conditionaltransform&lt;/code&gt; to decide whether to run the transform and returns the converted JSON directly to the caller.&lt;/p&gt;
&lt;h2&gt;
  
  
  Background and Goal
&lt;/h2&gt;

&lt;p&gt;For integration scenarios, upstream payloads are often deeply nested and hard to consume directly.&lt;/p&gt;

&lt;p&gt;This route targets a stable pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep a clear &lt;strong&gt;HTTP Listener&lt;/strong&gt; as the request entry&lt;/li&gt;
&lt;li&gt;flatten multi-level order JSON into business-friendly fields&lt;/li&gt;
&lt;li&gt;prepare transformed data for downstream forwarding&lt;/li&gt;
&lt;li&gt;keep response write-back stable with JSON encoding handling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Route and Configuration Breakdown
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) HTTP Listener request entry
&lt;/h3&gt;

&lt;p&gt;From &lt;code&gt;complex-json-transform-route.xml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"undertow:http://0.0.0.0:{{server.port}}/api/transform/complex-order?httpMethodRestrict=POST"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From &lt;code&gt;common.config.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;server.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;18081&lt;/span&gt;
&lt;span class="py"&gt;HTTP.Listener&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;system.components&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;undertowhttp,streamcache,jsontransform,conditionaltransform&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resulting request endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST http://localhost:18081/api/transform/complex-order&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Conditional transform switch
&lt;/h3&gt;

&lt;p&gt;The route invokes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;to&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"conditionaltransform:input?skipOnError=true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transform behavior is controlled by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;input-transform&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;input-transform.file&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;input-transform-with-import.ds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when &lt;code&gt;input-transform=true&lt;/code&gt;, DS transform executes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;input-transform-with-import.ds&lt;/code&gt; is used as the input transform script&lt;/li&gt;
&lt;li&gt;when transform fails and &lt;code&gt;skipOnError=true&lt;/code&gt;, the route continues without hard stop&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) DS script and shared function import
&lt;/h3&gt;

&lt;p&gt;Main script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lightesb-camel-app/PlatformHttp/v1.0.0/input-transform-with-import.ds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shared function library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lightesb-camel-app/TransformDS/common-functions.ds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The script imports common functions to keep rules modular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local lib = import 'lightesb-camel-app/TransformDS/common-functions.ds';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical mappings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer name via &lt;code&gt;lib.formatFullName(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;shipping address via &lt;code&gt;lib.formatAddress(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;line totals via &lt;code&gt;lib.calculateLineTotal(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;normalized financial values via &lt;code&gt;lib.formatAmount(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Response write-back
&lt;/h3&gt;

&lt;p&gt;The route finishes with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;process&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"jsonResponseProcessor"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps keep JSON response output stable for UTF-8 and content formatting during response write-back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request and Response Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Request Example
&lt;/h3&gt;

&lt;p&gt;Run from repository root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:18081/api/transform/complex-order"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; &lt;span class="s2"&gt;"@lightesb-camel-app/PlatformHttp/v1.0.0/test.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Response Example (key fields)
&lt;/h3&gt;

&lt;p&gt;A successful response contains transformed fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ORD-2024-003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"张明华"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"productId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PROD-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lineTotal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;16198.2&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"financial"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CNY"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick verification with &lt;code&gt;jq&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:18081/api/transform/complex-order"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; &lt;span class="s2"&gt;"@lightesb-camel-app/PlatformHttp/v1.0.0/test.json"&lt;/span&gt; | jq &lt;span class="s1"&gt;'{orderId, customerName, itemCount: (.items|length), currency: .financial.currency}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Issues and Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Port is not reachable
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;HTTP.Listener=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server.port=18081&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;no process conflicts on port &lt;code&gt;18081&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2) Request method rejected
&lt;/h3&gt;

&lt;p&gt;The route uses &lt;code&gt;httpMethodRestrict=POST&lt;/code&gt;; call must be &lt;code&gt;POST&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) No transform applied
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input-transform=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input-transform.file=input-transform-with-import.ds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DS file path and syntax are valid&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Import file not found
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;input-transform-with-import.ds&lt;/code&gt; imports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lightesb-camel-app/TransformDS/common-functions.ds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensure this file exists and path is correct relative to runtime resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PlatformHttp v1.0.0&lt;/code&gt; offers a clear DS transform baseline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stable HTTP Listener request entry&lt;/li&gt;
&lt;li&gt;configuration-driven transform switch with &lt;code&gt;conditionaltransform&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;reusable DS function library via import&lt;/li&gt;
&lt;li&gt;predictable response write-back through &lt;code&gt;jsonResponseProcessor&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is suitable for complex JSON flattening and can be extended with validation, auth checks, and downstream forwarding policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://camel.apache.org/components/4.18.x/languages/datasonnet-language.html" rel="noopener noreferrer"&gt;Apache Camel DataSonnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://camel.apache.org/components/4.18.x/undertow-component.html" rel="noopener noreferrer"&gt;Apache Camel Undertow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nghxni/lightesb-camel.git" rel="noopener noreferrer"&gt;LightESB Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>data</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>LightESB PlatformHttp v3.0.0: JSONPath Order Transform HTTP Route Guide</title>
      <dc:creator>Alone Star</dc:creator>
      <pubDate>Thu, 09 Apr 2026 06:05:58 +0000</pubDate>
      <link>https://dev.to/nghxni/lightesb-platformhttp-v300-jsonpath-order-transform-http-route-guide-f0b</link>
      <guid>https://dev.to/nghxni/lightesb-platformhttp-v300-jsonpath-order-transform-http-route-guide-f0b</guid>
      <description>&lt;h2&gt;
  
  
  Metadata
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Applicable Version: &lt;code&gt;PlatformHttp@v3.0.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Related Service: &lt;code&gt;PlatformHttp@v3.0.0@platform-http-route.xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;PlatformHttp v3.0.0&lt;/code&gt; provides a compact and practical HTTP transform pattern: receive order JSON, extract business fields with JSONPath, and return JSON responses with consistent encoding.&lt;/p&gt;

&lt;p&gt;This article walks through how the route is designed and how to validate it quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background and Goal
&lt;/h2&gt;

&lt;p&gt;In many integration services, the request entry must be strict and observable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep a clear HTTP Listener entry for upstream systems&lt;/li&gt;
&lt;li&gt;Extract key fields (&lt;code&gt;orderId&lt;/code&gt;) as early as possible&lt;/li&gt;
&lt;li&gt;Preserve service-level logs for troubleshooting&lt;/li&gt;
&lt;li&gt;Return stable JSON without Chinese encoding issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;PlatformHttp v3.0.0&lt;/code&gt; addresses these goals in one route package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route and Configuration Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Runtime listener switch and port
&lt;/h3&gt;

&lt;p&gt;From &lt;code&gt;common.config.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;server.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;18080&lt;/span&gt;
&lt;span class="py"&gt;HTTP.Listener&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;system.components&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;undertowhttp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HTTP.Listener=true&lt;/code&gt; enables Undertow registration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.port=18080&lt;/code&gt; defines the external listening port&lt;/li&gt;
&lt;li&gt;route endpoint resolves with this port at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Service identity and URL versioning
&lt;/h3&gt;

&lt;p&gt;From &lt;code&gt;service.config.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;service.name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;PlatformHttp&lt;/span&gt;
&lt;span class="py"&gt;service.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main request entry uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"undertow:http://0.0.0.0:{{server.port}}/{{service.version}}/transform/order?httpMethodRestrict=POST"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the final request path is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /3.0.0/transform/order&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps API versioning explicit in URL paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) JSONPath extraction and response write-back
&lt;/h3&gt;

&lt;p&gt;The route extracts &lt;code&gt;orderId&lt;/code&gt; in multiple ways, then writes a JSON response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;log&lt;/span&gt; &lt;span class="na"&gt;message=&lt;/span&gt;&lt;span class="s"&gt;"orderId (JSONPath): ${jsonpath($.orderId)}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;setProperty&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"extractedOrderId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;jsonpath&amp;gt;&lt;/span&gt;$.orderId&lt;span class="nt"&gt;&amp;lt;/jsonpath&amp;gt;&amp;lt;/setProperty&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;setHeader&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"OrderId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;jsonpath&amp;gt;&lt;/span&gt;$.orderId&lt;span class="nt"&gt;&amp;lt;/jsonpath&amp;gt;&amp;lt;/setHeader&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;transform&amp;gt;&amp;lt;simple&amp;gt;&lt;/span&gt;{"status": "success", "message": "请求处理完成"}&lt;span class="nt"&gt;&amp;lt;/simple&amp;gt;&amp;lt;/transform&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;process&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"jsonResponseProcessor"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;setHeader&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;constant&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/constant&amp;gt;&amp;lt;/setHeader&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this design works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Listener&lt;/strong&gt;: one explicit request entry point&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request entry observability&lt;/strong&gt;: &lt;code&gt;servicelog&lt;/code&gt; captures headers and body&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downstream forwarding ready&lt;/strong&gt;: extracted fields can be reused for later routing decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response write-back stability&lt;/strong&gt;: &lt;code&gt;jsonResponseProcessor&lt;/code&gt; improves UTF-8 output behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Request and Response Validation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  API 1: Main transform route
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:18080/3.0.0/transform/order"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;orderId&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;ORD-20260409-001&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;amount&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:299.50}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"请求处理完成"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  API 2: JSONPath-inline response sample
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:18080/3.0.0/transform/order1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;orderId&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;ORD-20260409-002&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ORD-20260409-002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"请求处理完成"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Issues and Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Port not reachable
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;HTTP.Listener=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server.port=18080&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;no other process occupies &lt;code&gt;18080&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2) Method rejected (405)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;the endpoint restricts method with &lt;code&gt;httpMethodRestrict=POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;call must use &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Incorrect path or version
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;route path includes &lt;code&gt;{{service.version}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ensure request URL matches &lt;code&gt;/3.0.0/transform/order&lt;/code&gt; or &lt;code&gt;/3.0.0/transform/order1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Encoding or garbled response text
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;keep &lt;code&gt;jsonResponseProcessor&lt;/code&gt; in the response path&lt;/li&gt;
&lt;li&gt;keep &lt;code&gt;Content-Type: application/json&lt;/code&gt; response header&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PlatformHttp v3.0.0&lt;/code&gt; demonstrates a practical baseline for API integration routes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict HTTP Listener entry&lt;/li&gt;
&lt;li&gt;early JSONPath field extraction&lt;/li&gt;
&lt;li&gt;service-level request tracing&lt;/li&gt;
&lt;li&gt;stable UTF-8 response write-back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is suitable for order transform gateways and can be extended with validation, auth checks, and downstream forwarding policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://camel.apache.org/components/4.18.x/languages/jsonpath-language.html" rel="noopener noreferrer"&gt;Camel JSONPath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nghxni/lightesb-camel.git" rel="noopener noreferrer"&gt;LightESB Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>LightESB HTTP Listener and Request Routing: Undertow + HttpRequestSrv Deep Dive</title>
      <dc:creator>Alone Star</dc:creator>
      <pubDate>Wed, 08 Apr 2026 09:36:20 +0000</pubDate>
      <link>https://dev.to/nghxni/lightesb-http-listener-and-request-routing-undertow-httprequestsrv-deep-dive-5ak1</link>
      <guid>https://dev.to/nghxni/lightesb-http-listener-and-request-routing-undertow-httprequestsrv-deep-dive-5ak1</guid>
      <description>&lt;h2&gt;
  
  
  Metadata
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Applicable Version: &lt;code&gt;HttpRequestSrv@v1.0.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Publish Date: &lt;code&gt;2026-04-08&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Article Type: &lt;code&gt;Technical Deep Dive&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Related Service: &lt;code&gt;HttpRequestSrv@v1.0.0@http-request-route.xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a service needs to expose HTTP APIs in LightESB, the route XML itself is only half of the picture.&lt;br&gt;&lt;br&gt;
The other half is the runtime listener switch: &lt;code&gt;HTTP.Listener&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This article explains how &lt;code&gt;HTTP.Listener&lt;/code&gt;, &lt;code&gt;server.port&lt;/code&gt;, and Undertow endpoints work together by using &lt;code&gt;HttpRequestSrv&lt;/code&gt; as a concrete example.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why &lt;code&gt;HTTP.Listener&lt;/code&gt; Matters
&lt;/h2&gt;

&lt;p&gt;In LightESB, Undertow component registration is controlled by configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HTTP.Listener=true&lt;/code&gt;: register Undertow and expose HTTP routes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HTTP.Listener=false&lt;/code&gt;: skip Undertow registration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.port&lt;/code&gt;: runtime listening port for route endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From &lt;code&gt;HttpRequestSrv/v1.0.0/common.config.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;server.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;18083&lt;/span&gt;
&lt;span class="py"&gt;HTTP.Listener&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;system.components&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;undertowhttp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This design lets teams decide whether a service is externally reachable without modifying route XML files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route Entry Design in &lt;code&gt;HttpRequestSrv&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;HttpRequestSrv&lt;/code&gt; defines two Undertow entries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"undertow:http://0.0.0.0:{{server.port}}/api/httprequest/test?httpMethodRestrict=POST"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"undertow:http://0.0.0.0:{{server.port}}/api/test?httpMethodRestrict=POST"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0.0.0.0&lt;/code&gt; listens on all NICs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{server.port}}&lt;/code&gt; injects environment-level port&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;httpMethodRestrict=POST&lt;/code&gt; ensures method-level guard at the endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a clean pattern for API entry routes: reject invalid methods early and keep business processors focused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request Flow: Listener -&amp;gt; Route -&amp;gt; Downstream Call
&lt;/h2&gt;

&lt;p&gt;The first route acts as both inbound listener and outbound requester:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receive external request on &lt;code&gt;/api/httprequest/test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Log request start with &lt;code&gt;servicelog&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Forward to local endpoint &lt;code&gt;http://0.0.0.0:18083/api/test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Log completion and return response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Core segment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;to&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"servicelog:info?message=开始处理HTTP请求&amp;amp;amp;showBody=true&amp;amp;amp;maxBodyLength=500"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;to&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"http://0.0.0.0:18083/api/test?httpMethod=POST&amp;amp;amp;contentType=application/json&amp;amp;amp;bridgeEndpoint=true&amp;amp;amp;connectTimeout=5000&amp;amp;amp;socketTimeout=30000"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;to&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"servicelog:info?message=HTTP请求完成&amp;amp;amp;showBody=true&amp;amp;amp;maxBodyLength=5000"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second route handles &lt;code&gt;/api/test&lt;/code&gt; and returns a fixed JSON payload for quick verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Validation with cURL
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:18083/api/httprequest/test"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;orderId&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;A1001&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;amount&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:199.9}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request enters &lt;code&gt;http-request-route&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;route forwards to &lt;code&gt;/api/test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;response body returns &lt;code&gt;{"message": "HTTP Response Test"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;request logs are visible through &lt;code&gt;servicelog&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Failures and How to Diagnose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) API not reachable
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;HTTP.Listener&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.port&lt;/code&gt; is valid and not occupied&lt;/li&gt;
&lt;li&gt;startup logs include Undertow registration success&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2) Port conflict
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;another process already binds the same port&lt;/li&gt;
&lt;li&gt;release lifecycle did not clean previous context on hot reload&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) 405 or route miss
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;method is not in &lt;code&gt;httpMethodRestrict&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;request path does not match route URI exactly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep listener behavior configurable through properties, not hard-coded&lt;/li&gt;
&lt;li&gt;Start with strict &lt;code&gt;httpMethodRestrict&lt;/code&gt; to reduce invalid traffic&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;jsonResponseProcessor&lt;/code&gt; when multilingual JSON output is required&lt;/li&gt;
&lt;li&gt;Keep one service-level log at route entry for observability and incident triage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nghxni/lightesb-camel.git" rel="noopener noreferrer"&gt;LightESB Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>architecture</category>
      <category>backend</category>
      <category>networking</category>
    </item>
    <item>
      <title>LightESB Timer : From Scheduled Triggers to Service-Level Observability</title>
      <dc:creator>Alone Star</dc:creator>
      <pubDate>Wed, 08 Apr 2026 02:59:41 +0000</pubDate>
      <link>https://dev.to/nghxni/lightesb-timer-from-scheduled-triggers-to-service-level-observability-4ea1</link>
      <guid>https://dev.to/nghxni/lightesb-timer-from-scheduled-triggers-to-service-level-observability-4ea1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TL;DR&lt;br&gt;&lt;br&gt;
This technical deep dive explains how LightESB uses Apache Camel Timer routes for periodic jobs, structured status checks, and service-level observability with &lt;code&gt;servicelog&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
It also shows how &lt;code&gt;jsonResponseProcessor&lt;/code&gt; improves UTF-8 response behavior in Chinese output scenarios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many integration tasks are time-driven rather than request-driven: health checks, cache refresh, batch processing, and heartbeat jobs.&lt;br&gt;&lt;br&gt;
In LightESB, Apache Camel &lt;code&gt;timer&lt;/code&gt; endpoints provide a low-friction way to run those tasks while keeping route logic explicit and versioned.&lt;/p&gt;

&lt;p&gt;This post is based on real sample routes in the repository (&lt;code&gt;timer/v1.0.0&lt;/code&gt; and &lt;code&gt;timer/v1.0.1&lt;/code&gt;) and focuses on practical production patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Timer routes in LightESB
&lt;/h2&gt;

&lt;p&gt;Using Timer routes gives three immediate benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decentralized scheduling in route definitions (&lt;code&gt;period&lt;/code&gt; configured where logic lives)&lt;/li&gt;
&lt;li&gt;Easy version evolution (&lt;code&gt;v1.0.0&lt;/code&gt; -&amp;gt; &lt;code&gt;v1.0.1&lt;/code&gt;) per service package&lt;/li&gt;
&lt;li&gt;Fast observability through &lt;code&gt;log&lt;/code&gt; + &lt;code&gt;servicelog&lt;/code&gt; with structured payloads&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  v1.0.0 baseline: minimal but reliable
&lt;/h2&gt;

&lt;p&gt;The baseline sample introduces two periodic routes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A health-style message every 10 seconds&lt;/li&gt;
&lt;li&gt;A structured status payload every 15 seconds
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;route&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"independent-timer-test-v1.0.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"timer:independentTest?period=10000"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;setBody&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;constant&amp;gt;&lt;/span&gt;Timer route is alive&lt;span class="nt"&gt;&amp;lt;/constant&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/setBody&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;to&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"log:independent-context?level=INFO"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/route&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;route&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"independent-status-check-v1.0.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;from&lt;/span&gt; &lt;span class="na"&gt;uri=&lt;/span&gt;&lt;span class="s"&gt;"timer:statusCheck?period=15000"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;setBody&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;simple&amp;gt;&lt;/span&gt;{"file":"timer-test-routes.xml","status":"ACTIVE","timestamp":"${date:now:yyyy-MM-dd HH:mm:ss}"}&lt;span class="nt"&gt;&amp;lt;/simple&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/setBody&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;log&lt;/span&gt; &lt;span class="na"&gt;message=&lt;/span&gt;&lt;span class="s"&gt;"Independent context status: ${body}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/route&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  v1.0.1 evolution: service-level diagnostics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) &lt;code&gt;servicelog&lt;/code&gt; for independent service logs
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;servicelog&lt;/code&gt; is a LightESB custom logging component designed for independent service-level logging.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better per-service log isolation&lt;/li&gt;
&lt;li&gt;Better control with service-oriented log levels&lt;/li&gt;
&lt;li&gt;Safer body visibility through output controls (&lt;code&gt;showBody&lt;/code&gt;, &lt;code&gt;maxBodyLength&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Structured status with version field
&lt;/h3&gt;

&lt;p&gt;The status payload explicitly includes &lt;code&gt;version&lt;/code&gt;, making diagnostics and dashboards version-aware.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) &lt;code&gt;jsonResponseProcessor&lt;/code&gt; for encoding quality
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;jsonResponseProcessor&lt;/code&gt; is a LightESB custom component used to improve UTF-8 response handling, especially in Chinese text scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Period and route design recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;period=5000&lt;/code&gt;: local validation and fast integration debugging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;period=30000&lt;/code&gt;: common heartbeat and lightweight periodic tasks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;period=1500000&lt;/code&gt;: low-frequency summary checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use business latency requirements to determine period values, not default habits.&lt;/p&gt;

&lt;p&gt;For payloads, keep at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt; or source identifier&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Timer is a good fit
&lt;/h2&gt;

&lt;p&gt;Good fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed-interval tasks (checks, syncs, cleanup, summaries)&lt;/li&gt;
&lt;li&gt;Jobs that do not require strict centralized scheduling&lt;/li&gt;
&lt;li&gt;Services that benefit from embedded, versioned scheduling logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not a good fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strict timing consistency and high-precision scheduling&lt;/li&gt;
&lt;li&gt;Complex DAG orchestration with advanced dependency constraints&lt;/li&gt;
&lt;li&gt;Workloads that must be controlled by an external scheduling platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supplemental reference
&lt;/h2&gt;

&lt;p&gt;For endpoint parameters such as &lt;code&gt;period&lt;/code&gt;, &lt;code&gt;delay&lt;/code&gt;, &lt;code&gt;repeatCount&lt;/code&gt;, and &lt;code&gt;fixedRate&lt;/code&gt;, use the official documentation:&lt;br&gt;&lt;br&gt;
&lt;a href="https://camel.apache.org/components/3.22.x/timer-component.html" rel="noopener noreferrer"&gt;Apache Camel Timer Component&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/nghxni/lightesb-camel.git" rel="noopener noreferrer"&gt;lightesb-camel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this deep dive is helpful, please star the project and share your timer patterns.&lt;/p&gt;

</description>
      <category>esb</category>
      <category>camel</category>
      <category>scheduled</category>
      <category>java</category>
    </item>
  </channel>
</rss>
