發掘Apache Camel的力量

最近幾年,ESB軟件越來越受歡迎。 如果大多數人通常知道什么是ESB,那么他們很少會清楚地了解這種體系結構的不同組件的確切作用。

例如,Apache ServiceMix由三個主要組件組成:Apache Karaf(OSGI容器),Apache ActiveMQ(消息代理)和Apache Camel。 順便問一下,駱駝到底是什么? 什么是“ routing and mediation engine ”? 有什么用?

我已經與Camel合作了大約一年,我認為-盡管根本不是Camel專家,但我現在有足夠的后見之明,可以使用一些非常具體的示例讓您發現Camel的興趣和力量。為了清楚起見,在本文的其余部分中,我將使用Spring DSL –假設讀者熟悉Spring語法。

用例

讓我們想象一下,我們想使用Camel實現以下場景。 產品信息請求將以平面文件(CSV格式)的形式發送到特定文件夾中。 該文件的每一行都包含特定客戶關于特定汽車型號的單個請求。 我們希望向這些客戶發送有關他們感興趣的汽車的電子郵件。為此,我們首先需要調用Web服務以獲取其他客戶數據(例如,他們的電子郵件)。 然后,我們必須從數據庫中獲取汽車特性(讓我們說一個文本)。 由于我們希望郵件看起來像樣(例如HTML),因此也需要進行小的文本轉換。

當然,我們不希望僅對請求進行順序處理,而是希望引入一些并行性。 同樣,我們也不想多次將完全相同的郵件發送給不同的客戶(而是將相同的唯一郵件發送給多個收件人)。 利用我們后端的集群功能來平衡對Web服務的調用也將是一件很不錯的事情。 最后,在處理請求失敗的情況下,我們希望以某種方式跟蹤原始請求,以便例如可以通過郵政發送。
一個(可能的)駱駝實現:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://camel.apache.org/schema/springhttp://camel.apache.org/schema/spring/camel-spring.xsd "
><camelContext xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="myDLQ"><!-- 2 redeliveries max before failed message is placed into a DLQ   --><errorHandler id="myDLQ" type="DeadLetterChannel" deadLetterUri="activemq:queue:errors" useOriginalMessage="true"><redeliveryPolicy maximumRedeliveries="2"/></errorHandler><!-- The polling of a specific folder every 30 sec --><route id="route1"><from uri="file:///Users/bli/folderToPoll?delay=30000&delete=true"/><unmarshal><csv/></unmarshal><split><simple>${body}</simple><setHeader headerName="customerId"><simple>${body[1]}</simple></setHeader><setHeader headerName="carModelId"><simple>${body[2]}</simple></setHeader><setBody><simple>${body[0]}</simple></setBody><to uri="activemq:queue:individualRequests?disableReplyTo=true"/></split></route><!-- The consumption of individual (jms) mailing requests --><route id="route2"><from uri="activemq:queue:individualRequests?maxConcurrentConsumers=5"/><pipeline><to uri="direct:getCustomerEmail"/><to uri="direct:sendMail"/></pipeline></route><!-- Obtain customer email by parsing the XML response of a REST web service --><route id="route3"><from uri="direct:getCustomerEmail"/><setBody><constant/></setBody><loadBalance><roundRobin/><to uri="http://backend1.mycompany.com/ws/customers?id={customerId}&authMethod=Basic&authUsername=geek&authPassword=secret"/><to uri="http://backend2.mycompany.com/ws/customers?id={customerId}&authMethod=Basic&authUsername=geek&authPassword=secret"/></loadBalance><setBody><xpath resultType="java.lang.String">/customer/general/email</xpath></setBody></route><!-- Group individual sendings by car model --><route id="route4"><from uri="direct:sendMail"/><aggregate strategyRef="myAggregator" completionSize="10"><correlationExpression><simple>header.carModelId</simple></correlationExpression><completionTimeout><constant>60000</constant></completionTimeout><setHeader headerName="recipients"><simple>${body}</simple></setHeader><pipeline><to uri="direct:prepareMail"/><to uri="direct:sendMailToMany"/></pipeline></aggregate></route><!-- Prepare the mail content --><route id="route5"><from uri="direct:prepareMail"/><setBody><simple>header.carModelId</simple></setBody><pipeline><to uri="sql:SELECT xml_text FROM template WHERE template_id =# ?dataSourceRef=myDS"/><to uri="xslt:META-INF/xsl/email-formatter.xsl"/></pipeline></route><!-- Send a mail to multiple recipients --><route id="route6"><from uri="direct:sendMailToMany"/><to uri="smtp://mail.mycompany.com:25?username=geek&password=secret&from=no-reply@mycompany.com&to={recipients}&subject=Your request&contentType=text/html"/><log message="Mail ${body} successfully sent to ${headers.recipients}"/></route></camelContext><!-- Pure Spring beans referenced in the various Camel routes --><!-- The ActiveMQ broker --><bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"><property name="brokerURL" value="tcp://localhost:61616"/></bean><!-- A datasource to our database --><bean id="myDS" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="org.h2.Driver"/><property name="url" value="jdbc:h2:file:/Users/bli/db/MyDatabase;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0"/><property name="username" value="sa"/><property name="password" value="sa"/></bean><!-- An aggregator implementation --><bean id="myAggregator" class="com.mycompany.camel.ConcatBody"/></beans>

