訊息傳遞在 OSGi DevCon 歐洲大會上與 OSGi 相遇

工程 | Iwein Fuld | 2009 年 6 月 23 日 | ...

昨天我在 OSGi DevCon 歐洲大會上發言,討論如何使用 Spring Integration 和 dm Server 以務實的方式解決大型應用程式中的常見問題。 在我的演講前後,我和一些人進行了交談,他們希望獲得更多關於這些想法的資訊。 這篇部落格將概述我所談論的內容。

我將直接切入正題,總結一下演講內容。

任何專案都會在其活躍開發的生命週期中增長。 通常,開發人員透過新增程式碼來新增功能並修復產品所有者提出的問題。 這個過程自然會增加程式碼庫。 隨著原始碼的增長,維護和修復錯誤通常變得更加困難。 如果不加以處理,此過程最終將導致我所說的程式碼超新星。 正確的模組化可以對抗這種不受控制的增長和最終的崩潰,而 OSGi 是目前可用的更引人注目的藥物之一。

我談到的第二個問題是單執行緒崩潰。 在像 Tomcat 這樣的 Servlet 容器中,這可以透過使用執行緒池來為客戶端提供服務來緩解,但是如果單個請求代表一個大型作業,則在單個執行緒中執行它是浪費的。 對於更昂貴的服務呼叫,您需要劃分工作。 此外,在批處理或中介軟體聚焦的系統中,您將無法奢侈地依賴 Web 容器來為您進行執行緒管理,因此您必須自己解決問題,或使用一個好的框架。

第三,模組化會對系統的響應時間產生負面影響。 這尤其適用於引入網路邊界的模組化。 即使沒有延遲,服務呼叫的結果也可能包含許多後續步驟,因此簡單地等待它再呈現響應需要太長時間。

後兩個問題透過訊息傳遞解決,而 OSGi 在將網路延遲保持在最低限度方面起著重要作用。

如果您想獲得一些背景資訊,請檢視簡報。

我做了一個 (簡單的) 示例系統的演示,以及如何使用 SpringSource Tool Suite、dm Server 和 Spring Integration 進行開發。 我已經在之前的部落格中詳細介紹了這個想法(參見 dm Server 上的 Spring Integration),所以在這裡我不會重複。 我選擇了一個與當時我使用的城鎮叫賣者不同的領域。 這是關於一輛公共汽車,有一個司機和一些乘客...... 我被告知幾次應該有一個嚴肅的例子,但我似乎無法控制自己。 也許可以成為實施虛假股票交易系統並將其提交給 Spring Integration 示例的人? 我很喜歡做演示,它甚至有 Twitter!

只需一些片段,您就可以構建自己的 Twitter 整合。 我以前見過這方面的技術,但我再也找不到了,無論如何,這很簡單。 Twitterer


import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.annotation.MessageEndpoint;
import twitter4j.Twitter;
import twitter4j.TwitterException;

@MessageEndpoint
public class Twitterer {
	@Autowired
	Twitter twitter;

	private AtomicInteger counter = new AtomicInteger(0);

	public void tweet(String tweet) {
		if (counter.incrementAndGet() < 3) {
			try {
				twitter.updateStatus("Announcement: \" " + 
						tweet + "\"");
			} catch (TwitterException e) {
				throw new RuntimeException(e);
			}
		}
	}
}

在應用程式上下文中(為了簡潔起見,省略了名稱空間)


	<integration:outbound-channel-adapter ref="twitterer"
		method="tweet" channel="intercom" />

	<context:property-placeholder 
		location="classpath:/passenger/twitter.properties" />

	<beans:bean id="twitter" class="twitter4j.Twitter" 
		p:userId="${twitter.user}"
		p:password="${twitter.password}" />

Twitterer 負責發推文。 實際上,您可以將其替換為訊息過濾器,但我不會建議將通道介面卡直接連線到 twitter4j.Twitter.updateStatus(..) 方法。 如果你想看看會發生什麼,請看這裡

如果您想知道 twitter4j 捆綁包在哪裡,我只是使用 SpringSource Tool Suite 中的 Bundlor 整合自己建立了它。 我花了不到 20 分鐘,而且 完全無痛。 顯然,有一個 問題已提交,因此它將在未來新增到我們的儲存庫中。

我希望您能理解這些想法,並在我不完整的地方進行補充。 我現在要去航海了,所以我的回覆必須等到我完成之後,但不要讓這阻止你。 一如既往地感謝您的反饋。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部