Apache Camel教程– EIP,路由,組件,測試和其他概念的簡介

公司之間的數據交換增加了很多。 必須集成的應用程序數量也增加了。 這些接口使用不同的技術,協議和數據格式。 但是,這些應用程序的集成應以標準化的方式建模,有效實現并由自動測試支持。 企業集成模式(EIP)[1]中存在這樣的標準,該標準已成為描述,記錄和實現集成問題的行業標準。 Apache Camel [2]實現了EIP,并提供了標準化的內部特定于域的語言(DSL)[3]來集成應用程序。 本文對Apache Camel進行了介紹,其中包括一些代碼示例。

企業整合模式

EIP可用于將集成問題分解為較小的部分,并使用標準化圖形對其進行建模。 每個人都可以輕松理解這些模型。 此外,無需針對每個集成問題每次都重新發明輪子。

使用EIP,Apache Camel彌補了建模和實現之間的空白。 EIP模型與Apache Camel的DSL之間幾乎存在一對一的關系。 本文使用一個在線商店示例來說明EIP與Apache Camel的關系。

用例:在線商店中的訂單處理

通過實現一個小用例來介紹Apache Camel的主要概念。 閱讀本文后,開始自己的項目應該非常容易。 最簡單的入門方法是使用Maven原型[4]。 這樣,您可以在幾分鐘內重建以下示例。 當然,您也可以一次下載整個示例[5]。

圖1從EIP角度顯示了示例。 任務是處理在線商店的訂單。 訂單以csv格式到達。 首先,必須將訂單轉換為內部格式。 由于商店僅出售dvd和cd,因此必須拆分每個訂單的訂單項。 其他訂單項目將轉發給合作伙伴。

1 :EIP集成問題的觀點

此示例顯示了EIP的優點:集成問題分為幾個小的持久性子問題。 這些子問題每次都很容易理解和解決。 在描述了用例之后,我們現在來看一下Apache Camel的基本概念。

基本概念

Apache Camel在Java虛擬機(JVM)上運行。 大多數組件都是用Java實現的。 但是,這不是新組件的要求。 例如,駱駝標本組件是用Scala編寫的。 Spring框架在某些部分中使用,例如,用于事務支持。 但是,在2.9版[6]中,Spring依賴項已降至最低。 Apache Camel的核心很小,僅包含常用組件(即,幾種技術和API的連接器),例如Log,File,Mock或Timer。

由于Apache Camel的模塊化結構,可以輕松添加更多組件。建議Maven用于依賴項管理,因為大多數技術都需要附加庫。 不過,當然也可以手動下載庫并將其添加到類路徑中。

Apache Camel的核心功能是其路由引擎。 它根據相關路由分配消息。 路由包含流和集成邏輯。 它是使用EIP和特定的DSL實現的。 每封郵件都包含一個正文,幾個標頭和可選附件。 消息從提供者發送到消費者。 在兩者之間,可以對消息進行處理,例如過濾或變換。 圖1顯示了消息如何在路由內更改。

提供者和使用者之間的消息由消息交換容器管理,該容器包含唯一的消息ID,異常信息,傳入和傳出消息(即請求和響應)以及使用的消息交換模式(MEP)。 “僅輸入” MEP用于單向消息(例如JMS),而“輸入” MEP執行請求-響應通信,例如基于客戶端HTTP的請求及其來自服務器端的響應。

在簡短解釋了Apache Camel的基本概念之后,以下各節將提供更多詳細信息和代碼示例。 讓我們從Apache Camel的體系結構開始。

建筑

圖2顯示了Apache Camel的體系結構。 CamelContext提供運行時系統。 在內部,處理器處理端點之間的事務,例如路由或轉換。 端點連接了多種要集成的技術。 Apache Camel提供了不同的DSL來實現集成問題。

2 :Apache Camel的體系結構

駱駝語境

