Java:如何访问CICS连接工厂?

本文详细介绍了如何在JavaEE容器(如Tomcat)和Spring框架中配置CICS ECI(Electronic Data Interchange for Computers)连接,包括在context.xml文件中的配置方法以及使用Java代码实现的ObjectFactory接口。同时,还对比了两种配置方式的优缺点,便于开发者根据实际需求选择合适的配置方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

方式一、在JavaEE容器配置

方式二、 在应用程序中配置


方式一、在JavaEE容器配置

在没有提供JCA容器的JavaEE实现中,比如Tomcat,可以在其context.xml中加入如下内容:

  <Resource name="eis/cicseci" auth="Container" type="javax.resource.cci.ConnectionFactory"
            factory="com.console.util.cics.JndiConnectionFactory"
            serverName="TestSrv" connectionURL="127.0.0.1" portNumber ="2006"
            socketConnectTimeout ="30" tranName ="CPMI"
            userName ="CICSUSER" password ="CICSUSER" />

com.console.util.cics.JndiEciConnectionFactory要实现javax.naming.spi.ObjectFactory接口,代码如下:

package com.console.util.cics;

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;

import com.ibm.connector2.cics.ECIManagedConnectionFactory;

/**
 * 生成调用eci call用到的ConnectionFactory对象,此对象将提供给外部容器做JNDI绑定
 *
 */
public class JndiEciConnectionFactory implements ObjectFactory {

    public static final String PARAM_USER_NAME = "userName";
    public static final String PARAM_PASSWORD = "password";
    public static final String PARAM_CONNECTION_URL = "connectionURL";
    public static final String PARAM_PORT_NUMBER = "portNumber";
    public static final String PARAM_SERVER_NAME = "serverName";
    public static final String PARAM_TRAN_NAME = "tranName";
    public static final String PARAM_SOCKET_CONNECT_TIMEOUT = "socketConnectTimeout";
    public static final String PARAM_APPLID = "applid";
    public static final String PARAM_TRACE_LEVEL = "traceLevel";
    public static final String PARAM_TPN_NAME = "tpnName";
    public static final String PARAM_APPLID_QUALIFIER = "applidQualifier";
    public static final String PARAM_KEY_RING_CLASS = "keyRingClass";
    public static final String PARAM_KEY_RING_PASSWORD = "keyRingPassword";
    public static final String PARAM_CLIENT_SECURITY = "clientSecurity";
    public static final String PARAM_SERVER_SECURITY = "serverSecurity";
    public static final String PARAM_REQUEST_EXITS = "requestExits";
    public static final String PARAM_CIPHER_SUITES = "cipherSuites";

    /**
     * 将参数设置到ECIManagedConnectionFactory中,然后生成实现了javax.resource.cci.
     * ConnectionFactory接口的对象
     */
    public Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable<?, ?> environment) throws Exception {
        ECIManagedConnectionFactory bean = new ECIManagedConnectionFactory();

        Reference ref = (Reference) obj;
        Enumeration<RefAddr> addrs = ref.getAll();
        while (addrs.hasMoreElements()) {
            RefAddr addr = addrs.nextElement();

            String type = addr.getType();
            String value = (String) addr.getContent();

            if (type.equals(PARAM_USER_NAME)) {
                bean.setUserName(value);
            } else if (type.equals(PARAM_PASSWORD)) {
                bean.setPassword(value);
            } else if (type.equals(PARAM_CONNECTION_URL)) {
                bean.setConnectionURL(value);
            } else if (type.equals(PARAM_PORT_NUMBER)) {
                bean.setPortNumber(value);
            } else if (type.equals(PARAM_SERVER_NAME)) {
                bean.setServerName(value);
            } else if (type.equals(PARAM_TRAN_NAME)) {
                bean.setTranName(value);
            } else if (type.equals(PARAM_SOCKET_CONNECT_TIMEOUT)) {
                bean.setSocketConnectTimeout(value);
            } else if (type.equals(PARAM_APPLID)) {
                bean.setApplid(value);
            } else if (type.equals(PARAM_TRACE_LEVEL)) {
                bean.setTraceLevel(Integer.parseInt(value));
            } else if (type.equals(PARAM_TPN_NAME)) {
                bean.setTPNName(value);
            } else if (type.equals(PARAM_APPLID_QUALIFIER)) {
                bean.setApplidQualifier(value);
            } else if (type.equals(PARAM_KEY_RING_CLASS)) {
                bean.setKeyRingClass(value);
            } else if (type.equals(PARAM_KEY_RING_PASSWORD)) {
                bean.setKeyRingPassword(value);
            } else if (type.equals(PARAM_CLIENT_SECURITY)) {
                bean.setClientSecurity(value);
            } else if (type.equals(PARAM_SERVER_SECURITY)) {
                bean.setServerSecurity(value);
            } else if (type.equals(PARAM_REQUEST_EXITS)) {
                bean.setRequestExits(value);
            } else if (type.equals(PARAM_CIPHER_SUITES)) {
                bean.setCipherSuites(value);
            }
        }

        return bean.createConnectionFactory();
    }

如果是在其它提供了JCA容器的JavaEE实现中,可以直接配置对ConnectionFactory的JNDI访问,而不需要使用上述代码。

spring中访问JNDI的方式:

<bean id="atii.eciConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="eis/cicseci" />
    <property name="resourceRef" value="true" />
</bean>

此方式的好处是,与CICS相关的配置在JavaEE容器中完成,程序代码只需要使用JNDI找出注册在JavaEE容器中的ConnectionFactory,程序代码在开发、测试、生产等环境中部署时,不需要做任何修改。程序代码不需要关心实现CICS相关配置在什么地方完成的。

方式二、 在应用程序中配置

以spring为例进行说明:

<!-- cics -->
<bean id="atii.eciManagedConnectionFactory" class="com.ibm.connector2.cics.ECIManagedConnectionFactory">
    <property name="serverName" value="TestSrv" />
    <property name="connectionURL" value="127.0.0.1" />
    <property name="portNumber" value="2006" />
    <property name="socketConnectTimeout" value="30" />
    <property name="tranName" value="CPMI" />
    <property name="userName" value="CICSUSER" />
    <property name="password" value="CICSUSER" />
</bean>
<bean id="atii.eciConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean">
    <property name="managedConnectionFactory" ref="atii.eciManagedConnectionFactory" />
</bean>

此方式只适合在开发环境中使用,如果是要部署到其它环境,需要修改spring配置文件,不利于快速部署。

中间件技术在现代软件开发中扮演着至关重要的角色,它作为连接操作系统与应用程序的桥梁,为分布式系统提供了一种灵活、高效的方式来管理和协调资源。以下将从中间件的技术介绍、分类以及其在软件开发中的作用进行详细阐述。 ### 中间件技术介绍 中间件是一种独立的系统软件或服务程序,用于支持分布式应用软件在不同的技术之间共享资源。它的核心功能是管理计算资源和网络通信,使上层的应用软件能够专注于业务逻辑的实现,而无需关注底层硬件和操作系统的差异性。中间件通常具有标准的程序接口和协议,这些接口和协议可以在不同的操作系统和硬件平台上实现[^1]。 ### 中间件的分类 根据功能和应用场景的不同,中间件可以分为多种类型: 1. **消息中间件**:主要用于实现应用间的异步通信,例如通过消息队列来传递数据。常见的消息中间件有 RabbitMQ、Kafka 和 ActiveMQ 等。 2. **事务处理中间件**:这类中间件主要用于支持高并发的事务处理,确保交易的完整性和一致性。典型的例子包括 IBM CICS 和 BEA Tuxedo。 3. **远程过程调用(RPC)中间件**:允许一个程序调用另一个地址空间中的子程序,就像调用本地函数一样。gRPC 是一种广泛使用的 RPC 框架。 4. **对象请求代理(ORB)中间件**:这种中间件支持 CORBA 标准,使得不同语言编写的服务可以通过 IDL 定义的接口进行交互。 5. **Web 服务中间件**:随着 Web 技术的发展,基于 HTTP 协议的服务成为主流。Web 服务中间件如 SOAP 和 RESTful API 提供了跨平台的数据交换方式。 6. **集成型中间件**:如 WorkFlow 和 EAI(Enterprise Application Integration),它们帮助企业将基于各种不同平台、用不同方案建立的异构应用集成起来,形成统一的应用环境[^2]。 7. **数据库中间件**:这类中间件帮助应用程序访问和操作数据库,提供数据持久化和查询等功能。例如 Hibernate 对于 Java 应用程序的支持。 8. **缓存中间件**:为了提高性能,减少对后端数据库的压力,缓存中间件如 Redis 和 Memcached 被用来存储热点数据。 9. **安全中间件**:这类中间件负责处理认证、授权等安全性问题,保障系统的安全运行。 ### 中间件在软件开发中的作用 - **促进分布式系统的构建**:中间件简化了分布式系统的开发,因为它隐藏了网络通信的复杂性,让开发者可以更专注于业务逻辑的设计。 - **增强系统的可扩展性和灵活性**:由于中间件提供了标准化的接口,这使得系统更容易适应新的需求变化,也方便了系统的维护和升级。 - **提升效率和可靠性**:通过使用中间件提供的服务,比如负载均衡、故障转移等,可以显著提高系统的可用性和响应速度。 - **支持多平台和跨网络**:中间件支持多种硬件和操作系统平台,并且能够在不同的网络环境中透明地工作,这对于构建全球化的企业级应用至关重要。 - **降低开发成本**:利用现有的中间件产品和服务,企业不需要从头开始开发所有基础设施组件,从而节省了大量的时间和资金投入。 综上所述,中间件不仅解决了分布式计算中的诸多挑战,而且极大地促进了软件开发的效率和质量。对于希望快速构建稳定可靠系统的开发者来说,了解并合理选择合适的中间件是非常重要的。 ```java // 示例代码 - 使用Java Message Service (JMS) 发送消息 import javax.jms.*; public class JmsProducer { public static void main(String[] args) throws JMSException { // 创建连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建目标 - 队列 Destination destination = session.createQueue("TEST.QUEUE"); // 创建生产者 MessageProducer producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 创建文本消息 TextMessage message = session.createTextMessage("Hello World!"); // 发送消息 producer.send(message); // 清理资源 session.close(); connection.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值