随笔-46  评论-64  文章-2  trackbacks-0
 

         最近准备毕业设计的开题报告,原来设想手机控制端使用J2ME,但是mentor给我思路说可以考虑使用OSGI,一番开导,完全打乱了我原来的想法,思路当然也开阔不少,我决定研究一下OSGI的可行性。

         先介绍一下OSGI,如很多人一样,对OSGI这个名词的了解关注适于Eclipse,常见的解释“OSGi 联盟建立于 1999 年,是一个非赢利机构,旨在建立一个开放的服务规范。OSGi 规范为网络服务定义了一个标准的、面向组件的计算环境,它最初的目的就是为各种嵌入式设备提供通用的软件运行平台,屏蔽设备操作系统与硬件区别的中间件平台,通过这个平台,可以对不同软件商提供的应用(OSGi 中称为 Bundle)进行组件的生命周期管理的能力,如应用组件可以从运行中被安装、升级或者移除而不需要中断设备的操作,应用组件可以动态的发现和使用其他库或者应用程序。由于 OSGi 技术具有服务组件模块化、动态加载应用等优点,正被越来越多的领域关注,如嵌入设备制造业、汽车制造业、企业应用等。目前,OSGi 联盟发布的最新的 OSGi 服务规范为 4.0。

           看了OSGI的WhitePaper说OSGI应用于多种领域,见下图osgi areas.PNG
        我就想在我的Nokia6670手机里使用OSGI,照理来讲肯定是可以搞定的,因为WhitePaper说了不少嘛,但是目前对OSGI的了解仅限于使用Eclipse开发几个Bundle的简单协作,自己想想直接把这个部署到手机里貌似不太可能,然后又Google的N多资料,终于发现一个CLDC设备上OSGI的实现,来自ProSystmBedded Server CLDC Edition,貌似有个评估版可以下载,我发现可以在我的Nokia机器上使用OSGI framework的希望了。还有Google到的信息是Knopflerfish的一个OSGI platform实现貌似是可以在SonyEricsson P900机器上跑起来了的。
        郁闷的台湾南海的地震把什么海底光缆搞挂了,这几天国外网站都上不了,osgi,Knopflerfish,ProSyst都上不去,所以不能获取进一步深入学习资料,网页都打不开非常郁闷啊!

        不知道有没有人部署过这样的OSGI在手机里的应用,总觉得这个OSGI的WhitePaper说的都是抽象层面上的,我想学习的是怎么样把这个用起来。说OSGI规范化***,但是不知道如何用起来啊。。。希望有研究OSGI的人和我交流交流。

       osgi architecture.PNG


         J2ME + WebService是个简单的架构,J2ME开发手机上的Application,WebService提供手机和Server的信息交互。考虑过用.NET实现WebService,J2ME调用。这个系统结构相对容易被更多人了解且容易实现。

         两种实现,相对来说更想尝试OSGI,但是OSGI却相对来说陌生一点,现在很多关于OSGI的资料也访问不了,矛盾啊。。。

posted @ 2006-12-29 22:47 jht 阅读(1034) | 评论 (3)编辑 收藏

         到公司实习近五个月了,主要从事C++开发,困扰于复杂的专家系统的陈旧代码,不能说代码写的不好,肯定比我写出来的C++代码好,但是却很难让人读懂,逻辑复杂,而且又缺乏Code的维护,文档也没有,所有系统特性完全由前人口传声授,搞得很头大。。。
         
         当然也学习到不少东西,比如如何分析复杂的代码,经历种种挫败打击之后,我总结出如下规律,面对一个复杂的系统,你完全不知道它是干什么的,首先从大的角度把握系统的业务特性,主要完成后哪些操作,企业级别应用不外乎数据库的CRUD,非要区分出不同之处个人认为就是各种应用如何把着简单的四种操作弄得更复杂啦!具体方法无非转圈再转圈!

         然后拆解出系统层次架构的模型,在纸上画出层次实现框图有助于快速把握系统的层次模型。

         分解出层次模型之后的下一步就是关注BusinessLogic层东西,如何系统层析模型不好,例如BL和DAO混杂,首先要做的是想办法如何重构这样的模型,因为不重构这样的系统很快你就会感觉这个项目没有尽头了,在痛苦中煎熬啊。在写Code之前,一定要理解BL的东西,Code谁都会写,但是要高效完成Coding工作,理解你要写什么是前提,我自己在这个方面吃亏不少,写出来Code,自己也不知道是干什么的,项目结束了,现在强烈鄙视自己了

         
         重新开始BLOG生涯了,原因:巩固自己学习到的知识,并且将自己学习的体会于大家分享,也许我的些许经验能给迷茫当中的人带来帮助,不吝啬自己的只言片语,哪怕是不够成熟的。另一方面,表达出自己的理解和思想,或许会获得大家不同的评价,你有一个思想我有一个思想,交换,我们就有两个思想了!当然,自己错误的理解马上能得到大家的纠正,这对自己知识的构建是非常好有帮助的!

         下一阶段学习计划 Spring,Hibernate,有空也玩玩AJAX

         

