JBoss Fuse - แนวคิดเกี่ยวกับอูฐ

ในบทนี้เราจะเข้าใจแนวคิดเกี่ยวกับอูฐที่แตกต่างกัน ให้เราเริ่มต้นด้วยการยกตัวอย่างพื้นฐานเพื่อทำความเข้าใจแนวคิดหลักเพื่อเริ่มต้นด้วย

CamelContext

ทุกแอปพลิเคชันอูฐจะมี CamelContext อย่างน้อยหนึ่งตัว นี่คือสถานที่ที่เราเพิ่มเส้นทางอูฐ มันคล้ายกับApplicationContext ของฤดูใบไม้ผลิ

บริบทของอูฐถือได้ว่าเป็นภาชนะที่เก็บทุกสิ่งไว้ด้วยกัน บริบทอูฐหนึ่งตัวสามารถมีได้หลายเส้นทางภายในนั้น

เส้นทาง

CamelContext อาจมีเส้นทางอย่างน้อยหนึ่งเส้นทาง Routes คือตรรกะการรวมที่กำหนดว่าข้อมูลจะไหลในบริบทอูฐจากจุดสิ้นสุดหนึ่งไปยังอีกจุดหนึ่งอย่างไร

จุดสิ้นสุด

Endpoint คือจุดสิ้นสุดของช่องสัญญาณที่ระบบสามารถส่งหรือรับข้อความได้ นี่คือสิ่งที่เราเรียกว่าปลายทางหรือต้นทางในภาษาสื่อสาร

ส่วนประกอบ

ส่วนประกอบเป็นจุดขยายของ Camel ส่วนประกอบอาจเป็นส่วนต่อประสานกับเทคโนโลยีรูปแบบข้อมูลหม้อแปลง ฯลฯ นอกจากนี้ยังอาจทำหน้าที่เป็นโรงงานสำหรับอุปกรณ์ปลายทาง

EIP

EIP ย่อมาจาก Enterprise Integration Pattern สิ่งเหล่านี้เป็นวิธีที่ระบุและเป็นที่รู้จักกันดีสำหรับปัญหาที่เกิดซ้ำ Camel รองรับรูปแบบการรวมองค์กรส่วนใหญ่

เราเตอร์ตามเนื้อหา

รูปแบบ CBR ช่วยให้เราสามารถกำหนดเส้นทางข้อมูลตามเนื้อหาของไฟล์อินพุต

รูปแบบนี้ใช้เมื่อเราต้องกำหนดเส้นทางค่าขึ้นอยู่กับเนื้อหาของเนื้อหาที่ป้อนข้อมูล

ตัวอย่างต่อไปนี้จะอ่านข้อมูลจาก D:/data/inputไดเรกทอรี หลังจากอ่านแล้วระบบจะตรวจสอบแท็กค่าภายในแท็กข้อมูล หากแท็กค่ามีvalue1มันจะถูกส่งไปที่ D:/value1, ถ้ามี value2มันจะถูกส่งไปที่ D:/value2 และหากไม่มีทั้งสองอย่างนี้ก็จะถูกส่งไปยังผู้อื่น

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/data/input"/>
      <choice>
         <when>
            <xpath>/data/value = 'value1'</xpath>
            <to uri = "file:///D:/value1"/>
         </when> 
         <when>
            <xpath>/data/value = 'value2'</xpath>
            <to uri = "file:///D:/value2"/>
         </when>  
			
         <otherwise>
            <to uri = "file:///D:/others "/>
         </otherwise>
			
      </choice>
   </route>
</camelContext>

Input

D: /data/input/message1.xml

<data>
   <value>value1</value>
</data>

D: /data/input/message2.xml

<data>
   <value>value2</value>
</data>

Output

D: / ค่า 1 /

<data>
   <value>value1</value>
</data>

D: / ค่า 2 /

<data>
   <value>value2</value>
</data>

ตัวแยก

รูปแบบตัวแยกใช้เพื่อแบ่งข้อมูลอินพุตออกเป็นชิ้นเล็ก ๆ

รูปแบบนี้ใช้เป็นส่วนใหญ่กับการป้อนข้อมูลขนาดใหญ่ซึ่งจำเป็นต้องแยกเป็นชิ้น ๆ จึงจะสามารถดำเนินการได้ แบ่งอินพุตออกเป็นเศษเล็กเศษน้อยตามสตริงโทเค็นอินพุต

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/inbox"/>
      <split streaming = "true">
         <tokenize token = "order" xml = "true"/>
         <to uri = "activemq:queue:order"/>
      </split>
   </route>
