TAG»
Spring Integration本身比较简单。但是在STS里的图形显示实在是不好理解。到处都充斥着通道的信息。而这些信息在大部分情况下都没有任何作用。有谁见过ps -ef | grep root,里的|还要转们突出显示的。下面这个图是从STS里剪的。实在难以理解,还不如直接看xml文件呢。 把该例子的图重新用BPEL/BPMN方式画了一下。至少我自己看起来容易多了。 消息进来之后第一步先根据xpath将消息分成几块。 然后检查根据消息检查是否在库存里面有。 根据是否有做一个条件路由。 有就直接发货。 没有就先转换一下消息格式让供货商能够理解。 然后再给供货商发消息。
前两天看了一个关于Spring Integation的Webnar。感觉相当不错。Spring从最初的反转控制到现在做的如此之大确实让人感叹。Spring的那些人既能写代码,又能做这么好的演讲,另人佩服。 准备花段时间看一下,也把自己的理解记一下。 大致翻了一下Spring 参考文档 下载了并安装了Spring Tools Suite 下载了示例代码 解压示例代码,并在STS里以导入Maven工程方式导入。 Spring的依赖注入之后各个模块之间的关系不是特别直观了。完全依赖于对Spring配置文件的理解。Quote是一个非常简单的例子。 // Spring 依赖这些namespace来决定需要干什么 // 这是一个输入的通道,名字叫tickers。每300ms调用一次tickerStream的nextTicker函数 // 这是一个输出通道,名字叫quotes。 // 上面tickerStream bean // 一个quoteService bean。在上面的例子中只有输入和输出通道。QuoteService里定义的另外一组输入和输出。 QuoteService定义。 @MessageEndpoint public class QuoteService { // 输入通道是tickers,输出通道是quotes @ServiceActivator(inputChannel=”tickers”, outputChannel=”quotes”) public Quote lookupQuote(String ticker) { BigDecimal price = new BigDecimal(new Random().nextDouble() * 100); return new Quote(ticker, price.setScale(2, RoundingMode.HALF_EVEN)); } } Spring根据上面几个通道定义,将每一个输入和输出一相连,就形成了一个有机的链条。
TAG»
大部分人的思维都是差不多的。希望别人做的更好一点。认为自己能比别人做得更好。技术人员尤甚。 软件开发当中有两大误区。一是自己能造比别人更好的车轮。造车轮比打磨车轮更有成就感。 当我们做一个功能的时候,外面往往有许多几经存在的模块可供使用。但是开发人员选型时总有各种各样的理由,功能不够、不适合使用、性能达不到。因为这些模块都达不到开发人员心目中的标准。理由各种各样,不一而足。但是目的一样,想自己做,我能比别人做的更好。但结果往往差强人意。做的总是没有想的好。以前我一直也是这么自信,甚至动手自己写一个Java虚拟机。但最后结果除了跑一个没有任何外部依赖的简单程序之外一无用处。 在做一个功能的时候,选择一个差不多的开源3PP,再把她调教调教是比较好的方法。任何一个功能有太多太多的东西需要考虑了。像配置文件怎么读取啊! 二是集成汽车很容易。设计汽车比改装汽车更有成就感。 有一位名人曾经说过,“汽车吗!不就是沙发下面加四个轮子吗!”。沙发也有,车轮也有,把他们放到一起不就行了吗。 我们做软件系统的时候也有这样的问题。很多模块都现成有,把他们集成在一起不就行了。但到做的时候发现,事情往往要复杂很多。如相同功能有n多模块可供选择,那选那个呢?每次都有选型问题。每个模块之间如何通信?每次模块升级了之后根着升不? 在做一个系统的时候,选择一个差不多的开源系统。将中间少部分能显示系统核心价值的模块替换掉。大部分软件,系统架构不是核心价值。何必要把大部分时间花在不是核心价值的地方呢! 上面的描述适用于大部分像我这样做的没有想的好的人。把想的理想的东西打个三折再和已有的东西比较。把估计的精力乘三倍看是否能接受。如果还是很确定,那么可以勇往直前。 就像某些执着的牛人,做的总比想的好,而且一做就是一辈子。要不成功都难。让中 国再多一些强人,把大众也买了,就像买沃尔沃一样。
TAG»
本文转自 http://space.itpub.net/17179887/viewspace-628297 首先建立一个计算函数 create or replace function count_rows(table_name in varchar2, owner in varchar2 default null) return number authid current_user IS num_rows number; stmt varchar2(2000); begin if owner is null then stmt := ‘select count(*) from “‘||table_name||’”‘; else stmt := ‘select count(*) from “‘||owner||’”.”‘||table_name||’”‘; end if; execute immediate stmt into num_rows; return num_rows; end; 然后通过计算函数进行统计 select [...]