posted @ 2006-12-16 20:34 jht 阅读(267) | 评论 (0)编辑 收藏
      这篇文章在网上已经被转了无数次了,转贴负责的有图,不负责的图也丢了……  
      再转一次吧,我想也不为多,全当成自己的学习资料收集了
     
      以下内容转贴,因为转烂了,所以作者已经不详了……

最近我作了数据库JSP的频繁连接,在此给出数据库连接池的必要性,对于JSP来说一个很好的J2EE服务器是很必要的,JBOOS,WebLogic都是很好的解决方案。


一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤:
  1. 在主程序(如Servlet、Beans)中建立数据库连接。
  2. 进行SQL操作,取出数据。
  3. 断开数据库连接。
  使用这种模式开发,存在很多问题。首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世界的网友都有可能在您的网页上查找资料),在这种情况下,系统开销是相当大的。事实上,在一个基于数据库的WEB系统中,建立数据库连接的操作将是系统中代价最大的操作之一。很多时候,可能您的网站速度瓶颈就在于此。
  其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。
  针对以上问题,我们首先想到可以采用一个全局的Connection对象,创建后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭连接的问题了。但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致WEB SERVER的频频重启。故而,这种方法也不可取。实际上,我们可以使用连接池技术来解决上述问题。首先,介绍一下连接池技术的基本原理。顾名思义,连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用:
    
如图所示,当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。先看看ConnectionPool的基本属性:
  m_ConnectionPoolSize:连接池中连接数量下限
  m_ConnectionPoolMax:连接池中连接数量上限
  m_ConnectionUseCount:一个连接的最大使用次数
  m_ConnectionTimeout:一个连接的最长空闲时间
  m_MaxConnections = -1:同一时间的最大连接数
  m_timer:定时器
  这些属性定义了连接池与其中的每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。其管理流程如下:

通过上图,我们可以定义出ConnectionPool要完成管理所需要的基本接口:
public class ConnectionPool implements TimerListener{
  public boolean initialize() //连接池初始化
  public void destroy() //连接池的销毁
  public synchronized java.sql.Connection getConnection() //取一个连接
  public synchronized void close() //关闭一个连接
  private synchronized void removeFromPool() //把一个连接从连接池中删除
  private synchronized void fillPool() //维护连接池大小
  public synchronized void TimerEvent() //定时器事件处理函数
}
  通过这几个接口,已经可以完成连接池的基本管理。在TimeEvent()函数中完成连接池的状态检验工作,fillPool()时连接池至少保持最小连接数。因为我们要保存每一个连接的状态,所以还需要一个数据库连接对象:
class ConnectionObject{
  public java.sql.Connection con; public boolean inUse; //是否被使用标志
  public long lastAccess; //最近一次开始使用时间
  public int useCount; //被使用次数
}
加入了ConnectionObject对象后,在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是ConnectionObject的con属性,因此我们再加入一个类,作为其他进程获得与返回连接的接口: CLASS Conn{
  GetConnection(); //从连接池中取出一个有效连接
  CloseConnection(); //返回连接,此时并没有关闭连接,只是放回了连接池
  DestroyPool(); //销毁连接池
}
  最后我们的整个系统总的架构如下:
     
通过上面的介绍,我们可以看出,连接池技术的关键就是其自身的管理机制,以上的管理流程只是本人一点见解,关键是想向大家介绍一种思路,在此基础上,您可以进一步完善连接池技术为您所用。


posted @ 2006-03-14 14:36 jht 阅读(295) | 评论 (0)编辑 收藏
Adapter模式
使用Adapter模式的目的:把一个类的接口转换成客户端需要的接口。
适用场合:
   当你想使用一个现有类的功能,但是它的接口不能满足你的需要
   当你想创建一个循环使用的类,用于使一些没有相互联系的类,或者是未知的将来会引进的类之间协调合作完成某些功能。也就是说,这些类不必要具备一致的接口
   当你要使用数个现有的的子类,但是要对每一个子类进行接口的改写变得很不切实际。
 
具体的例子
   变压器(Adapter),变压器把一种电压变换成另一种电压。美国的生活用电电压是110V,而中国的电压是220V。如果要在中国使用美国电器,就必须有一个能把220V电压转换成110V电压的变压器。这个变压器就是一个Adapter。
 
客户买回了美国的电器Machine,工作电压110V,电器插头为3相(阴、阳、地级),所以需要一个电压和相级的转换器或者说是适配器来使这个Machine能在中国使用。
一、类的Adapter模式
package Adapter;

interface 电器需要使用
{
    
public void 两相插口();
    
public void 电压_110V();
}


class 中国_供电
{
    
protected int v;
    
public 中国_供电()
    
{
        v
=220;
        System.out.println(
"中国供电提供的电压是:" +v+"V");
    }

    
//返回中国电压的值
    public int voltage()
    
{
        
return v;
    }

}

