转自http://my.oschina.net/zhzhenqin/blog/92064
很久没有更新Blog了,今天突如其来的闲暇发现了一个很好的功能,籍此更新一下。
上一篇基本介绍了Spring Integration,以及其工作模式。也许你会觉得它没有特色的东西,自己实现也没有多大难度。是的!自己实现确实是没多大难度,但是自己实现有要具有良好扩展性的还是不是那么容易的。
我们的系统经常要和其联系的多个系统一起协同工作。他们都操作着数据库的同一张表。如:一个系统向表写数据,另一个系统定时的扫描新加入的数据,然后把新加入的数据提取出来,做一些处理。然后更新标志或者转移。
这样的场景你遇到过吗? 反正我们是有很多的这样的场景。
我以这样的为例做个Demo。
我创建一个这样的数据库。DDL SQL如:
1 |
CREATE TABLE PUBLIC . PUBLIC .ATTR_MESSAGE (
|
2 |
ATT_CODE VARCHAR (20) NOT NULL ,
|
3 |
PARENT_CODE VARCHAR (20),
|
7 |
MARK VARCHAR (1) DEFAULT 'N' ,
|
如上面的表结构,我从别的数据库提取了几个列创建一个表。 MARK就是一个标志列,当新加入的数据为N, 处理后的会置成Y。
Spring Integration JDBC能给你完成几乎所有代码。如下面的Spring配置:
01 |
<? xml version = "1.0" encoding = "UTF-8" ?>
|
02 |
< beans xmlns = "http://www.springframework.org/schema/beans"
|
03 |
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
|
04 |
xmlns:integration = "http://www.springframework.org/schema/integration"
|
05 |
xmlns:hdbc = "http://www.springframework.org/schema/integration/jdbc"
|
06 |
xmlns:stream = "http://www.springframework.org/schema/integration/stream"
|
07 |
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
08 |
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
09 |
http://www.springframework.org/schema/integration
|
10 |
http://www.springframework.org/schema/integration/spring-integration-2.1.xsd
|
11 |
http://www.springframework.org/schema/integration/jdbc
|
12 |
http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc-2.1.xsd
|
13 |
http://www.springframework.org/schema/integration/stream
|
14 |
http://www.springframework.org/schema/integration/stream/spring-integration-stream-2.1.xsd">
|
16 |
< bean id = "propertyConfigurer"
|
17 |
class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
|
18 |
< property name = "locations" >
|
20 |
< value >classpath:jdbc/jdbc.properties</ value >
|
25 |
< bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
|
26 |
< property name = "driverClassName" value = "${jdbc.driverClass}" />
|
27 |
< property name = "url" value = "${jdbc.url}" />
|
28 |
< property name = "username" value = "${jdbc.username}" />
|
29 |
< property name = "password" value = "${jdbc.password}" />
|
32 |
< bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
|
33 |
< property name = "dataSource" ref = "dataSource" />
|
36 |
< bean id = "jdbcMessageHandler" class = "net.dintegration.handler.JdbcMessageHandler" />
|
38 |
< integration:channel id = "jdbcinchannel" />
|
40 |
< hdbc:inbound-channel-adapter channel = "jdbcinchannel" data-source = "dataSource"
|
41 |
query = "SELECT ATT_CODE, PARENT_CODE, ATT_TEXT, SEQ, OPT_DATE, MARK FROM ATTR_MESSAGE WHERE MARK = 'N'"
|
42 |
update = "UPDATE ATTR_MESSAGE SET MARK = 'Y' WHERE ATT_CODE IN (:ATT_CODE)" >
|
43 |
< integration:poller fixed-rate = "10000" >
|
44 |
< integration:transactional />
|
46 |
</ hdbc:inbound-channel-adapter >
|
48 |
< integration:service-activator input-channel = "jdbcinchannel" ref = "jdbcMessageHandler" />
|
请你注意其中的:
query="SELECT ATT_CODE, PARENT_CODE, ATT_TEXT, SEQ, OPT_DATE, MARK FROM ATTR_MESSAGE WHERE MARK = 'N'"
update="UPDATE ATTR_MESSAGE SET MARK = 'Y' WHERE ATT_CODE IN (:ATT_CODE)"
|
它做作用就是把表ATTR_MESSAGE中MARK=‘N’的数据过滤出来, 放到jdbcMessageHandler中处理,然后按照提取时的 ATT_CODE分别把标志位 MARK置成Y。
如上,我们只需要编写一个 jdbcMessageHandler处理我们的数据就好,其他的一切都让Spring Integration为我们做好了。
01 |
public class JdbcMessageHandler implements MessageHandler {
|
03 |
private static Log log = LogFactory.getLog(JdbcMessageHandler. class );
|
05 |
public JdbcMessageHandler() {
|
09 |
public void handleMessage(Message<?> message) throws MessagingException {
|
10 |
Object obj = message.getPayload();
|
14 |
} else if (obj instanceof String) {
|
16 |
} else if (obj instanceof List) {
|
17 |
List bean = (List)obj;
|
20 |
log.info(ReflectionToStringBuilder.reflectionToString(message));
|
OK。我向建立的表中插入2条数据, 然后测试。测试类:
1 |
public static void main(String[] args) {
|
2 |
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "jdbc/jdbcIntegrationContext.xml" );
|
测试log如:
11-26 19:27:18 [INFO] [support.DefaultLifecycleProcessor(334)] Starting beans in phase 2147483647
11-26 19:27:19 [INFO] [handler.JdbcMessageHandler(49)] [{ATT_CODE=123456, PARENT_CODE=Root, ATT_TEXT=测试数据, SEQ=1, OPT_DATE=14:17:47, MARK=N}, {ATT_CODE=234567, PARENT_CODE=123456, ATT_TEXT=test, SEQ=2, OPT_DATE=14:20:41, MARK=N}]
|
很明显它读到了2条数据输出了。请注意,我在Spring中配置的integration:poller fixed-rate="10000",也就是说每10秒中扫描一次ATTR_MESSAGE表.我再次用一个SQL把刚处理过的数据置成N。如: UPDATE attr_message setmark = 'N'
它也再次输出了日志,如:
11-26 19:30:18 [INFO] [handler.JdbcMessageHandler(49)] [{ATT_CODE=123456, PARENT_CODE=Root, ATT_TEXT=测试数据, SEQ=1, OPT_DATE=14:17:47, MARK=N}, {ATT_CODE=234567, PARENT_CODE=123456, ATT_TEXT=test, SEQ=2, OPT_DATE=14:20:41, MARK=N}]
|
它又读取了MARK为N的数据。就这样几乎不写任何多余的代码就实现了我上面提到的场景。而我们需要做的,仅仅写一个MessageHandler处理我们的数据。
那么他的扩展性呢?
如果你仔细看了,你就发现
1 |
< integration:channel id = "jdbcinchannel" />
|
1 |
< integration:service-activator input-channel = "jdbcinchannel" ref = "jdbcMessageHandler" />
|
这样的代码在上一篇JMS也曾出现过类似的.如:
01 |
< integration:channel id = "jmsinchannel" />
|
03 |
< integration:channel id = "jmsoutchannel" />
|
05 |
< jms:inbound-channel-adapter id = "jmsIn" destination = "myTopic" channel = "jmsinchannel" jms-template = "jmsTemplate" >
|
06 |
< integration:poller fixed-rate = "30000" />
|
07 |
</ jms:inbound-channel-adapter >
|
09 |
< integration:transformer ref = "messageTransformer"
|
10 |
input-channel = "jmsinchannel" output-channel = "jmsoutchannel" />
|
11 |
< integration:service-activator ref = "messageHander" input-channel = "jmsoutchannel" />
|
是的,Spring Integration就是通过类似的方式把任何的数据通过管道一样的把数据导向下一个需要的地方。
分享到:
相关推荐
Spring Integration JDBC是Spring框架的一个重要模块,主要用于在Spring应用程序中集成数据库操作。它提供了一种简单而有效的方式来处理与数据库的交互,无需编写大量的JDBC模板代码。在本压缩包中,我们很可能会...
Spring Integration 是 Spring 框架的一个扩展,旨在提供轻量级、企业级的集成解决方案,它简化了应用程序之间的数据传输,支持多种协议和消息传递模式。在本文中,我们将深入探讨 Spring Integration 2.0.3 版本的...
Java Spring Integration 是一个强大的框架,它扩展了Spring编程模型,以实现企业级应用程序之间的无缝集成。这个框架的主要目标是简化微服务、系统和服务之间的通信,遵循Enterprise Integration Patterns (EIP)这...
Spring Integration是Spring框架的一部分,它提供了构建企业集成应用程序的一整套解决方案。通过采用消息驱动的编程模型,Spring Integration简化了开发人员在构建分布式系统时的复杂度。该框架的目标在于提供一种...
Spring Integration是一个强大的框架,用于构建企业级应用程序的集成解决方案,它简化了消息驱动的架构并提供了低耦合的组件连接。在这个场景中,我们关注的是如何使用Spring Integration来实现数据库数据的实时或...
《Pro Spring Integration》这本书深入探讨了Spring框架中的集成技术,主要涵盖了如何利用Spring框架来构建高效、可扩展的企业级应用程序。Spring Integration是Spring生态体系的重要组成部分,它为开发者提供了在...
**Spring Integration**的核心优势在于它提供了一种简洁的方式来实现复杂的集成场景,并且与Spring框架无缝集成。它不仅支持传统的消息中间件(如JMS),还支持现代的消息传递系统(如AMQP、Kafka等),并且具备良好...
7. **其他模块**:Spring还涵盖了如Spring Batch(批处理)、Spring Integration(企业集成)和Spring Security(安全)等更多功能。 Spring框架的模块化设计使得开发者可以选择性地使用所需部分,而无需引入不必要...
Spring框架由多个模块组成,包括Core Container、Data Access/Integration、Web、AOP、Instruments和Test等,这些模块可以独立使用,也可以组合使用以满足不同项目需求。 二、Core Container Core Container是...
- **Data Access/Integration(数据访问/集成)**:提供了对JDBC、ORM(Object-Relational Mapping,对象关系映射)、OXM(Object-XML Mapping,对象XML映射)的支持,简化了数据库操作。 - **Web**:包含Spring ...
7. **JDBC抽象和ORM集成**:Spring 3.0加强了对JDBC的封装,提供了一种更高级的JdbcTemplate,简化了数据库操作。同时,它对Hibernate、JPA等ORM框架的集成也得到了优化,方便开发者进行数据访问。 8. **RESTful...
8. **Spring Integration**:提供企业级集成模式,如消息传递、文件系统交互等。 9. **Spring Boot**:简化Spring应用的初始搭建以及开发过程,自动配置Spring容器,并可以快速构建生产级别的应用。 10. **Spring ...
Spring框架包括多个模块,如Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web等。在Spring3中,IoC容器通过配置文件或注解来管理对象的生命周期和依赖关系,而AOP则允许开发者定义横切...
- Spring Integration支持多种企业集成模式,如消息驱动、文件系统交互等。 3. Hibernate Hibernate是一个强大的对象关系映射(ORM)框架,它简化了Java应用对数据库的操作。主要特点有: - 提供了Java对象和数据库...
通过阅读"SSH框架简介.doc"和"Spring框架简介.doc",你可以深入理解这两个框架的工作原理、优缺点及应用场景,为你的Java开发之路打下坚实基础。在学习过程中,实践是关键,尝试创建小型项目,将理论知识转化为实际...
Spring提供了对各种数据库访问技术的支持,包括JDBC、ORM框架如Hibernate和MyBatis的集成,以及JPA规范的实现。这使得开发者可以选择最适合项目的持久化策略。 **6. ** **MVC框架** Spring MVC是Spring提供的一套...
Spring框架是中国最流行的Java应用开发框架之一,以其模块化、松耦合的特性深受开发者喜爱。5.2.6.RELEASE是Spring框架的一个稳定版本,它包含了一系列的jar包,这些jar包是构建和运行基于Spring的应用程序所必需的...
2. **Data Access/Integration**:包含JDBC、ORM、OXM、JMS和Transaction五个子模块,用于数据访问和集成。ORM支持Hibernate、JPA等ORM框架,OXM处理对象与XML的映射,JMS涉及消息服务,Transaction则提供了事务管理...