CamelContext是Apache Camel的運行時系統,并連接其不同的概念,例如路由,組件或端點。 以下代碼片段顯示了Java main方法,該方法啟動CamelContext并在30秒后停止它。 通常,CamelContext在加載應用程序時啟動,并在關機時停止。

public class CamelStarter {public static void main(String[] args) throws Exception {CamelContext context = new DefaultCamelContext();context.addRoutes(new IntegrationRoute());context.start();Thread.sleep(30000);context.stop();}}

運行時系統可以包含在JVM環境中的任何位置,包括Web容器(例如Tomcat),JEE應用服務器(例如IBM WebSphere AS),OSGi容器,甚至是云中。

領域特定語言

DSL通過使用更高的抽象級別來促進復雜項目的實現。 Apache Camel提供了幾種不同的DSL。 Java,Groovy和Scala使用面向對象的概念,并為大多數EIP提供了一種特定的方法。 另一方面,Spring XML DSL基于Spring框架并使用XML配置。 此外,OSGi藍圖XML可用于OSGi集成。

Java DSL具有最佳的IDE支持。 Groovy和Scala DSL與Java DSL類似,此外,它們還提供了現代JVM語言的典型功能,例如簡潔的代碼或閉包。 與這些編程語言相反,Spring XML DSL需要大量XML。 此外,它提供了非常強大的基于Spring的依賴項注入機制和漂亮的抽象來簡化配置(例如JDBC或JMS連接)。 在大多數使用情況下,選擇純粹是一個品味問題。 甚至可以組合。 許多開發人員使用Spring XML進行配置,而路由是通過Java,Groovy或Scala實現的。 路線

路線是Apache Camel的關鍵部分。 此處指定了集成的流程和邏輯。 以下示例顯示了使用Java DSL的路由:

public class IntegrationRoute extends RouteBuilder {@Overridepublic void configure() throws Exception {from(“file:target/inbox”).process(new LoggingProcessor()).bean(new TransformationBean(), “makeUpperCase”)                                             .to(“file:target/outbox/dvd”);}}

DSL易于使用。 每個人都應該甚至不了解Apache Camel就能理解上面的示例。 該路線實現了所述用例的一部分。 訂單從外部來源放置在文件目錄中。 處理訂單,最后將其移動到目標目錄。

路由必須擴展“ RouteBuilder”類并覆蓋“ configure”方法。 路由本身以“ from”端點開始,并在一個或多個“ to”端點處結束。 在這兩者之間,將實現所有必要的過程邏輯。 一個“配置”方法中可以實現任意數量的路由。

以下代碼段顯示了通過Spring XML DSL實現的相同路由:

<beans … ><bean class=”mwea.TransformationBean” id=”transformationBean”/><bean class=”mwea.LoggingProcessor” id=”loggingProcessor”/><camelContext xmlns=”http://camel.apache.org/schema/spring”><package>mwea</package><route><from uri=”file:target/inbox”/><process ref=”loggingProcessor”/> <bean ref=”transformationBean”/><to uri=”file:target/outbox”/></route></camelContext></beans>

除了路線,Apache Camel的另一個重要概念是它的組件。 它們為幾乎所有技術提供集成點。

組件

同時,有超過100個組件可用。 除了HTTP,FTP,JMS或JDBC等廣泛的技術外,還支持更多技術,包括來自Amazon,Google,GoGrid和其他公司的云服務。 每個發行版中都添加了新組件。 通常,社區也很容易構建新的自定義組件。

Apache Camel的最驚人的功能是其均勻性。 所有組件都使用相同的語法和概念。 每次集成,甚至其自動單元測試都看起來相同。 因此,復雜度大大降低了。 考慮更改上面的示例:如果應該將訂單發送到JMS隊列而不是文件目錄,只需將“ to”端點從“ file:target / outbox”更改為“ jms:queue:orders”。 而已! (當然,必須先在應用程序中對JMS進行一次配置)

雖然組件提供了技術接口,但是可以使用處理器和Bean向路由添加自定義集成邏輯。

處理器和豆