</CamelContext>

Input

D: /inbox/message.xml

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

Output

หากคุณตรวจสอบ AMQ คุณจะพบ 3 ข้อความที่โพสต์

<order>
   <data>
      <value>value4</value>
   </data>
</order>

รายชื่อผู้รับ

รูปแบบรายชื่อผู้รับถูกใช้เมื่อต้องการดึงรายชื่อผู้รับจากเนื้อหาข้อความ

ในตัวอย่างต่อไปนี้ข้อความจะถูกส่งไปยังผู้รับทั้งหมดที่มีรายชื่ออยู่ในแท็กลูกค้าเป็นรายการสตริงที่คั่นด้วยจุลภาค

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "jms:xmlOrders" />
      <recipientList>
         <xpath>/order/customer</xpath>
      </recipientList>
   </route>
</camelContext>

EIP อื่น ๆ

Camel ให้การสนับสนุน EIP เกือบทั้งหมดที่ระบุ EIP ที่ใช้กันทั่วไปมีดังต่อไปนี้

  • Log - เพื่อบันทึกข้อความทั้งหมดหรือบางส่วน

  • Message Filter - การกรองเนื้อหาของข้อความ

  • Re-Sequencer - เพื่อรับโทเค็นทั้งหมดตามลำดับ

  • Wiretap - เพื่อตรวจสอบข้อความการเดินทาง

รายชื่อ EIP ทั้งหมดและการใช้งานมีอยู่ในเอกสารอย่างเป็นทางการของ Camel http://camel.apache.org/eip.html

การจัดการข้อยกเว้นในอูฐ

Using Error Handler - นี่เป็นวิธีที่ง่ายที่สุดในการจัดการข้อยกเว้นในอูฐ

ในการใช้สิ่งนี้เราต้องกำหนดค่าคลาสตัวจัดการข้อผิดพลาดและระบุเป็นการอ้างอิงถึง CamelContext errorHandlerRef แอตทริบิวต์

<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler">
   <property name = "logName" value = "mylogger.name"/>
   <property name = "level" value = "DEBUG"/>
</bean>

<camelContext errorHandlerRef = ” loggingErrorHandler” >
   …
</camelContext>

ใช้ Try Catch ในที่สุด

Camel ยังรองรับรูปแบบ Java Try Catch Finally block สำหรับการจัดการข้อผิดพลาด

เช่นเดียวกับ Java มีสามบล็อกต่อไปนี้ -

  • doTry บล็อกมีรหัสที่อาจสร้างข้อยกเว้น

  • doCatch บล็อกมีรหัสที่ต้องดำเนินการในกรณีที่มีข้อยกเว้น

  • doFinallyบล็อกมีรหัสที่ต้องดำเนินการโดยไม่คำนึงถึงข้อยกเว้น มันจะถูกดำเนินการเสมอไม่ว่าจะมีการยกเว้นหรือไม่ก็ตาม

Note- Mock เป็นส่วนประกอบการทดสอบและไม่แนะนำสำหรับวัตถุประสงค์อื่น เป็นส่วนประกอบในอูฐที่ใช้ในการทดสอบเช่นเดียวกับส่วนประกอบ jMOck ในการพัฒนาแบบทดสอบ

<route>
   <from uri = "direct:start"/>
   <doTry>
      <process ref = "someProcesorThatmayFail"/>
      <to uri = "mock:result"/>
		
      <doCatch>
         <exception>java.io.IOException</exception>
         <exception>java.lang.IllegalStateException</exception>
         <to uri = "mock:catch"/>
      </doCatch>
		
      <doFinally>
         <to uri = "mock:finally"/>
      </doFinally>
		
   </doTry>
</route>

ในตัวอย่างข้างต้นเราสามารถให้รายการข้อยกเว้นที่ต้องจัดการโดยบล็อกการจับ

การปรับใช้ Bundle ใน Fuse

เริ่มฟิวส์โดยใช้ Fuse.bat/start.bat.

หากคุณเริ่ม Fuse โดยใช้ start.bat ให้ใช้ client.bat เพื่อเชื่อมต่อกับ Fuse คุณควรได้รับ UI ดังที่แสดงในภาพหน้าจอต่อไปนี้

นี่คือ CLI สำหรับการเข้าถึงคำสั่ง Karaf และ Fuse

install –s mvn:group.id /artifact.id/version 
e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT