Spring Integration Hazelcast 支援 1.0 Milestone 1 版本已釋出

發布 | Artem Bilan | 2015年4月20日 | ...

親愛的 Spring 社群:

我們很高興宣布 Spring Integration Hazelcast 支援專案的 Milestone 1 版本。使用 Milestone 儲存庫 和 Maven 或 Gradle 搶先體驗。

compile "org.springframework.integration:spring-integration-hazelcast:1.0.0.M1"

首先,特別感謝 Eren Avşaroğulları,他發起了這個專案,並且是一位積極且充滿活力的貢獻者。請務必參加今年 SpringOne 上我們與他的演講

概觀

Spring Integration 實現了著名的 企業整合模式,並在基於 Spring 的應用程式中提供輕量級訊息傳遞,並支援透過宣告式配接器與外部系統整合。Spring Integration 的主要目標是提供一個簡單的模型來建構企業整合解決方案,同時保持關注點分離,這對於產生可維護、可測試的程式碼至關重要。

另一方面,Hazelcast 是領先的 Java 開源記憶體資料網格;它允許在伺服器、叢集和地理位置之間分配資料和計算,並管理非常大的資料集或高資料擷取速率。

因此,我認為將訊息傳遞引入基於 Hazelcast 的應用程式非常酷,並且可以輕鬆地透過 Hazelcast 分發 Spring Integration 訊息流程。

我相信這個擴展將會獲得社群的需求,並根據收到的反饋進行積極的開發和支援。

讓我們回顧一下這個 Milestone 為您提供的內容!

現有功能

對於那些不想等待完成的專案,或者已經在其應用程式中使用 Spring Integration 和 Hazelcast,或者想要考慮這樣做的人,我很高興能介紹即使在這個里程碑版本之前就可以使用的功能。

IQueue

由於 QueueChannel 的通用實作,我們已經可以使用 Hazelcast 擁有一個分散式訊息通道

@Configuration
@EnableIntegration
public static class ContextConfiguration {

	@Bean
	public HazelcastInstance hazelcastInstance() {
		return Hazelcast.newHazelcastInstance(new Config());
	}

	@Bean
	public PollableChannel hazelcastQueueChannel() {
		return new QueueChannel(hazelcastInstance()
                                          .Message<?>>getQueue("siQueue"));
	}

}

將此配置放置在應用程式的 Hazelcast 叢集中的多個節點上,我們將擁有一個分散式 QueueChannel,並且只有一個節點可以從此 IQueue 中輪詢單個 Message

ITopic

Hazelcast 中的 ITopic 抽象與 JMS 中的 Topic 具有相似的語義:所有訂閱者都會收到已發布的訊息。透過一點想像力,我們可以將此機制用作現成可用的功能

@Configuration
@EnableIntegration
public static class ContextConfiguration {

	@Bean
    public ITopic<Message<?>> siTopic() {
    	return hazelcastInstance().getTopic("siTopic");
    }
    
    @Bean
    public MessageChannel publishToHazelcastTopicChannel(
                                    ITopic<Message<?>> siTopic) {
    	return new FixedSubscriberChannel(siTopic::publish);
    }

    @Bean
    public MessageChannel fromHazelcastTopicChannel() {
	return new DirectChannel();
    }

    @PostConstruct
    public void init() {
	siTopic().addMessageListener(m -> 
                     fromHazelcastTopicChannel().send(m.getMessageObject()));
    }

}

FixedSubscriberChannelDirectChannel 的優化變體,它需要在初始化時使用 MessageHandler。由於 MessageHandler 是一個函數式介面,我們可以簡單地為 handleMessage 方法提供 Lambda。當訊息被發送到 publishToHazelcastTopicChannel 時,它只會被發布到 Hazelcast ITopiccom.hazelcast.core.MessageListener 也是一個函數式介面,因此我們可以為 ITopic#addMessageListener 提供 Lambda。因此,將整個 Message<?> 發布到 ITopic 允許我們在訂閱者上按原樣接收它,並將其發送到 MessageChannel 以在 Hazelcast 叢集中的所有訂閱節點上進行處理。

IExecutorService

使用 Hazelcast ExecutorService 支援,我們可以配置一個 ExecutorChannel,使其在整個叢集中一次只接受和執行一條訊息。我稱之為叢集範圍的單例

@Configuration
@EnableIntegration
public static class ContextConfiguration {

	@Bean
	public HazelcastInstance hazelcastInstance() {
		return Hazelcast.newHazelcastInstance(new Config()
				.addExecutorConfig(new ExecutorConfig()
						.setName("singletonExecutor")
						.setPoolSize(1)));
	}
	@Bean
	public MessageChannel hazelcastSingletonExecutorChannel() {
		return new ExecutorChannel(hazelcastInstance()
                                       .getExecutorService("singletonExecutor"));
	}
	
}

現在讓我們來談談 Spring Integration Hazelcast 擴展的第一個里程碑中已經可用的功能。

Hazelcast 輸入通道配接器

透過 Spring Integration Hazelcast 支援,我們為來自 Hazelcast 的輸入資料提供這些元件

<int-hazelcast:inbound-channel-adapter channel="multiMapChannel" 
                cache="multiMap" 
                cache-events="ADDED, REMOVED, CLEAR_ALL" /> 
                              
<int-hazelcast:cq-inbound-channel-adapter 
                channel="cqMapChannel" 
                cache="cqMap" 
                cache-events="UPDATED, REMOVED" 
                predicate="name=TestName AND surname=TestSurname"
                include-value="true"
                cache-listening-policy="SINGLE" /> 
                
<int-hazelcast:ds-inbound-channel-adapter  
                channel="dsMapChannel" 
                cache="dsMap"
                iteration-type="ENTRY" 
                distributed-sql="active=false OR age >= 25 OR name = 'TestName'">
    <int:poller fixed-delay="100"/>
</int-hazelcast:ds-inbound-channel-adapter>

請參閱 Spring Integration Hazelcast 專案頁面,以取得有關其目的和配置選項的更多資訊。

對於那些已經熟悉 Spring Integration Gemfire 支援的人來說,這些元件的使用應該很明顯。

Hazelcast 輸出通道配接器

目前,我們只提供一個通用的輸出通道配接器,用於將資料放置到 Hazelcast 中

<int-hazelcast:outbound-channel-adapter channel="listChannel" 
                     cache="distributedList" /> 

<bean id="distributedList" factory-bean="instance" factory-method="getList"> 
    <constructor-arg value="distributedList"/> 
</bean> 

請在專案首頁上查看有關此配接器的更多資訊。我們將在 RELEASE 之前使此元件更加靈活,例如,利用上述 ITopic發布操作,添加執行階段 distributedObject 解析(例如透過 SpEL),允許接受 MapEntry 作為傳入訊息的 payload 以及其他。

總結

這只是通往 RELEASE 的開始。我們與 Eren 一起考慮了幾個功能,例如 Hazelcast Distributed Execution Service ActivatorHazelcast Client SupportHazelcast backed Subscribable ChannelHazelcastLockRegistryAnnotation Support 等,並希望在今年 9 月的 SpringOne 會議之前發布 1.0.0.RELEASE 版本。同時,請隨時透過 StackOverflow、JIRA 和 GitHub issues 與我們聯繫,分享您的想法!

專案頁面 | JIRA | Issues | [貢獻] (https://github.com/spring-projects/spring-integration/blob/master/CONTRIBUTING.md) | StackOverflow (spring-integration tag)

取得 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

取得領先

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

了解更多

取得支援

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

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部