除了使用EIP,您還必須經常添加單獨的集成邏輯。 這非常容易,并且始終使用相同的概念:處理器或Bean。 兩者都在上面的路線示例中使用。

處理器是一個簡單的Java界面,只有一種方法:“處理”。 在此方法內,您可以執行解決集成問題所需的任何事情,例如轉換傳入的消息,調用其他服務等等。

public class LoggingProcessor implements Processor {@Overridepublic void process(Exchange exchange) throws Exception {System.out .println(“Received Order: ” +exchange.getIn().getBody(String.class));}}

“ exchange”參數包含Message Exchange,其中包含傳入消息,傳出消息以及其他信息。 由于實現了Processor接口,因此您已經依賴于Camel API。 有時這可能是一個問題。 也許您已經擁有無法更改的現有集成代碼(即您無法實現Processor接口)? 在這種情況下,您可以使用Bean,也稱為POJO(普通的舊Java對象)。 您將收到傳入消息(這是方法的參數)并返回傳出消息,如以下片段所示:

public class TransformationBean {public String makeUpperCase(String body) {String transformedBody = body.toUpperCase();return transformedBody;
}}

上面的bean接收一個String,對其進行轉換,最后將其發送到下一個端點。 再次查看上面的路線。 傳入的消息是一個文件。 您可能想知道為什么這樣做? Apache Camel提供了另一個強大的功能:從頭開始包含150多個自動類型轉換器,例如FileToString,CollectionToObject []或URLtoInputStream。 順便說一句:可以輕松創建其他類型轉換器并將其添加到CamelContext [7]。

如果Bean僅包含一個方法,則甚至可以在路由中將其省略。 因此,上述調用也可以是.bean(new TransformationBean())而不是.bean(new TransformationBean(),“ makeUpperCase”)。

添加更多的企業集成模式

上面的路線在處理輸入訂單之前,先使用翻譯器EIP對其進行轉換。 除了這種轉換之外,還需要更多的工作來實現整個用例。 因此,在以下示例中使用了更多EIP:

public class IntegrationRoute extends RouteBuilder {@Overridepublic void configure() throws Exception {from(“file:target/inbox”).process(new LoggingProcessor()).bean(new TransformationBean()).unmarshal().csv().split(body().tokenize(“,”)).choice().when(body().contains(“DVD”)).to(“file:target/outbox/dvd”).when(body().contains(“CD”)).to(“activemq:CD_Orders”).otherwise().to(“mock:others”);}}

每個csv文件說明一個包含一個或多個訂單項的單個訂單。 camel-csv組件用于轉換csv消息。 之后,拆分器EIP分離消息正文的每個訂單項。 在這種情況下,將使用默認的分隔符(逗號)。 但是,復雜的正則表達式或腳本語言(例如XPath,XQuery或SQL)也可以用作拆分器。

每個訂單項目都必須發送到特定的處理單元(請記住:有DVD訂單,CD訂單和其他已發送給合作伙伴的訂單)。 基于內容的路由器EIP無需任何單獨的編碼工作即可解決此問題。 DVD訂單通過文件目錄處理,而CD訂單發送到JMS隊列。

在此示例中,ActiveMQ用作JMS實現。 要將ActiveMQ支持添加到Camel應用程序,只需為camel-activemq組件添加相關的maven依賴關系,或手動將JAR添加到類路徑中。 而已。 其他一些組件一次需要更多配置。 例如,如果要使用WebSphere MQ或其他JMS實現而不是ActiveMQ,則必須配置JMS提供程序。

除了dvds和cd以外,所有其他訂購商品都發送給合作伙伴。 不幸的是,該界面尚不可用。 相反,使用Mock組件暫時模擬此接口。

上面的示例令人印象深刻地展示了如何在一個路由中使用不同的接口(在本例中為File,JMS和Mock)。 盡管技術差異很大,但您始終會應用相同的語法和概念。

自動單元和集成測試

自動測試至關重要。 但是,它通常在集成項目中被忽略。 原因是由于幾種不同的技術而導致的過多的工作和很高的復雜性。

Apache Camel解決了這個問題:它通過JUnit擴展提供測試支持。 測試類必須擴展CamelTestSupport才能使用Camel強大的測試功能。 除了其他聲明外,還隱式支持模擬。 不需要其他模擬框架,例如EasyMock或Mockito。 您甚至可以模擬分別通過生產者或使用者模板將消息發送到路由或從路由接收消息。 使用該測試套件可以自動測試所有路線。 值得一提的是,每種技術的語法和概念都相同。

下面的代碼片段顯示了示例路線的單元測試:

public class IntegrationTest extends CamelTestSupport {@Beforepublic void setup() throws Exception {super.setUp();context.addRoutes(new IntegrationRoute());}@Testpublic void testIntegrationRoute() throws Exception {// Body of test message containing several order itemsString bodyOfMessage = “Harry Potter / dvd, Metallica / cd, Claus Ibsen –Camel in Action / book “;// Initialize the mock and set expected resultsMockEndpoint mock = context.getEndpoint(“mock:others”,MockEndpoint.class);mock.expectedMessageCount(1);mock.setResultWaitTime(1000);// Only the book order item is sent to the mock// (because it is not a cd or dvd)String bookBody = “Claus Ibsen – Camel in Action / book”.toUpperCase();mock.expectedBodiesReceived(bookBody);// ProducerTemplate sends a message (i.e. a File) to the inbox directorytemplate.sendBodyAndHeader(“file://target/inbox”, bodyOfMessage, Exchange.FILE_NAME , “order.csv”);Thread.sleep(3000);// Was the file moved to the outbox directory?File target = new File(“target/outbox/dvd/order.csv”);assertTrue(“File not moved!”, target.exists());// Was the file transformed correctly (i.e. to uppercase)?String content = context.getTypeConverter().convertTo(String.class, target);String dvdbody = “Harry Potter / dvd”.toUpperCase();assertEquals(dvdbody, content);// Was the book order (i.e. ?Camel in action“ which is not a cd or dvd) sent to the mock?mock.assertIsSatisfied();}}

setup方法創建一個CamelContext實例(并執行其他一些操作)。 之后,添加路由,以便可以對其進行測試。 測試本身會創建一個模擬并設定其期望值。 然后,生產者模板將消息發送到路由的“ from”端點。 最后,一些斷言驗證了結果。 該測試可以與其他JUnit測試相同的方式運行:直接在IDE中或在構建腳本中。 甚至敏捷的測試驅動開發(TDD)都是可能的。 首先,在實現相應的路由之前,必須編寫Camel測試。

如果您想了解有關Apache Camel的更多信息,第一個地址應該是“ Camel in Action”一書[8],其中詳細介紹了所有基礎知識和許多高級功能,包括每章的工作代碼示例。 胃口大開之后,讓我們現在討論何時使用Apache Camel…

系統集成的替代方法

圖3顯示了三種集成應用程序的選擇:

  • 自己的定制解決方案 :實施一個針對您的問題的單獨解決方案,而無需將問題分成幾小部分。 這可行,并且可能是小型用例的最快替代方案。 您必須自己編寫所有代碼。
  • 集成框架 :使用一個框架,該框架有助于使用幾種集成模式以標準化方式集成應用程序。 它大大減少了工作量。 每個開發人員都會很容易理解您的工作。 您不必每次都重新發明輪子。
  • 企業服務總線(ESB) :使用ESB集成您的應用程序。 在幕后,ESB通常還使用集成框架。 但是還有更多功能,例如業務流程管理,注冊表或業務活動監視。 通常,您可以在圖形用戶界面中配置路由和諸如此類的東西(您必須自行決定是否可以降低復雜性和工作量)。 通常,ESB是一個復雜的產品。 與使用輕量級集成框架相比,學習曲線要??高得多。 但是,因此您將獲得一個非常強大的工具,該工具應該可以滿足大型集成項目中的所有要求。

如果您決定使用集成框架,那么在JVM環境中您仍然可以選擇三種不錯的選擇:Spring Integration [9],Mule [10]和Apache Camel。 它們都是輕量級的,易于使用和實施EIP。 因此,它們提供了一種集成應用程序的標準化方法,即使在非常復雜的集成項目中也可以使用它們。 可以在[11]中找到這三個集成框架的更詳細的比較。

我個人最喜歡的是Apache Camel,這是因為它具有出色的Java,Groovy和Scala DSL,并結合了許多受支持的技術。 Spring Integration和Mule僅提供XML配置。 如果我需要Mule的某些獨特的連接器來連接專有產品(例如SAP,Tibco Rendevous,Oracle Siebel CRM,Paypal或IBM的CICS交易網關),則僅使用Mule。 如果僅需要集成廣泛的技術(例如FTP,HTTP或JMS),則僅在現有的Spring項目中使用Spring Integration。 在所有其他情況下,我將使用Apache Camel。

盡管如此:無論您選擇這些輕量級集成框架中的哪個,都可以通過輕松的工作輕松實現復雜的集成項目,這將帶來很多樂趣。 切記:繁瑣的ESB通常具有太多的功能,因此也有太多不必要的復雜性和工作量。 使用正確的工具完成正確的工作!

Apache Camel已準備好用于企業集成項目

Apache Camel已于2011年7月慶祝其第四個生日[12],它代表著一個非常成熟且穩定的開源項目。 它支持在企業項目中使用的所有要求,例如錯誤處理,事務,可伸縮性和監視。 也提供商業支持。

最重要的收獲是其可用的DSL,幾乎每種可考慮的技術都有許多組件,并且事實是,無論必須集成哪種技術,都可以始終使用相同的語法和概念(甚至用于自動測試)。 因此,應該始終將Apache Camel視為重量級ESB的輕量級替代品。 通過下載本文的示例開始。 如果您需要任何幫助或更多信息,可以找到一個很棒的社區和一本寫得很好的書。

資料來源:

  • [1]“企業集成模式:設計,構建和部署消息解決方案”,ISBN:0321200683,Gregor Hohpe,Bobby Woolf
  • [2] Apache Camel http://camel.apache.org
  • [3]內部DSL http://martinfowler.com/bliki/DomainSpecificLanguage.html
  • [4]駱駝原型http://camel.apache.org/camel-maven-archetypes.html
  • [5] github https://github.com/megachucky/camel-infoq上本文的示例代碼
  • [6]減少對Spring JAR的依賴http://davsclaus.blogspot.com/2011/08/apache-camel-29-reduced-dependency-on.html
  • [7]駱駝類型轉換器http://camel.apache.org/type-converter.html
  • [8]“行動中的駱駝”,國際標準書號(ISBN):1935182366,克勞斯·易卜生,喬納森·安斯特伊,哈德良·扎巴爾恰
  • [9] Spring Integration www.springsource.org/spring-integration
  • [10] Mule ESB http://www.mulesoft.org
  • [11] Apache Camel,Mule ESB和Spring Integration的比較http://www.kai-waehner.de/blog/2012/01/10/spoilt-for-choice-which-integration-framework-to-use-spring集成m子或阿帕奇駱駝
  • [12]阿帕奇駱駝四歲生日http://camel.apache.org/2011/07/07/happy-birthday-camel.html

參考: Apache Camel教程– 有關Java EE / SOA /云計算博客的JCG合作伙伴 Kai Wahner的EIP,路由,組件,測試和其他概念的介紹 。


翻譯自: https://www.javacodegeeks.com/2012/05/apache-camel-tutorial-introduction-to.html

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

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

相關文章

iOS開發UI篇—UITableview控件簡單介紹

一、基本介紹 在眾多移動應?用中,能看到各式各樣的表格數據 。 在iOS中,要實現表格數據展示,最常用的做法就是使用UITableView&#xff0c;UITableView繼承自UIScrollView,因此支持垂直滾動,?且性能極佳 。 UITableview有分組和不分組兩種樣式&#xff0c;可以在storyboard或…

PL/SQL 08 異常 exception

--PL/SQL錯誤 編譯時 運行時--運行時的出錯處理 EXCEPTION --異常處理塊DECLARE …BEGIN …EXCEPTION WHEN OTHERS THEN handler_error(…);END; --用戶自定義的異常DECLARE e_TooManyStudents EXCEPTION; …BEGIN … RAISE e_TooManyStudents; …EXCEPTION WHEN e_TooMany…

html鼠標事件沒反應,鼠標有時候點擊沒反應怎么解決

關于鼠標有時候點擊沒反應的問題&#xff0c;一些網友顯得一頭霧水&#xff0c;那這該怎么解決呢?下面就由小編來給你們說說鼠標有時候點擊沒反應的原因及解決方法吧&#xff0c;希望可以幫到你們哦!鼠標有時候點擊沒反應的解決方法一&#xff1a;一&#xff0c;系統繁忙&…

動態ADF火車:以編程方式添加火車停靠站

我將展示如何以編程方式“即時”將火車停靠站添加到ADF火車中。 在我的用例中&#xff0c;我有一些票務預訂應用程序。 它具有訓練模型的有限任務流。 在火車的第一站&#xff0c;用戶輸入乘客的數量&#xff0c;在隨后的站點&#xff0c;他們輸入一些乘客的信息。 帶有乘客信息…

修改sqlserver的數據庫排序規則語句

alter database SOETMS collate Chinese_PRC_CI_AS 轉載于:https://www.cnblogs.com/lxboy2009/p/5481977.html

關于存儲過程權限

關于ORACLE賬號的權限問題&#xff0c;一般分為兩種權限&#xff1a; 系統權限: 允許用戶執行特定的數據庫動作&#xff0c;如創建表、創建索引、創建存儲過程等 對象權限: 允許用戶操縱一些特定的對象&#xff0c;如讀取視圖&#xff0c;可更新某些列、執行存儲過程等 像這種查…

寧波鎮海2021年高考成績查詢,最新!2021年,寧波鎮海區的這14所中小學“爆了...

寧波鎮海區教育局發布了2021年公辦學校小學一年級、初中一年級招生第一次預警&#xff0c;這也是寧波首個發布2021年公辦學校招生預警的縣、市、區。根據最新數據摸排&#xff0c;寧波鎮海區有8所小學紅色預警、2所初中紅色預警&#xff0c;1所小學黃色預警、3所初中黃色預警。…

用Java解決生產者-消費者問題

當我們嘗試多線程編程時&#xff0c;生產者-消費者問題是最常見的問題之一。 盡管不像多線程編程中的其他一些問題那樣具有挑戰性&#xff0c;但是錯誤地實現此問題可能會造成應用程序混亂。 生產的物品將不使用&#xff0c;開始的物品將被跳過&#xff0c;消耗量取決于生產是在…

哪位科學家奠定了計算機結構理論,計算機等級考試一級理論知識選擇題題庫(1-50)...

領域中的問題為主的數值計算稱為科學計算B)計算機應用可分為數值應用和非數值應用兩類C)計算機各部件之間有兩股信息流&#xff0c;即數據流和控制流D)對信息(即各種形式的數據)進行收集、儲存、加工與傳輸等一系列活動的總稱為實時控制答案&#xff1a;D32. 金卡工程是我國正在…

axios 參數為payload的解決方法

1. 添加頭部headers headers: {Content-Type: application/x-www-form-urlencoded,}, axios.post(url, {a: 1, b:2}, {headers: {Content-Type: application/x-www-form-urlencoded,}, }).then(response > response.data).then(err > {console.log(err);}); 2. 在Browser…

超出了GC開銷限制– Java堆分析

這篇文章是我們原來的GC超出限制的問題模式帖子的延續。 正確的Java堆分析對于消除O??utOfMemoryError&#xff1a;GC開銷問題至關重要。 如果您不熟悉此Java HotSpot 1.6錯誤&#xff0c;建議您首先閱讀有關此主題的第一篇文章 。 本文將為您提供一個示例程序和一個教程&…

開燈問題

開燈問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;1描述有n盞燈&#xff0c;編號為1~n&#xff0c;第1個人把所有燈打開&#xff0c;第2個人按下所有編號為2 的倍數的開關&#xff08;這些燈將被關掉&#xff09;&#xff0c;第3 個人按…

計算機科學基本理論,計算機科學的基礎知識.ppt

計算機科學的基礎知識第二章 計算機科學的基礎知識 本章學習目標&#xff1a; 數據的理解、分類與表示 計算機的基本結構與工作原理 程序設計基礎 算法基礎 2.1 數據類型 2.2 計算機內部的數據 2.3 表示數據 2.4 十進制表示法 2.5 二進制表示法 2.6 十六進制表示法 2.7 八進制表…

損壞注冊表的原因

軟件: &#xff08;1&#xff09;應用程序錯誤 &#xff08;2&#xff09;驅動程序不兼容或使用了錯誤的應用程序 &#xff08;3&#xff09;應用程序在注冊表中添加了錯誤的內容 &#xff08;4&#xff09;應用程序添加了錯誤的數據文件和應用程序之間的聯系 硬件: &#xff0…

cdockpane限制調整大小_影視后期制作小伙伴必看:使用AU對聲音質量進行調整的三大技巧...

一、增幅一般人進入AU的音頻調整界面&#xff0c;會使用圖中的旋鈕進行音量調整&#xff0c;這種操作是錯誤的&#xff0c;因為通過拖拽并不能確定調整音量的大小幅度&#xff0c;精準度極低&#xff0c;反復操作才能試出最佳音量&#xff0c;效率極低。最優方案是使用左側效果…

html5css3js文件作業,HTML5 CSS3 JavaScriptWeb前端開發自測試卷2.docx

自測試卷2一、選擇題1&#xff0e;使用標簽在網頁中成功地添加一張圖片&#xff0c;必不可少的屬性是( )。A&#xff0e;alt B&#xff0e;title C&#xff0e;src D&#xff0e;width2&#xff0e;使用CSS設置鼠標放置在鏈接上時的樣式應使用以下哪個選擇器( )。A&#xff0e;…

線程故事:Web應用程序中的ThreadLocal

本周&#xff0c;我花了一些合理的時間來消除Web應用程序中的所有ThreadLocal變量。 原因是他們造成了類加載器泄漏&#xff0c;我們不能再適當地取消部署我們的應用程序。 取消部署應用程序后&#xff0c;當GC根目錄繼續引用應用程序對象時&#xff0c;將發生類加載器泄漏。 如…

n-1位數

n-1位數 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;1描述已知w是一個大于10但不大于1000000的無符號整數&#xff0c;若w是n(n≥2)位的整數&#xff0c;則求出w的后n-1位的數。 輸入第一行為M&#xff0c;表示測試數據組數。接下來M行&…

Android之封裝好的異步網絡請求框架

1.簡介 Android中網絡請求一般使用Apache HTTP Client或者采用HttpURLConnection&#xff0c;但是直接使用這兩個類庫需要寫大量的代碼才能完成網絡post和get請求&#xff0c;而使用這個MyHttpUtils庫可以大大的簡化操作&#xff0c;它是基于HttpURLConnection&#xff0c;所有…

華潤置地php面試題_從一流到頂流|2020華潤置地與沈陽一起美好

如果用一句話來形容華潤置地進入沈陽13年的發展歷程&#xff0c;你認為是什么&#xff1f;“從優秀到卓越”。用2020年的語言你給我翻譯一下&#xff1f;“從一流到頂流”&#xff01;01/ 初識的美好猶記2007年1月&#xff0c;央企華潤置地首進沈陽&#xff0c;在大館原址呈現出…