class 变压器_相位转换器 extends 中国_供电 implements 电器需要使用 
{

    
public void 两相插口() {
        System.out.println(
"变压器_相位转换器——提供三相到两相转换操作,返回两相插口");
        
    }


    
public void 电压_110V() {
        v 
= this.voltage()/2;
        System.out.println(
"变压器_相位转换器——转换后提供电压为:"+v+"V");
    }

    
}


public class ClassAdapter {

    
public static void main(String[] args) {
        变压器_相位转换器 device 
= new 变压器_相位转换器();
        
        device.电压_110V();
        device.两相插口();
        
        System.out.println(
"经过变压器_相位转换器的包装(Warpper),在美国买来的电器能够使用啦!^0^");

    }


}


二、对象的Adapter模式
package Adapter;

interface 电器需要使用_a
{
    
public void 两相插口();
    
public void 电压_110V();
}


class 中国_供电_a
{
    
protected int v;
    
public 中国_供电_a()
    
{
        v
=220;
        System.out.println(
"中国供电提供的电压是:" +v+"V");
    }

    
//返回中国电压的值
    public int voltage()
    
{
        
return v;
    }

}

class 变压器_相位转换器_a implements 电器需要使用_a 
{
    中国_供电_a supply 
= new 中国_供电_a();

    
public void 两相插口() {
        System.out.println(
"变压器_相位转换器——提供三相到两相转换操作,返回两相插口");
        
    }


    
public void 电压_110V() {
        supply.v 
= supply.voltage()/2;
        System.out.println(
"变压器_相位转换器——转换后提供电压为:"+supply.v+"V");
    }

    
}


public class ObjectAdapter {

    
    
public static void main(String[] args) {
        变压器_相位转换器_a device 
= new 变压器_相位转换器_a();
        
        device.电压_110V();
        device.两相插口();
        
        System.out.println(
"经过变压器_相位转换器的包装(Warpper),在美国买来的电器能够使用啦!^0^");

    }


}


posted @ 2006-02-24 21:13 jht 阅读(1008) | 评论 (0)编辑 收藏

设计模式学习(一) 工厂模式之简单工厂

Creational Pattern:

*creates objects for you rather than having you instantiate objects directly

*gives your program more flexibility in deciding which objects need to be created for a given case

 

工厂模式有以下三种形态:

简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Method)模式

工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式

抽象工厂(Abstract Factory)模式:又称工具箱(Kit Toolkit)模式

 

简单工厂模式其实是普通工厂模式的一个特例,今天就从这里开始吧。

其结构可以简单地表示如下:


SimpleFactory.jpg没用
Visio画,大家见谅呀


    我们从一个实际的例子来看这个简单工厂模式

假设一个农场,专门向市场销售各种水果,假设只提供良种的水果,苹果和葡萄,我们为水果设计一个抽象类Fruit,所有水果都必须实现这个接口

package simple_Factory;
//水果抽象出来的接口
public interface Fruit {
    
void grow();
    
void harvest();
}


public class Apple implements Fruit {

    
private int treeAge;

    
public void grow() {
        log(
"Apple is glowing");
        
    }


    
private void log(String string) {
        System.out.println(string);        
    }


    
public void harvest() {
        log(
"Apple has been harvested.");
    }

    
    
public int getTreeAge() {
        
return treeAge;
    }


    
public void setTreeAge(int treeAge) {
        
this.treeAge = treeAge;
    }


}


public class Grape implements Fruit {

    
private boolean seedless;
    
public void grow() {
        log(
"Grape is growing------");
    }


    
    
public void harvest() {
        log(
"Grape has been harvested.");
    }

    
private void log(String string) {
        System.out.println(string);        
    }


    
public boolean isSeedless() {
        
return seedless;
    }


    
public void setSeedless(boolean seedless) {
        
this.seedless = seedless;
    }


}


public class OtherFruits implements Fruit {

    
public void grow() {        
    }


    
public void harvest() {        
    }


}

 

FruitFactory类,水果加工厂,根据需要(不同参数代表不同的水果需求)给市场供给水果。

 

package simple_Factory;

//水果加工厂,根据需要给市场供给水果
public class FruitFactory {
    
public static Fruit supplyFruit(String need)
    
{
        
if(need.equalsIgnoreCase("apple"))
            
return new Apple();
        
else if(need.equalsIgnoreCase("grape"))
            
return new Grape();
        
else
            
return new OtherFruits();        
    }

}

测试方法:
package simple_Factory;

public class Test {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Fruit a 
= FruitFactory.supplyFruit("apple");
        Fruit b 
= FruitFactory.supplyFruit("Grape");
        Fruit c 
= FruitFactory.supplyFruit("others");
        
        a.grow();a.harvest();
        b.grow();b.harvest();
        c.grow();c.harvest();
    }

}


    自己弄懂和讲给别人懂还是有很大差距的,第一篇文章虽然写好了,但是感觉不够好,不知道能不能给初学者一点点帮助呢……

    自强不息,继续努力!
posted @ 2006-02-21 22:03 jht 阅读(2184) | 评论 (7)编辑 收藏
仅列出标题
共5页: 上一页 1 2 3 4 5