和(僅!)Java類的代碼:

public class ConcatBody implements AggregationStrategy {public static final String SEPARATOR = ", ";public Exchange aggregate(Exchange aggregate, Exchange newExchange) {if (aggregate == null) {// The aggregation for the very exchange item is the exchange itselfreturn newExchange;} else {// Otherwise, we augment the body of current aggregate with new incoming exchangeString originalBody = aggregate.getIn().getBody(String.class);String bodyToAdd = newExchange.getIn().getBody(String.class);aggregate.getIn().setBody(originalBody + SEPARATOR + bodyToAdd);return aggregate;}	}}

一些解釋

  • route1 ”處理傳入的平面文件。 文件內容首先被解組(使用CSV格式),然后分成行/記錄。 每行都將變成一個單獨的通知,該通知將發送到JMS隊列。
  • route2 ”正在使用這些通知。 基本上,完成一個請求意味著依次執行兩件事(“管道”):獲取客戶電子郵件(route3)并向他發送郵件(route4)。 請注意“ maxConcurrentConsumers”參數,該參數用于輕松滿足我們的并行性要求。
  • route3 ”對如何獲取客戶電子郵件進行建模:只需通過解析(使用XPath)在兩個后端節點上可用的(安全的)REST Web服務的XML響應即可。
  • route4 ”包含發送大量郵件的邏輯。 每次收集到10個類似的發送請求(在我們的示例中,是對同一輛汽車的10個請求)(并且我們不準備等待超過1分鐘),我們希望整個過程以新消息繼續進行(或“駱駝語”中的“交換”是10條組合消息的串聯。 繼續該過程意味著:首先準備郵件正文(路由5),然后將其發送到組(路由6)。
  • 在“ route5 ”中,發出SQL查詢,以便根據汽車型號獲得適當的文本。 在該結果上,我們應用了一個小的XSL-T轉換(它將用xsl轉換的輸出替換當前交換主體)。
  • 當輸入“ route6 ”時,交換包含我們所需的一切。 我們有收件人列表(作為標頭),也有(正文中)要發送的html文本。 因此,我們現在可以繼續使用SMTP協議進行實際發送。
  • 如果出現錯誤(例如臨時網絡問題)–在整個過程中的任何地方,Camel都會在放棄之前最多進行兩次其他嘗試。 在后一種情況下,始發消息將由Camel自動放置到JMS死信隊列中。

結論

駱駝確實是一個很棒的框架–并不完美,但仍然很棒。 您會驚訝地看到,只需幾行代碼即可對復雜的場景或路線進行建模。 您也可能很高興看到您的代碼多么清晰,同事們能夠多快地理解您的路線邏輯。

但這當然不是主要優勢。 使用Camel主要是邀請您考慮企業集成模式(又稱“ EIP”); 它可以幫助您使用眾所周知的成熟技術將原始復雜性分解為不太復雜(可能是并發)的子路由,從而實現更模塊化,更靈活的實現。 特別是,使用去耦技術可以簡化解決方案中單個零件或組件的替換或重構。

參考:從我們的W4G合作伙伴 Bernard Ligny中 發現Apache Camel的功能 。

翻譯自: https://www.javacodegeeks.com/2012/12/discovering-the-power-of-apache-camel.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unix/linux系統中文件分為哪些類型?,到底該如何理解 Unix/Linux 的文件系統?看這篇就知道了...

原標題&#xff1a;到底該如何理解 Unix/Linux 的文件系統&#xff1f;看這篇就知道了作者&#xff1a;舠

【Luogu】P1131時態同步(樹形DP)

題目鏈接 甚矣吾衰也&#xff01;這么簡單的DP我都不會了 太恐怖了 樹形DP&#xff0c;從子樹里選出時間最長的來&#xff0c;剩下的調到這個最長時間即可。 #include<cstdio> #include<cctype> #include<algorithm> #include<cstring>using std::max;…

HTML小記

1、頁面內跳轉 當<a>元素用于頁面內的錨點跳轉時&#xff0c;應該先為該頁面設置一些錨點&#xff0c;而定義錨點有兩種辦法&#xff1a; 通過<a>元素的name屬性來定義&#xff0c;如&#xff1a;<a name"anchor-name">name屬性的值就是錨點的名…

python3連接數據庫失敗_python3使用pymysql連接mysql數據庫報Keyerror

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓不好意思Traceback (most recent call last):File "d:\Python\practice2\mydbconn.py", line 5, in conn pymysql.connect(usertestuser, passwdtestpasswd,host192.168.1.3, dbtest,charsetutf8)File "C:\Users\t…

MantisBT 問題分配顯示 姓名

MantisBT 在提交問題的時候&#xff0c;系統默認“分配”給備選賬號&#xff0c;而不是姓名。這樣在使用的時候很不便。能夠通過改動配置文件來改變&#xff0c;找到MantisBT根文件夾下文件config_inc.php&#xff0c;用文本編輯器打開。代碼例如以下&#xff1a; <?php $g…

使用多種MIME類型測試REST

1.概述 本文將重點介紹測試具有多種媒體類型/表示形式的RESTful服務。 這是關于使用Spring和基于Java的配置的Spring Security設置安全的RESTful Web Service的系列文章的第十篇。 REST with Spring系列&#xff1a; 第1部分 – 使用Spring 3.1和基于Java的配置引導Web應用程序…

firewallD卸載Linux,在Ubuntu 18.04/16.04系統上安裝和使用Firewalld的方法

本文介紹Firewalld在Ubuntu 18.04或Ubuntu 16.04發行版上的安裝方法及基本用法。簡介Firewalld是Linux防火墻管理工具&#xff0c;支持IPv4、IPv6、以太網橋和IPSet防火墻設置&#xff0c;它充當Linux內核的netfilter框架的前端&#xff0c;同時Firewalld是RHEL 7系列上的默認防…

JavaWeb學習中的小問題

1. HttpServletRequest和ServletRequest之間的區別&#xff1f; 再看別人項目的時候突然看到一句&#xff1a; ServletRequest request&#xff1b;HttpServletRequest hsRequest (HttpServletRequest) request;// 獲取HttpServletRequest對象瞬間就有一點懵逼 &#xff0c;趕…

python 結構數組_Python數組

數組是一個容器&#xff0c;它可以容納一定數量的項目&#xff0c;這些項目是相同的類型。 大部分數據結構都使用數組來實現它們的算法。 以下是理解數組(Array)概念的重要術語。元素 - 存儲在數組中的每個項目稱為元素。索引 - 數組中元素的每個位置都有一個數字索引&#xff…

廣播 布局文件代碼

<?xml version"1.0" encoding"utf-8"?><RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.android.com/apk/res-auto" xmlns:tools"http://schemas.android.com/…

PCGen的垃圾收集分析

介紹 我決定結合我的兩個軟件愛好&#xff0c;并在PCGen上進行一些分析&#xff0c; PCGen是一種流行的基于Java的開放源代碼角色生成器&#xff0c;用于角色扮演游戲。 我用Censum &#xff0c;我們&#xff08; jClarity的&#xff09;新的垃圾收集日志分析工具來進行分析。 …

THINKPHP增刪改查--(改)

1.CURD 控制器?>namespace Home\Controller;use Think\Controller;class CurdController extends Controller{ public function index(){ $db_student D(Student); $data_student $db_student->relation(true)->select();// dump($data_student); $this->assign…

Linux監控CPU關閉服務器,監控Linux服務器CPU和內存

利用腳本獲取Linux服務器的CPU和內存。需要安裝bc計算器yum install -y bc創建執行腳本計算CPU利用率&#xff0c;配置了5秒采樣。執行腳本&#xff0c;5秒后輸出采集日期|CPU負載|可用內存|總內存#!/bin/sh##echo user nice system idle iowait irq softirqCPULOG_1$(cat /pro…

springboot不會運行gc_SpringBoot 和JVM 調優(深度好文,建議收藏)

點擊上方[全棧開發者社區]→右上角[...]→[設為星標?]項目調優作為一名工程師&#xff0c;項目調優這事&#xff0c;是必須得熟練掌握的事情。在SpringBoot項目中&#xff0c;調優主要通過配置文件和配置JVM的參數的方式進行。一、修改配置文件關于修改配置文件 application.p…

移動端原生js,css3實現輪播圖

一、功能需求 1、自動播放2、滑動切換3、點擊切換 二、思路分析 html代碼&#xff1a; <div class"container">   <ul class"list clearfix">   <li class"item fl item5">圖5</li>   <li class"item fl …

關于換行這個動作,win 和 mac 的實現

‘\r是回車&#xff0c;前者使光標到行首&#xff0c;&#xff08;carriage return&#xff09;\n是換行&#xff0c;后者使光標下移一格&#xff0c;&#xff08;line feed&#xff09;\r 是回車&#xff0c;return\n 是換行&#xff0c;newline對于換行這個動作&#xff1a;u…

你好駱駝:自動文件傳輸

Apache Camel在其主頁上 &#xff08;以及Camel用戶指南中 &#xff09;將其描述為“基于已知企業集成模式的通用開源集成框架”。 Camel框架基于《 企業集成模式 》一書&#xff0c;并提供了該書中描述的模式的實現 。 我看一下這篇文章中使用Camel的“ Hello World”類型示例…

Linux 常用命令二 pwd cd

一、pwd命令 顯示整個路徑名&#xff1a; wangwang:~$ pwd /home/wang 二、cd命令 切換到其他路徑&#xff08;相對路徑方式&#xff09;&#xff1a; wangwang:~$ cd workpalce/ wangwang:~/workpalce$ pwd /home/wang/workpalce 切換到其他路徑&#xff08;絕對路徑方式&…

3dobject用什么打開_第一次用開塞露是什么感覺?網友:像打開了新世界的大門

第一次用開塞露是什么感覺&#xff1f;網友:像打開了新世界的大門我媽說我小時候便秘去醫院&#xff0c;醫生給開了支開塞露&#xff0c;然后在醫院的公廁里使用的&#xff0c;我媽的描述是:“要不是我手挪走的快點&#xff0c;就直接噴我手了”。。。。。。。。。。。。。。。…

linux root郵箱地址,linux – 如何將root的電子郵件轉發到外部電子郵件地址?

我家里有一臺小型服務器(Ubuntu 10.04),我想將root的電子郵件轉發到我的gmail托管域,以獲取安全通知,什么不是.我把所有東西都撕掉了,然后從頭開始跑到other issues.我現在有sendmail工作,我可以發郵件到someexternal.com并收到郵件.但是,向/root/.forward添加地址實際上并不轉…