littleQ

终于明白曾经他们失落的目光,当年的你们是否一样;间有懈怠或有颓放,难知多久方能补上;今起,不再彷徨!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  33 Posts :: 0 Stories :: 60 Comments :: 0 Trackbacks

#

OSGi是什么?
OSGi是一种松散耦合的组件和服务运行平台规范. 简单的说, 用户只需要修改通用的Java类库档案JAR文件中的META-INF下的元数据文件MANIFEST.MF, 添加必要的标签信息, 放置到OSGi框架的Bundle Repository中, 用户的类库就成了OSGi环境的一部分.

成为OSGi环境的组件, 为其他标准的OSGi组件提供代码功能是最为直接的一种功能. 用户也可以将提供组件中的某种功能的接口和实现实例发布到OSGi服务注册表中, 供其他组件直接查找使用. 这就是OSGi的Serivce概念. 同样, 用户可以查找OSGi环境中其他组件提供的接口服务, 调用改服务完成必要的处理.

OSGi组件提供的服务具有两种层面的含义: 系统层面, 即一个组件为其他组件提供服务, 这些服务体现为Java接口的实现; 业务层面, 即一个组件为外部系统或用户提供某种业务服务实现.

OSGi的组成.
OSGi框架由4层组成:运行环境、模块、生命周期管理、服务注册.
运行环境是指标准的java环境. 只要具备了java2的构造和轮廓的都是被认可的运行环境.
模块层定义了采用的ClassLoader机制.
生命周期管理层则为bundle的安装、启动、停止、更新和卸载提供了支持.
服务注册为Bundles提供了一个动态的协作模型. 本来Bundles可通过传统的class共享方式来实现协作, 但在动态的安装和卸载代码的环境下这种方法是不适用的. 服务注册为Bundles间共享Objects提供了一种可用的模型, OSGI提供了一堆的事件来通知服务的使用者关于服务的注册和卸载, 服务其实就是简单的Java objects.
posted @ 2008-07-30 14:18 littleQ 阅读(470) | 评论 (0)编辑 收藏

第一次接触OSGi,看的第一篇资料是BlueDavy的<OSGi实战>.并实践了其中的案例.
还没有看完,暂时才看到把UserValidator接口和其不同的三种实现---FileConfigValidator, LDAPValidator, DBValidator做成bundle.
bundle的开发和普通的java工程开发唯一的区别就是借助bundle的元数据MANIFEST.MF来实现工程之间package的共享.
除了bundle之外,OSGi还有一个很重要的概念,就是service.这里的service和普通的web开发中的service不同:在OSGi框架中,service是很实在的东西,只有通过BundleContext注册成Service才能使POJO作为Service在OSGi框架中被其他POJO使用,也只有通过BundleContext来获取发布到框架中的Service,通过Service的方式来实现bundle之间的实例级依赖.如此说来,service的粒度比package,bundle都要细.

暂时对OSGi了解的不是很多,还在继续学习中.等把<OSGi实战>看完,BlueDavy还整了<OSGi进阶>,可以看一看.感谢BlueDavy!

其实现在最想了解的,还是基于Spring的OSGi:前者有强大的低依赖性编程模型和概念,后者具有动态性和模块性.两者的结合,我相信必然是更为强大的工具.

posted @ 2008-07-29 22:41 littleQ 阅读(169) | 评论 (0)编辑 收藏

前不久在我所在的项目中做了一个发送html邮件模板的升级包,选一个人群,选一个模板,然后发送。
很简单的一个小功能,可是在coding的时候还是遇到了一些小问题。其中最主要的一个问题,就是模板文件本身的字符集的问题。
        Properties props = System.getProperties();
        Session session;

        props.put(
"mail.smtp.host", strSMTPAdress);
        props.put(
"mail.smtp.port", strSMTPPort);

        
if (strSenderPassword == null{
            props.put(
"mail.smtp.auth""false");
            session 
= Session.getDefaultInstance(props);
        }
 else {
            props.put(
"mail.smtp.auth""true");
            MyAuthenticator myauth 
= new MyAuthenticator(strSenderEmail, strSenderPassword);
            session 
= Session.getDefaultInstance(props, myauth);
        }


        MimeMessage message 
= new MimeMessage(session);

上面的代码创建一个MimeMessage,再简单不过的事情了。
然后根据模板名称获取html文件内容,接着我做了这样一件事情,把模板内容转成gb2312编码。
try{
            temp 
= IOUtils.toString(IOUtils.toInputStream(temp, "gb2312"));
            
// temp = new String(temp.getBytes("gb2312"),"ISO-8859-1");
        }
 catch (IOException e){
            logger.error(
"模板读取后,string格式转换时出错.", e);
            
return null;
        }
设置邮件正文:
  
message.setText(temp, "gb2312");
message.setDataHandler(
new DataHandler(temp, "text/html;charset=gb2312"));

在邮件正文中,查找<title>XXX</title>,title的value就作为邮件的主题。这时候,就出问题了。
我是这么写的:
message.setSubject("=?GB2312?B?" + enc.encode(title.getBytes()) + "?=");
选了几个邮件模板也测试过,当时也没发现问题。可是上线后,用户使用的时候说主题出现乱码。让用户把模板发过来,本地再进行测试,居然发送后的邮件正文格式,都变成了纯文本。
使用下面的设置主题的方式后,就正常了:
message.setSubject(title);

暂时还没有深入的去查找原因,直觉上是认为和html文件本身的编码有关。
posted @ 2008-07-29 11:22 littleQ 阅读(633) | 评论 (1)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4