胡长城(银狐999)BLOG

专注SOA,MDA,EAI,BPM,工作流,J2EE;个人主页http://www.javafox.org

胡长城ID:james999
529707次访问,排名69好友0人,关注者32
J2EE,Workflow,BPM,EAI,SOA,工作流
james999的文章
原创 184 篇
翻译 0 篇
转载 0 篇
评论 607 篇
银狐999的公告
个人主要工作流文档可从 javafox live网络硬盘下载

最近评论
fredyin:oracle task service会最终到“user name”,如果仅此而已的话还是有问题的,比如说‘A’用户从策划部上调到集团公司了,从主任升迁到副社长了,原来是策划部主任审批的,同步后就变成集团公司的副社长做的了;这种情况自然是不对的,还有其它情况等等;
当然从技术角度是可以实现的,我提出这个问题的重点是我们是否要这样实现,有没有必要这样做,或者我们是否有其它更好的方法实……
LMXEQ5:向CSDN学习
h_154537334:建议阅读这篇文章
http://blog.csdn.net/zhangking/archive/2008/06/18/2562480.aspx
james999:to fredyin:对oracle bpel还没有研究那么深,毕竟我研究只是因为“竞争对手”的原因,时间也不较短。—— 不过,从我目前的了解来看,oracle task service会最终到“user name”,也就是,组织的变更对已经运行流程实例,不会动态更新。如果处理人不存在,oracle bpel会直接按照task complete来处理。
fredyin:请问楼主,组织结构和权限变更,比如人员的调离、部门结构的调整,对已经running的流程是怎么处理的
文章分类
收藏
    相册
    50 Relational Blogs
    J2EE与ERP禅话
    Peter's Blog
    俠盜躶奔漢
    切尔斯基(RSS)
    动物园的猪
    胡奇
    赵斌BLog
    阿飞外传
    55 Workflow Preacher
    Ekkart Kindler
    Michael zur Muehlen
    Wil van der Aalst
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 JBoss JTA的使用心得收藏

    新一篇: Sybase ASE XA分布式事务支持

           前些日子,农总行的客户有个需求,需要跨Sybase ASE和Sybase IQ两个数据库操作,并且保证事务的完整性,而且客户不希望通过数据库层来保证事务,只希望在代码层控制。
           这样的需求可能第一反应就是采用JTA,及XA事务(及通常所说的两阶段提交)支持。但是,这其中有一个数据库Sybase IQ,这是一个“数据仓库型”的数据库。Sybase中国区的技术支持也不能肯定是否IQ支持XA事务,因为IQ跨数据库事务操作在国内还没有过。
          
    于是,只得做了个技术预研。说真的,虽然搞了这么多年java,还真没有碰到过跨数据库事务的项目,这次机会难得,好好研究一把。
     
           本机暂时没有Sybase ASE,只能拿SQLServer替代一下。测试环境如下:
    JTA Server: Jboss4.0.4
    DataBase One: MS SQLServer 2000
    DataBase Two:Sybase IQ 12.6
    OS: Windows2003
                       JDBC Driver for sqlserver: jTDS1.2
                       JDBC Driver for Sybase IQ: jConnect-6_05
     
           首先在Jboss中配置XADataSource。在 jboss404\docs\examples\jca 目录下,只有mssql-xa-ds.xmlsybase-ds.xml,没有sybase-xa-ds.xml样例。于是自己写了一个sybase-xa-ds.xml。—— 后来发现这是“错误的做法”,只使用sybase-ds.xml即可了。
     
    mssql-xa-ds.xml内容如下:
    <datasources>
      
    <xa-datasource>
        
    <jndi-name>MSSQLXADS</jndi-name>
        
    <track-connection-by-tx/>
        
    <isSameRM-override-value>false</isSameRM-override-value>
       
    <xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
        
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
        
    <xa-datasource-property name="DatabaseName">foxtest</xa-datasource-property>
        
    <user-name>sa</user-name>
        
    <password>sa</password>
          
    <metadata>
             
    <type-mapping>MS SQLSERVER2000</type-mapping>
          
    </metadata>
      
    </xa-datasource>
    </datasources>
      
    sybase-xa-ds.xml内容如下:
    <datasources>
      
    <xa-datasource>
        
    <jndi-name>XASybaseDS</jndi-name>
        
    <track-connection-by-tx/>
        
    <isSameRM-override-value>false</isSameRM-override-value>
        
    <xa-datasource-class>com.sybase.jdbc3.jdbc.SybDataSource</xa-datasource-class>
        
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
        
    <xa-datasource-property name="User">dba</xa-datasource-property>
        
    <xa-datasource-property name="Password">sql</xa-datasource-property>
        
    <exception-sorter-class-name>
    org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter
    </exception-sorter-class-name>
        
    <no-tx-separate-pools/>
        
    <metadata>
             
    <type-mapping>Sybase</type-mapping>
        
    </metadata>
      
    </xa-datasource>
    </datasources>

        专门写了一个
    TestCase,准备同外围访问通过remote jndi方式访问datasource
    Hashtable evn = new Hashtable();
    evn.put(Context.INITIAL_CONTEXT_FACTORY, 
    "org.jnp.interfaces.NamingContextFactory");
    evn.put(Context.PROVIDER_URL, 
    "jnp://localhost:1299/");
    InitialContext jndiContext 
    = new InitialContext(evn);
    DataSource ds 
    = (DataSource)jndiContext.lookup("java:MSSQLXADS");
     
    但是怎么连都访问不通:
    而且jboss启动时候,datasource部署的信息也是:
     
    13:34:31,473 INFO [WrapperDataSourceService]
    Bound ConnectionManager 'jboss.jca:name=MSSQLXADS,service=DataSourceBinding'
    to JNDI name 'java:MSSQLXADS'

     
            后来在jboss wiki(http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfigDataSources)上发现了问题所在:<use-java-context> - A boolean indicating if the jndi-name should be prefixed with java: which causes the DataSource to only be accessible from within the jboss server vm. The default is true..
           于是在ds.xml配置文件中增加了 <use-java-context>false</use-java-context> 属性,才算能够访问到jndi对象,只是 jndiContext.lookup("java:MSSQLXADS"); 需要更改为 jndiContext.lookup("MSSQLXADS")。
     
           但是,在执行到DataSource ds = (DataSource)jndiContext.lookup("MSSQLXADS");这一步的时候,就抛出了ClassCastException,跟踪发现这个问原来是jndiContext.lookup返回的是javax.naming.Reference对象。
           查了查资料,才发现这个问题的根源是由于javax.sql.DataSource不是可序列化,所以不能够在通过JNDI远程访问:The datasource unlike EJBs, does not implement a remote interface. (Notice the returned object is a javax.naming.Reference rather than DataSource). Hence if you want to lookup datasource, you have to be in the same process.
    这个问题详细可参考:
     
           没有办法,之后转移到Jboss Server内部来测试,不通过TestCase远程JNDI访问测试了。
     
           内部通过一个Servlet测试,代码主体如下:
    public void init() throws ServletException {
        UserTransaction utx 
    = null;
        
    try {
            InitialContext jndiContext
    = new InitialContext();
            utx
    = (javax.transaction.UserTransaction)jndiContext.lookup("UserTransaction");
            utx.begin();
            insertSQL_();
            insertSybase();
        utx.commit();
        } 
    catch (Exception e) {
            
    if(utx!=null){
               utx.rollback();
    //此处异常代码省略
            }
        }
    }

    private void insertSQL_() throws Exception{
        Connection conn1 
    = createXAConnection("MSSQLXADS");
        insertData(conn1);  
    //插入数据测试,代码省略
    }

    private void insertSybase()throws Exception{
        Connection conn2 
    = createXAConnection("XASybaseDS");
        insertDataSybase(conn2);  
    //插入数据测试,代码省略
        throw new Exception(""); //此处做异常回滚测试
    }

    private Connection createXAConnection(String jndiname)throws Exception{
        InitialContext jndiContext;
        
    try {
            jndiContext 
    = new InitialContext();
            DataSource ds 
    = (DataSource)jndiContext.lookup(jndiname);
            
    return ds.getConnection();
        } 
    catch (Exception e) {
            
    // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    return null;
    }

    但是程序在执行到获取Sybase JNDI DataSource的时候总是出现ClassCastException,错误如下:
     
    16:26:14,605 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null
    org.jboss.resource.JBossResourceException:
    Could not create connection; - nested throwable: (java.lang.ClassCastException)
           at org.jboss.resource.adapter.jdbc.xa.XAManagedConnectionFactory.
    createManagedConnection(XAManagedConnectionFactory.java:162)
           at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.
    createConnectionEventListener(InternalManagedConnectionPool.java:539)
           at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.
    allocateConnection(BaseConnectionManager2.java:812)
           at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:88)

     
           这个错误耽误很长时间,后来突然发现,Sybase的jConnect驱动,竟然没有实现javax.sql.XADataSource的接口。
           于是,搜索了一下是否还有其他商业驱动支持Sybase IQ,但发现只有Sybase自身的jConnect。
     
           到这里好像Sybase IQ不支持XA,但是随后做了一个大胆的测试,就是对Sybase使用sybase-ds.xml,而对SQLServer依然采用mssql-xa-ds.xml。sybase-ds.xml配置如下:
    <datasources>
      
    <local-tx-datasource>
        
    <jndi-name>jdbc/SybaseDB</jndi-name>
        
    <connection-url>jdbc:sybase:Tds:localhost:2638</connection-url>
        
    <driver-class>com.sybase.jdbc3.jdbc.SybDataSource</driver-class>
        
    <user-name>dba</user-name>
        
    <password>sql</password>
        
    <exception-sorter-class-name>
    org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter
    </exception-sorter-class-name>
          
    <metadata>
             
    <type-mapping>Sybase</type-mapping>
          
    </metadata>
      
    </local-tx-datasource>
    </datasources>
     
           这个测试后,竟然发现此种配置竟然也支持JTA。
     
           虽然这个实验可以控制Sybase IQ在JTA中的事务,但是到目前为止,我还是不太情况Sybase jConnect没有支持XADataSource接口,如何能够在JTA事务中控制的。
           后来又做了进一步的测试,把MSSqlServer的那个数据源也换成了mssql-ds.xml,也是没有使用XA那个,竟然发现也受JTA的事务完整性控制。
           目前这个还是有些疑问,有待再仔细查阅资料,如果有明理者,也请告知一二

    发表于 @ 2006年09月25日 16:58:00|评论(loading...)|编辑

    旧一篇: 感慨于丁肇中教授的“技术的发展生根于基础研究之中”

    评论

    #银狐999 发表于2006-09-26 13:05:00  IP: 124.42.18.*
    又查了查Sybase jConnect6.0.5驱动,发现有com.sybase.jdbc3.jdbc.SybXADataSource类,于是依然还是采用sybase-xa-ds.xml,只是,将DataSource更换为SybXADataSource,并必须明确指定PortNumber属性。

    测试运行之后,异常如下:
    16:26:14,605 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null
    org.jboss.resource.JBossResourceException:
    Could not create connection; - nested throwable: (java.sql.Exception:JXOXS:此服务器不支持XA样式的事务。请校验在此服务器上该事务功能是否已启用并获得许可。)

    上面的异常清楚地展现了Sybase IQ不支持XA事务。
    #银狐999 发表于2006-09-26 13:10:00  IP: 124.42.18.*
    又查了查Sybase jConnect6.0.5驱动,发现有com.sybase.jdbc3.jdbc.SybXADataSource类,于是依然还是采用sybase-xa-ds.xml,只是,将DataSource更换为SybXADataSource,并必须明确指定PortNumber属性。
    测试运行之后,异常如下:
    16:26:14,605 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null
    org.jboss.resource.JBossResourceException:
    Could not create connection; - nested throwable: (java.sql.Exception:JXOXS:此服务器不支持XA样式的事务。请校验在此服务器上该事务功能是否已启用并获得许可。)

    上面的异常清楚地展现了Sybase IQ不支持XA事务。
    #andy.song 发表于2007-03-08 10:19:26  IP: 210.13.123.*
    那是因为JBoss本身对Datasource的实现就是按照XA Transaction的Resource Management的原理来实现的,原来我也很疑惑,为什么我们公司的JBoss服务器链接了MS Sqlserver 以及IBM DB2 却没有显示的使用XA 的链接管理。后来我进行了源代码调试才明白的。你可以看看我的blog的文章有写描述。但是并不解决所有的问题,还是会出现不一致的情况,所以最好在链接上面用Hibernate类似的OR Mapping的工具来帮助你多做一层的检查,更加保险一些。

    http://www.blogcn.com/u/22/17/hqxsn/blog/52584549.html
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 银狐999