`
yingfang05
  • 浏览: 122757 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Spring建模CCI访问为操作对象

阅读更多
org.springframework.jca.cci.object 包中包含的支持类允许你以另一种风格访问EIS: 通过可重用的操作对象,类似于Spring的JDBC操作对象。 它通常都封装了 CCI 的API:将应用级的输入对象传入到操作对象, 从而它能创建输入record然后转换接收到的record数据到一个应用级输出对象并返回它。

MappingRecordOperation
MappingRecordOperation 本质上与 CciTemplate 做的事情是一样的, 但是它表达了一个明确的、预配置(pre-configured)的操作作为对象。它提供了两个模板方法来指明如何将一个输入对象转换为输入记录, 以及如何将一个输出记录转换为输出对象(记录映射):

createInputRecord(..) 指定了如何将一个输入对象转换为输入Record

extractOutputData(..) 指定了如何从输出 Record 中提取输出对象

下面是这些方法的签名:

public abstract class MappingRecordOperation extends EisOperation {
...
protected abstract Record createInputRecord(RecordFactory recordFactory, Object inputObject)
   throws ResourceException, DataAccessException { ... }

protected abstract Object extractOutputData(Record outputRecord)
   throws ResourceException, SQLException, DataAccessException { ... }
...
}
此后,为了执行一个 EIS 操作,你需要使用一个单独的execute方法,传递一个应用级(application-level) 输入对象,并接收一个应用级输出对象作为结果:

public abstract class MappingRecordOperation extends EisOperation {
...
public Object execute(Object inputObject) throws DataAccessException {
...
}
正如你所看到的,与 CciTemplate 类相反, 这个execute方法并没有 InteractionSpec 参数, 然而,InteractionSpec 对操作是全局的。 下面的构造方法必须使用指定的 InteractionSpec 来初始化一个操作对象:

InteractionSpec spec = ...;
MyMappingRecordOperation eisOperation = new MyMappingRecordOperation(getConnectionFactory(), spec);
...

MappingCommAreaOperation
一些连接器使用了基于COMMAREA的记录,该记录包含了发送给EIS的参数和返回数据的字节数组。 Spring提供了一个专门的操作类用于直接操作COMMAREA而不是操作记录。 MappingCommAreaOperation 类扩展了 MappingRecordOperation 类以提供这种专门的COMMAREA支持。 它隐含地使用了 CommAreaRecord类作为输入和输出record类型, 并提供了两个新的方法来转换输入对象到输入COMMAREA,以及转换输出COMMAREA到输出对象。

public abstract class MappingCommAreaOperation extends MappingRecordOperation {
...
protected abstract byte[] objectToBytes(Object inObject)
   throws IOException, DataAccessException;

protected abstract Object bytesToObject(byte[] bytes)
   throws IOException, DataAccessException;
...
}

自动生成输出记录
由于每个 MappingRecordOperation 子类的内部都是基于 CciTemplate 的,所以 用 CciTemplate 以相同的方式自动生成输出record都是有效的。 每个操作对象提供一个相应的 setOutputRecordCreator(..) 方法。

MappingRecordOperation 使用示例
在本节中,将通过展示使用 Blackbox CCI 连接器访问一个数据库来说明 MappingRecordOperation 的用法。

首先,必须在 CCI InteractionSpec 中进行一些初始化动作来指定执行哪些SQL请求。 在这个例子中,我们直接定义了将请求参数转换为CCI record以及将CCI结果记录转换为一个 Person 类的实例的方法。

public class PersonMappingOperation extends MappingRecordOperation {

public PersonMappingOperation(ConnectionFactory connectionFactory) {
setConnectionFactory(connectionFactory);
CciInteractionSpec interactionSpec = new CciConnectionSpec();
interactionSpec.setSql("select * from person where person_id=?");
setInteractionSpec(interactionSpec);
}

protected Record createInputRecord(RecordFactory recordFactory, Object inputObject)
   throws ResourceException {
Integer id = (Integer) inputObject;
IndexedRecord input = recordFactory.createIndexedRecord("input");
input.add(new Integer(id));
return input;
}

protected Object extractOutputData(Record outputRecord)
   throws ResourceException, SQLException {
ResultSet rs = (ResultSet) outputRecord;
Person person = null;
if (rs.next()) {
   Person person = new Person();
   person.setId(rs.getInt("person_id"));
   person.setLastName(rs.getString("person_last_name"));
   person.setFirstName(rs.getString("person_first_name"));
}
return person;
}
}
然后应用程序会以person标识符作为参数来得到操作对象。注意:操作对象可以被设为共享实例,因为它是线程安全的。

public class MyDaoImpl extends CciDaoSupport implements MyDao {

public Person getPerson(int id) {
PersonMappingOperation query = new PersonMappingOperation(getConnectionFactory());
Person person = (Person) query.execute(new Integer(id));
return person;
}
}
对应的Spring beans的配置看起来类似于下面非托管模式(non-managed mode)的配置:

<bean id="managedConnectionFactory"
class="com.sun.connector.cciblackbox.CciLocalTxManagedConnectionFactory">
<property name="connectionURL" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="driverName" value="org.hsqldb.jdbcDriver"/>
</bean>

<bean id="targetConnectionFactory"
class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property name="managedConnectionFactory" ref="managedConnectionFactory"/>
</bean>

<bean id="connectionFactory"
class="org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
<property name="connectionSpec">
<bean class="com.sun.connector.cciblackbox.CciConnectionSpec">
   <property name="user" value="sa"/>
   <property name="password" value=""/>
</bean>
</property>
</bean>

<bean id="component" class="MyDaoImpl">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
在托管模式(managed mode)(也就是说,在一个JAVA EE环境中)),配置可能看起来像这样:

<bean id="targetConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="eis/blackbox"/>
</bean>

<bean id="connectionFactory"
class="org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
<property name="connectionSpec">
<bean class="com.sun.connector.cciblackbox.CciConnectionSpec">
   <property name="user" value="sa"/>
   <property name="password" value=""/>
</bean>
</property>
</bean>

<bean id="component" class="MyDaoImpl">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>

MappingCommAreaOperation 使用示例
在本节中,将展示 MappingCommAreaOperation类的用法:通过IBM ECI连接器以ECI的模式访问一个CICS。

首先,CCI InteractionSpec 需要进行初始化以指定那个CICS程序去访问它以及如何与它交互。

public abstract class EciMappingOperation extends MappingCommAreaOperation {

public EciMappingOperation(ConnectionFactory connectionFactory, String programName) {
setConnectionFactory(connectionFactory);
ECIInteractionSpec interactionSpec = new ECIInteractionSpec(),
interactionSpec.setFunctionName(programName);
interactionSpec.setInteractionVerb(ECIInteractionSpec.SYNC_SEND_RECEIVE);
interactionSpec.setCommareaLength(30);
setInteractionSpec(interactionSpec);
setOutputRecordCreator(new EciOutputRecordCreator());
}

private static class EciOutputRecordCreator implements RecordCreator {
public Record createRecord(RecordFactory recordFactory) throws ResourceException {
   return new CommAreaRecord();
}
}
}
The abstract EciMappingOperation class can then be subclassed to specify mappings between custom objects and Records.

EciMappingOperation 抽象类可以被子类化以指定自定义对象和 Records 之间的映射。

public class MyDaoImpl extends CciDaoSupport implements MyDao {

public OutputObject getData(Integer id) {
EciMappingOperation query = new EciMappingOperation(getConnectionFactory(), "MYPROG") {
   protected abstract byte[] objectToBytes(Object inObject) throws IOException {
    Integer id = (Integer) inObject;
    return String.valueOf(id);
   }
   protected abstract Object bytesToObject(byte[] bytes) throws IOException;
    String str = new String(bytes);
    String field1 = str.substring(0,6);
    String field2 = str.substring(6,1);
    String field3 = str.substring(7,1);
    return new OutputObject(field1, field2, field3);
   }
});

return (OutputObject) query.execute(new Integer(id));
}
}
对应的Spring beans的配置看起来类似于下面非托管模式(non-managed mode)的配置:

<bean id="managedConnectionFactory" class="com.ibm.connector2.cics.ECIManagedConnectionFactory">
<property name="serverName" value="TXSERIES"/>
<property name="connectionURL" value="local:"/>
<property name="userName" value="CICSUSER"/>
<property name="password" value="CICS"/>
</bean>

<bean id="connectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property name="managedConnectionFactory" ref="managedConnectionFactory"/>
</bean>

<bean id="component" class="MyDaoImpl">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
在托管模式(managed mode)(也就是说,在一个JAVA EE环境中),配置可能看起来像这样:

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="eis/cicseci"/>
</bean>

<bean id="component" class="MyDaoImpl">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
分享到:
评论

相关推荐

    CCI.zip_CCI源码_cci

    "CCI.zip_CCI源码_cci" 这个标题表明这是一个与CCI相关的源代码压缩包,可能是用于交易分析的指标或算法,其中"CCI"通常指的是Commodity Channel Index(商品通道指数),这是一个在金融交易市场中广泛使用的技术...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring中文帮助文档

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    spring chm文档

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring API

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    spring_FrameWork3.0

    - **Spring 表达式语言(SPEL):** SPEL 是一种强大的表达式语言,可以在运行时查询和操作对象图。 - **控制反转容器的增强:** Spring 3.0 对容器进行了改进,提供了更丰富的配置选项。 - **通用的类型转换和数据...

    通达信指标公式源码 CCI修改版副图指标.doc

    5. 绘图设置:绘图设置有两个部分,一是绘制CCI值小于-200的底线,颜色为红色,线宽为2;二是绘制CCI值小于-150的CCI值,颜色为#33CCFF。 6. DRAWTEXT函数:DRAWTEXT函数用于绘制文字,绘制在CCI值小于-200时,文字...

    通达信指标公式源码 CCI升级版副图指标.doc

    首先,指标定义了一个变量N,值为14,表示计算CCI值时使用的周期数。然后,指标定义了一个变量TYP,表示(HIGH+LOW+CLOSE)/3,即高低收盘价的平均值。 接着,指标计算了CCI值,即(TYP-MA(TYP,14))/(0.015*...

    CCI月周日多周期指标让你不再错过强势股通达信指标公式源码.doc

    CCI 指标的计算公式为: CCI = ( Typical Price - Simple Moving Average ) / ( 0.015 x Mean Absolute Deviation ) 其中,Typical Price 是股票的典型价格,Simple Moving Average 是股票的简单移动平均价格,...

    CCI_EA_CCi指标_cci_ea_MT4EA_源码

    用CCI指标做的EA,只能测试,暂时不能实盘。

    CCI上穿-100选股公式 通达信指标公式源码.doc

    其中,N为计算周期,TYP为típico 价格,CCI为计算出的CCI指标值,XG为判断CCI指标是否上穿-100线的结果。 CCI指标的优点在于: 1. 可以实时跟踪股价的变化趋势和强度; 2. 可以与其他技术指标结合使用,以便更好...

    Land Cover CCI 土地分类使用手册.pdf

    "Land Cover CCI 土地分类使用手册" Land Cover CCI 是一个基于卫星遥感技术的土地分类项目,旨在提供全球土地覆盖类型的信息。该项目的主要目的是为了提供一个可靠的土地分类产品,用于支持环境监测、气候变化...

    通达信指标公式源码 CCI指标(非常好用).doc

    CCI指标的计算公式为: TYP:=IF((H&gt;C AND C&gt;O) OR (H&gt;O AND O&gt;=C),C,H)+IF((L) OR(L),CLOSE,LOW)/3; CCI:=EMA((TYP-MA(TYP,36.0270012))/(0.015*AVEDEV(TYP,36.0270012)),2.0332); 其中,TYP是指标的中间变量,H...

    CCI叠加KDJ通达信指标公式源码.doc

    接着,文档中还提供了一个压缩 CCI 的公式,即将真实 CCI 缩放到一定范围内,计算方式为真实 CCI/3+50。同时,还提供了一个趋势计算公式,即真实 CCI 均线/3+50。 最后,文档中还提供了一个绘图函数,用于将 KDJ 和...

    Spring_FrameWork3.0开发教程

    - 引入了Spring Expression Language (SPEL),这是一种强大的表达式语言,用于在运行时查询和操作对象图。 - 控制反转容器得到增强,提供了更多的配置选项和更灵活的依赖管理。 - 改进了类型转换和数据格式化系统...

    cci.rar_cci

    CCI通过实现缓存一致性协议,确保了所有核心对共享数据的访问都是同步的,从而提高了系统的整体性能和可靠性。 CCI的架构通常包括以下组件: 1. **端口(Ports)**:连接处理器和其他系统组件,如内存控制器,允许...

    CCI与上周线通达信指标公式源码.doc

    ` 定义上周线为本周CCI值的上周平均值,颜色设为紫红色。 6. `NOTEXT0:IF(CCI&gt;上周线,上周线,DRAWNULL),LINETHICK1,COLORMAGENTA;` 当CCI大于上周线时,绘制上周线的紫红色线条,否则不显示。 7. `NOTEXT1:IF(CCI...

    优化CCI并找底通达信指标公式源码.doc

    在实际操作中,cci指标可以与其他技术指标结合使用,以提高投资者的决策能力。例如,我们可以将cci指标与移动平均线结合使用,以判断当前的市场趋势是否与长期趋势一致。如果cci指标与移动平均线同时上涨,则表明...

Global site tag (gtag.js) - Google Analytics