当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

<b>如安在Weblogic的全局事件实施多线程操作</b>[Java编程]

赞助商链接



  本文“<b>如安在Weblogic的全局事件实施多线程操作</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本日有人提出了一个诡异的要求,要求在全局事件中履行多线程操作.他们 全局事件中触及两个数据库中的多个表,假如单线程那么走完,呼应时间上不满 足要求,说白了就是对比慢,于是提出了这样的要求.从JTA的标准来看, transaction(TX)和thread是密切相关的,TX普通是不能在利用线程间传送的, 即我主线程起一个全局事件,然后我把这个事件传送给其他我新起的线程,纯真 的变量传送没问题,但这个事件是不能被transaction manager(TM)辨认的,TM 对TX的管理有他自己的方法.从weblogic的实现来看,TX被放在当前线程的 threadlocal中,普通利用线程不存在这样的构造,所以简单的变量传送,关于 TM而言是没有意义的.那么到底有没有办法实现上面的需求的,我做了些测试, 利用weblogic内部的一些API可以实现这个需求.下面我们就来看看实现中的几 个要点: :)

1:上面说了,简单的变量传送关于weblogic的TM是没有意义的.TM判断事件 上下文(transaction context)的时刻,会从当前线程的threadlocal查抄,假如 没有,则阐明当前线程没有和任何TX关联.那么我们若何将我们手里的TX放入当 前线程的threadlocal呢? weblogic的ExecuteThread是我们需求的那种线程, 但它是final的,我们不能担当它,只能担当它的父类了,也就是 weblogic.kernel.AuditableThread.

2:我们有担当了AuditableThread,那么我们怎么把TX放入它的threadlocal 中呢?这个可以通过weblogic的TM实现中的一些API来实现,具体到这个类就是 weblogic.transaction.internal.TransactionManagerImpl.比方 interResume(tx),internalSuspend().由于这个API不是package protect的, 我们自己的类必须也位于weblogic.transaction.internal这个包中. interResume(tx),用于将当前线程和指定的TX做关联,而internalSuspend()恰 恰相反,它用于解除这种关联.

3:因为触及到多线程,主线程需求决意什么时刻提交或回滚事件,这个我们要自 己要实现一个线程后果查抄的办法(checkCompletion()).

下面就是我自己实现的测试代码,在Weblogic81测试没有问题.

1 package weblogic.transaction.internal;
2
3 import weblogic.transaction.TxHelper;
4 import  weblogic.transaction.internal.TransactionManagerImpl;
5 import  javax.transaction.Transaction;
6 import  java.util.ArrayList;
7
8 public class DriverTest  {
9
10     private static String INITIAL_CONTEXT_FACTORY  = "weblogic.jndi.WLInitialContextFactory";
11     private  static String PROVIDER_URL = "t3://localhost:8001";
12      private static String SQL_INSERT = "insert into test values (?)";
13     private static String ANO_SQL_INSERT =  "insert into test1 values(?)";
14
15     public  static void main(String args[])
16     {
17          DriverTest test = new DriverTest();
18          test.multiThreadXATest();
19     }
20
21      private Connection getConnection(String url, String dsName)  throws NamingException, SQLException
22     {
23          InitialContext ctx = initializeEnv(url);
24          DataSource ds = (DataSource)ctx.lookup(dsName);
25          ctx.close();
26         return  ds.getConnection();
27     }
28
29     private  UserTransaction getUserTransaction() throws NamingException,  SQLException
30     {
31         InitialContext  ctx = initializeEnv(null);
32         return  (UserTransaction)ctx.lookup ("javax/transaction/UserTransaction");
33     }
34
35      private InitialContext initializeEnv(String url) throws  NamingException
36     {
37         Properties  prop = new Properties();
38         if(url == null)
39             prop.put(Context.PROVIDER_URL,  PROVIDER_URL);
40         else
41              prop.put(Context.PROVIDER_URL, url);
42          prop.put(Context.INITIAL_CONTEXT_FACTORY,  INITIAL_CONTEXT_FACTORY);
43         return new  InitialContext(prop);
44     }
45
46     private  void executeInsertInPSMT(Connection conn, String sql)
47      {
48         PreparedStatement pstmt = null;
49          try{
50             pstmt =  conn.prepareStatement(sql);
51              pstmt.setString(1, "data_to_insert");
52              pstmt.executeUpdate();
53             pstmt.close ();
54         }catch(SQLException e){
55                  e.printStackTrace();
56         }
57     }
58
59     public void  multiThreadXATest()
60     {
61         ArrayList  result = new ArrayList();
62         try{
63              UserTransaction userTx = getUserTransaction ();
64             userTx.setTransactionTimeout (1000);
65             userTx.begin();
66              Transaction tx = TxHelper.getTransaction();
67              Connection conn = getConnection ("t3://localhost:8011", "TestXADS");
68              if(conn != null) conn.close();
SQLThread thread1 = new  SQLThread(tx,result,"t3://localhost:8011","TestXADS",  SQL_INSERT);
69             SQLThread thread2 = new  SQLThread(tx,result,"t3://localhost:8021","TestXADS_1",  ANO_SQL_INSERT);
70             thread1.start();
71              thread2.start();
72              while(result.size() != 2){
73                  Thread.currentThread().sleep(1);
74             }
75             if(checkCompletion(result)){
76                  userTx.commit();
77              }
78             else{
79                  userTx.rollback();
80             }
81         }catch(Exception e){
82              e.printStackTrace();
83         }
84      }
85
86     private boolean checkCompletion(ArrayList  result){
87         boolean toReturn = true;
88          for(int loop=0; loop<result.size(); loop++){
89              if((!((String)result.get(loop)).equals ("OK"))){
90                 toReturn =  false;
91                 break;
92              }
93         }
94         return  toReturn;
95     }
96
97     class SQLThread  extends weblogic.kernel.AuditableThread {
98
99          private Transaction tx = null;
100         private  ArrayList result = null;
101         private String  dsName = null;
102         private String url =  null;
103         private String sql =  null;
104
105         public SQLThread(Transaction  tx,ArrayList result,String ds, String url, String sql){
106              this.tx = tx;
107              this.result = result;
108             this.dsName  = ds;
109             this.url = url;
110              this.sql = sql;
111         }
112
113         public void run(){
114              Connection conn = null;
115              try{
116                  TransactionManagerImpl tm = (TransactionManagerImpl) TransactionManagerImpl.getTransactionManager();
117                  tm.internalResume((TransactionImpl)tx);
118                  DriverTest test = new DriverTest ();
119                 conn =  test.getConnection(url, dsName);
120                  test.executeInsertInPSMT(conn, sql);
121                  conn.close();
122                  tm.internalSuspend();
123                  result.add("OK");
124             }catch(Exception  e){
125                 result.add("NA");
126                  e.printStackTrace();
127              }finally{
128                 try {
129                     if(conn != null)
130                         conn.close ();
131                 }catch(Exception e) {
132                     e.printStackTrace ();
133                 }
134              }
135         }
136     }
137 }
138
139


  以上是“<b>如安在Weblogic的全局事件实施多线程操作</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .