歪酷博客
日 历
网志文件夹
· 所有网志
· J2EE
· J2SE
· .NET
· XML
· 其它
最 新 的 评 论
搜 索
友 情 链 接
· 歪酷博客
· 管理我的Blog
· 乱七八糟
· Java视线
· Matrix
· Spring中文论坛
· SpringFramework主页
· Penguin
· Sybil
· Open Java Project

订阅 RSS

0090962

歪酷博客

一地鸡毛


一地鸡毛 @ 2006-03-17 15:04

由于种种原因,不得不又开始找工作了,目前为止只投了2,3家,发现自己的心态变了很多。以前是尽量投,现在是一般的看不上,好的估计自己的英语也够不上,看来看去只投了BO,Sybase。而且公司地点现在也变成了我考虑的一个重要因素,因为我想和gf近一点。这一周之内,去BO笔试一次,面试二次,对这个公司感觉还不错,而且第二面是我有生以来第一次和老外全英文面试。希望这位洋大哥不要鄙视我的英语水平,慢慢等消息吧。


 
一地鸡毛 @ 2006-03-07 16:39

我们的项目一年来一直使用Jetty+HSQLDB作为开发环境,加上JettyLuncher和DBEdit这两个插件,用起来还是非常地顺手。不过伴随着项目越来越大,内容越来越多,引进来的第三方包很多都使用了commons-logging作为日志输出,比如hibernate, spring等等。项目大了之后log信息也变得非常多,再加上jetty本身的信息变得非常多了。本来想通过修改commons-logging.properties设置高级别的标准,但是发现并没有任何作用,这个问题困惑我了很久,今天终于不能忍了,打算从头到尾trace一下到底哪里有问题。
 
首先先来了解一下Commons-logging的工作流程,Commons-Logging有两个最重要的类: Log接口(负责日志输出)和LogFactory抽象类(负责创建具体的Log),很明显作为第一步得到LogFactory就需要知道其具体实现类,这个过程如下:
0,  准备工作,在classpath中读取commons-logging.properties;
1,  通过System.getProperty()查找” org.apache.commons.logging.LogFactory”的值,作为LogFactory的具体实现类;如果没有继续
2,  通过jar的Service Provider Discovery机制查找 "META-INF/services/org.apache.commons.logging.LogFactory"对应的资源,Service Provider Discovery是JDK1.3之后出现的,我们熟知的XML解析器的查找过程就是利用这个机制。如果没有继续:
3,  从第0步读出来的properties里面查找” org.apache.commons.logging.LogFactory”的值,作为实现类;如果没有继续
4,  使用Commons-Logging自己实现的LogFactoryImpl类。
到此,就可以创建LogFactory了,接下来就是创建Log类,对于第三方提供的LogFactory实现要看具体的实现而不同,我们只说说LogFactoryImpl(即Commons-Logging自带的实现)是如何做的:
1,  查看LogFactoryImpl中的attributes有没有org.apache.commons.logging.Log对应的值,这个attributes是以commons-logging.properties为基础的;
2,  查找System.getPorperty()中org.apache.commons.logging.Log对应的值;
3,  如果有Log4J则使用Log4J;
4,  如果能够使用Jdk14Logger就是用Jdk14Logger;
5,  如果能够使用Jdk13LumberjackLogger则使用Jdk13LumberjackLogger,(Lumberjack是为JDK1.2,1.3实现logging能力的一个开源包, http://javalogging.sourceforge.net/);
6,  都没有就使用SimpleLog。
由此可以看出,平常所说的查找顺序多半是指LogFactoryImpl中创建Log的顺序,而不是LogFactory具体实现的查找顺序。
 
再转回到所遇到的问题上,打开jettyluncher的源代码,看看PluginRunner.java类,这个类是用来启动jetty server的,在启动的时候有关log的作了如下的动作:
1,  调用了LogFactory的releaseAll方法,看来只想是用自己的LogFactory,先把其他的都搞掉;
2,  接下来将System.properties中的org.apache.commons.logging.LogFactory改为Jetty的实现org.mortbay.log.Factory,很明显这样一做,后来所有使用到commons-logging的程序都会使用jetty的实现(除非也强制改掉);
3,  接下来就是平常的getFatory(), getInstance()的动作,也都没有问题;
4,  看来问题应该是出在了jetty的Log实现org.mortbay.log. LogImpl身上了,打开一看果然如此,LogImpl根本没有关commons-logging.properties的设置,完全自己定义了log level等等信息。并且它的配置无法从文件中读取,只能从System.getProperty()中读取,没办法,只好在Jetty Laucher启动的参数中加入-DDEBUG_VERBOSE=-1,再启动之后Info信息就不再出来了。
 
到这里可以明白为什么hibernate, spring之类的log level无法改变的原因,JettyLauncher将其他的LogFactory实现都干掉,注册了Jetty的实现,从而使得hibernate, spring都只能使用jetty的实现进行log输出,Jetty本身的实现也非常的不自然,难于修改它的log level。



 
一地鸡毛 @ 2006-03-03 14:36

activation-1.1ea.jar
antlr-2.7.5H3.jar
jnlp.jar
echopointng-2.0a5.jar
bsf-2.3.0.jar
bsh-2.0b2.jar
castor-0.9.6.jar
cglib-2.1.jar
commons-beanutils-1.7.0.jar
commons-collections-2.1.1.jar
commons-dbcp-1.2.1.jar
commons-digester-1.7.jar
commons-discovery-0.2.jar
commons-fileupload-1.0.jar
commons-lang-2.0.jar
commons-logging-1.0.4.jar
commons-pool-1.2.jar
dbunit-2.1.jar
dom4j-1.6.jar
drools-all-jdk5-2.1.jar
easymock-1.1.jar
easymockclassextension-1.1.jar
Echo2_WebRender.jar
jcommon-1.0.0.jar
jdt-compiler-3.1.1.jar
xml-apis.jar
Echo2_WebContainer.jar
Echo2_App.jar
ehcache-1.1.jar
groovy-all-1.0-beta-8.jar
hibernate-3.jar
hibernate-tools-2.1.3.jar
hsqldb-1.7.3.3.jar
itext-1.3.1.jar
janino-2.3.8.jar
jasper-compiler-5.0.8.jar
jasper-runtime-5.0.8.jar
jaxen-1.1-beta-4.jar
jaxrpc-1.1.jar
jep-2.3.0.jar
jetty-5.1.3.jar
jfreechart-0.9.8.jar
jgraph-5.7.3.jar
jsp-api-2.0.jar
jsr94-1.1.jar
jta-1.0.1B.jar
junit-3.8.1.jar
log4j-1.2.8.jar
mail-1.3.jar
mysql-connector-java-3.1.11-bin.jar
odmg-3.0.jar
poi-2.0-final-20040126.jar
quartz-1.5.1.jar
saaj-1.1.jar
servlet-api-2.4.jar
spring-1.2.5.jar
velocity-1.4.jar
wsdl4j-1.5.1.jar
xdoclet-1.2.1.jar
xdoclet-hibernate-module-1.2.1.jar
xdoclet-xdoclet-module-1.2.1.jar
xercesImpl-2.6.2.jar
xjavadoc-1.0.3.jar
axis-1.1.jar
Echo2_FileTransfer_App.jar
Echo2_FileTransfer_WebContainer.jar
jfreechart-1.0.0.jar
jasperreports-1.2.0.jar
上面是我们目前项目引用到jar包,当然都是open source的,涉及方面非常多,而且肯定还要增加。这一年多大多数时间就是和这68个包打交道,本着不发明轮子的观点,我们引入了一个又一个的开源包,这一年多来我所熟练的也就是如何在几个类似的框架中选择一个,查看tutorial,翻api,将其集成到我们的框架中来。遇到问题,mail list,论坛,源代码基本上也都可以解决。但是其核心如何实现,该怎样实现却一无所知,越来越觉得做的事情毫无技术含量。
抱怨归抱怨,因为时间,人手和能力的限制,我们也不可能去重复地发明轮子。造一个自己的轮子,感觉一定很好。



 
一地鸡毛 @ 2006-03-03 10:02

随着sf.net对subversion的全面支持,subversion已经在很多开源组织和项目中使用,subversion正变得越来越流行,你要是没用过subversion还真不好意思跟人打招呼。不要犹豫了,做程序员就要紧跟时代步伐:
Subversion Book, Traditional Chinese Edition:http://freebsd.sinica.edu.tw/~plasma/svnbook/
使用Subversion进行版本控制:http://www.subversion.org.cn/svnbook/
eclipse插件:http://subclipse.tigris.org/ 



 
一地鸡毛 @ 2006-02-26 16:25

最后介绍一下使用Hibernate的方式,由于我们项目持久层本来就是使用Hibernate,这种方式应该说是最好的方案了。Hibernate 3开始提供了一种将pojo直接映射为xml文件的能力,并可以进行读入。一段简单的导出导入的代码:

/*
 * rst project
 *
 * Created on 2005-8-16
 */

package rst.framework.init;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.hibernate.cfg.Configuration;

import org.hibernate.EntityMode;
import org.hibernate.ReplicationMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 * @author rst
 *
 * Class description.
 */
public class HibernateToXml {
    private static void createDocument() {
        Session session;
        session = getSession();
        Session s = session.getSession(EntityMode.DOM4J);

        Document doc = DocumentHelper.createDocument();
        Element root = doc.addElement("root");

        List results = s.createQuery("PchsOrder").list();
        addResultsToNode(results, root);

        OutputFormat format = OutputFormat.createPrettyPrint();
        try{
            XMLWriter writer = new XMLWriter(new FileWriter("content.xml"), format);
            writer.write(doc);
            writer.close();
        }catch(IOException ioe) {
        }

    }

    public static void readDocument(){
        try{
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("content.xml"));

            Session session = getSession();
            Session s = session.getSession(EntityMode.DOM4J);
            Transaction txn = s.beginTransaction();
                     
            List elems = doc.getRootElement().elements();
            Iterator it = elems.iterator();
            while(it.hasNext()){
                Element e = (Element)it.next();
                if(e.getName().equals("PchsOrder"))
                    s.replicate("PchsOrder", e, ReplicationMode.IGNORE);                
            }

            txn.commit();
            session.close();
           
        }catch(DocumentException e){
        }
    }
   
    private static void addResultsToNode(List results, Element root){
        for (Iterator i = results.iterator(); i.hasNext();) {
            Element e = (Element) i.next();
            e.setName("PchsOrder");
            if(e != null){
                root.add(e);
            }
        }
    }
   
    private static Session getSession(){

        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        return sessionFactory.openSession();
    }

    public static void main(String[] args){
        //createDocument();
        readDocument();
    }
}

导出后的文件如下:
<?xml version="1.0" encoding="UTF-8"?>

<root>
  <PchsOrder id="4028803c04ff25910104ff272432000b">
    <code>001</code>
    <items>
      <PchsOrderItem id="4028803c04ff25910104ff272450000c">
        <estimatedDeliveryDate>2005-07-10 13:09:53</estimatedDeliveryDate>
        <itemDescriptions>For business</itemDescriptions>
        <PchsOrder Id="4028803c04ff25910104ff272432000b"/>
        <Products id="001">
          <code>001</code>
          <introductionDate>2010-12-31 00:00:00</introductionDate>
          <name>IBM Tinkpad R32</name>
          <salesDiscontinuationDate>2022-12-31 00:00:00</salesDiscontinuationDate>
          <supportDiscontinuationDate>2030-12-31 00:00:00</supportDiscontinuationDate>
        </Products>
        <quantity>20.000000000000000000000000000000</quantity>
        <seqId>1</seqId>
        <unitPrice>99.999999999999999999999999999999</unitPrice>
      </PchsOrderItem>
      <PchsOrderItem id="4028803c04ff25910104ff272450000d">
        <estimatedDeliveryDate>2005-07-10 13:10:25</estimatedDeliveryDate>
        <itemDescriptions>For business</itemDescriptions>
        <PchsOrder Id="4028803c04ff25910104ff272432000b"/>
        <Products id="002">
          <code>002</code>
          <introductionDate>2015-12-31 00:00:00</introductionDate>
          <name>IBM Thinkpad T42</name>
          <salesDiscontinuationDate>2030-12-31 00:00:00</salesDiscontinuationDate>
          <supportDiscontinuationDate>2040-12-31 00:00:00</supportDiscontinuationDate>
        </Products>
        <quantity>40.000000000000000000000000000000</quantity>
        <seqId>2</seqId>
        <unitPrice>99.999999999999999999999999999999</unitPrice>
      </PchsOrderItem>
      <PchsOrderItem id="402880e905aee8970105aee976640017">
        <estimatedDeliveryDate>2005-08-13 16:16:27</estimatedDeliveryDate>
        <itemDescriptions>asdfasdf</itemDescriptions>
        <PchsOrder Id="4028803c04ff25910104ff272432000b"/>
        <Products id="001">
          <code>001</code>
          <introductionDate>2010-12-31 00:00:00</introductionDate>
          <name>IBM Tinkpad R32</name>
          <salesDiscontinuationDate>2022-12-31 00:00:00</salesDiscontinuationDate>
          <supportDiscontinuationDate>2030-12-31 00:00:00</supportDiscontinuationDate>
        </Products>
        <quantity>99.999999999999999999999999999999</quantity>
        <seqId>3</seqId>
        <unitPrice>99.999999999999999999999999999999</unitPrice>
      </PchsOrderItem>
    </items>
    <orderDate>2005-07-10 13:09:27</orderDate>
    <supplier>IBM Corp.</supplier>
    <status>N</status>
  </PchsOrder>
</root>

介绍了3中导入导出数据的方式,如何选择就要看具体的场景了。Java领域越来越多的开源产品很多时候确实让人难以选择,要想选择最合适的就必须都试试看,just do it :)