当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪Spring攻略学习笔记(2.14)------使用应用程序事件进行通信       一、知识点            Spring的应用程序上下文支持Bean之间基于事件的通信。在基于事件的通信模型中,发送者组件只需要发布一个事件而不需要知道接收.........
    ▪proc文件系统------《深入理解Linux内核架构》笔记      proc文件系统 1. proc简介(Process Data System, 进程数据系统) proc文件系统属于虚拟文件系统,即该文件系统的数据,由内核动态生成,并不会存放在持久存储数据中。 proc文件系统,.........
    ▪【五一呈献】Java 全能高效 MVC & REST 开发框架 Portal-Basic v3.1.1 正式发布          Portal-Basic 是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦.........

[1]Spring攻略学习笔记(2.14)------使用应用程序事件进行通信
    来源: 互联网  发布时间: 2013-11-19

 一、知识点   

        Spring的应用程序上下文支持Bean之间基于事件的通信。在基于事件的通信模型中,发送者组件只需要发布一个事件而不需要知道接收者。实际上,可能有多个接收者组件。接收者不需要知道是谁发布了事件,它可以同时监听不同发送者的多个事件。在这种方式下,发送者和接收者组件是低耦合的。

        在Spring中,所有事件类都必须继承ApplicationEvent类。这样,任何Bean都可以调用应用程序事件发布者的publishEvent()方法,发布一个事件。对于监听某些事件的Bean来说,它必须实现ApplicationListener接口,并在onApplicationEvent()方法中处理事件。实际上,Spring将所有事件通知给监听者,你必须自己过滤事件。如果你使用泛型,Spring将只传递匹配泛型参数的消息。

二、代码示例

        (1)定义事件

package com.codeproject.jackie.springrecipesnote.springadvancedioc;

import java.util.Date;

import org.springframework.context.ApplicationEvent;

/**
 * Checkout事件
 * @author jackie
 *
 */
public class CheckoutEvent extends ApplicationEvent {
	
	private static final long serialVersionUID = -8397808025422258024L;
	
	private double amount;
	private Date time;

	/**
	 * @param source 事件源
	 * @param amount 支付总额
	 * @param time 结账时间
	 */
	public CheckoutEvent(Object source, double amount, Date time) {
		super(source);
		this.amount = amount;
		this.time = time;
	}
	
	public double getAmount() {
		return amount;
	}

	public Date getTime() {
		return time;
	}
}
(2)发布事件
package com.codeproject.jackie.springrecipesnote.springadvancedioc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;

/**
 * Cashier类实现BeanNameAware感知接口、StorageConfig标记接口、MessageSourceAware接口和ApplicationEventPublisherAware接口
 * 
 * @author jackie
 *
 */
public class Cashier implements BeanNameAware, StorageConfig, MessageSourceAware, ApplicationEventPublisherAware {
	private String name;  
    private BufferedWriter writer;
	private String path;  
	private MessageSource messageSource;
	// 应用程序事件发布者
	private ApplicationEventPublisher applicationEventPublisher;
      
    public void setPath(String path) {
		this.path = path;
	}

	public void openFile() throws IOException {
		File file = new File(path, name + ".txt");
        FileWriter fw = new FileWriter(file, true);  
        writer = new BufferedWriter(fw);  
    }  
      
    public void checkout(ShoppingCart cart) throws IOException {  
        double total = 0;  
        for (Product product : cart.getItems()) {  
            total += product.getPrice();  
        }  
        writer.write(new Date() + "\t" + total + "\r\n");  
        writer.flush();  
        String alert = messageSource.getMessage("alert.checkout", new Object[] { total, new Date()}, Locale.US);
        System.out.println(alert);
        // 创建CheckoutEvent实例,使用this作为事件源
        CheckoutEvent event = new CheckoutEvent(this, total, new Date());
        // 发布事件
        applicationEventPublisher.publishEvent(event);
    }  
    
    public void closeFile() throws IOException {  
        writer.close();  
    }

	@Override
	public String getPath() {
		return path;
	}

	@Override
	public void setBeanName(String beanName) {
		this.name = beanName;
	}

	@Override
	public void setMessageSource(MessageSource messageSource) {
		this.messageSource = messageSource;
	}

	@Override
	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
		this.applicationEventPublisher = applicationEventPublisher;
	}  
}
(3)监听事件
package com.codeproject.jackie.springrecipesnote.springadvancedioc;

import java.util.Date;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

/**
 * 监听事件,
 * @author jackie
 *
 */
@SuppressWarnings("rawtypes")
public class CheckoutListener implements ApplicationListener {
	/**
	 * 只监听Checkout事件
	 */
	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		if (event instanceof CheckoutEvent) {
			double amount = ((CheckoutEvent) event).getAmount();
			Date time = ((CheckoutEvent) event).getTime();
			System.out.println("Checkout event [" + amount + ", " + time + "]");
		}
	}
}
     可以使用泛型,少些代码
public class CheckoutListener implements ApplicationListener<CheckoutEvent> {

	/**
	 * 只监听Checkout事件
	 */
	@Override
	public void onApplicationEvent(CheckoutEvent event) {
		double amount = ((CheckoutEvent) event).getAmount();
		Date time = ((CheckoutEvent) event).getTime();
		System.out.println("Checkout event [" + amount + ", " + time + "]");
	}
}
(4)在应用程序上下文中注册监听器
<bean class="com.codeproject.jackie.springrecipesnote.springadvancedioc.CheckoutListener" />

    注:应用程序上下文本身也会发布容器事件,如ContextClosedEvent,ContextRefreshedEvent,RequestHandledEvent。如果你的Bean想收到这些事件的通知,可以实现ApplicationListener接口。

作者:jackiehff 发表于2013-4-27 10:40:11 原文链接
阅读:41 评论:0 查看评论

    
[2]proc文件系统------《深入理解Linux内核架构》笔记
    来源: 互联网  发布时间: 2013-11-19

proc文件系统

1. proc简介(Process Data System, 进程数据系统)

proc文件系统属于虚拟文件系统,即该文件系统的数据,由内核动态生成,并不会存放在持久存储数据中。

proc文件系统,使得内核可以生成与系统状态和配置有关的信息。该信息可以由用户和系统程序从普通文件读取,而无需专门的工具与内核通信。比如可以通过cat status打印进程的状态信息,如下:

daniel@daniel-HP-ProBook-4411s:/proc/self$ cat status
Name:	bash
State:	S (sleeping)
Tgid:	5797
Pid:	5797
PPid:	4378
TracerPid:	0
Uid:	1000	1000	1000	1000
Gid:	1000	1000	1000	1000
FDSize:	256
......

从内核开发趋势来看,正在远离用proc文件系统提供的信息,而倾向于采用特定与问题的虚拟文件系统来导出数据。一个很好的例子就是USB文件系统,将与USB子系统有关的许多状态信息导出到用户空间,而没有给proc增加新的负担。但这并不意味这,proc文件系统变的多余,当今,/proc依旧重要,不仅在安装新的发布版时,而且也用于支持(自动化的)系统管理。

proc文件系统主要有如下几个主要功能:

a. 用于查看进程的数据信息,别忘了proc的全称为process data system

b. 查看与特定的内核子系统无关的一般信息,如/proc/iomem, /proc/ioports, /proc/interrupts

c. 查看网络信息,/proc/net子目录提供了内核的各种网络选项的有关数据。

d. 查看和修改系统控制参数,由/proc/sys子目录提供。例,可以通过cat /proc/sys/vm/swappiness 查看交换算法在换出页时的积极程度。

2. proc的数据结构

与Ext2一样,proc大量使用了VFS数据结构,因为作为一种文件系统,它必须集成到内核的VFS抽象层中。但,毕竟proc只是用于获取内核的数据为主要目的,所以在其设计的过程中,遵循简单实用的特性,较Ext2简单。


图1-1 底层为proc的VFS结构

图1-1中绿色方框的部分为proc实现的部分,proc中文件的大小为0,所以inode中的i_mapping并没有使用,值为NULL。proc_dir_entry用于表示一个proc文件系统中的目录,通过proc_mkdir创建,目录之间的树形结构通过proc_dir_entry中的*next, *parent, *subdir维护。图1-1中所涉及的结构体请参考书中的第8, 10章和Linux内核源代码。

以下以查询一个目录为例(主要涉及path_lookup函数,查找过程与VFS与Ext2文件系统一致),得益于VFS文件系统,proc文件系统只需要自定义实现lookup接口。因为查找过程将在一定时间到达real_lookup,该函数将通过调用dentry->i_op->lookup实现。

dentry->i_op->lookup,对于/proc文件,为proc_root_lookup;对于/proc目录一下的非PID目录,为proc_lookup;对于/proc下的PID目录,为proc_tgid_base_operations。

// proc_root_lookup函数的主要功能
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry, 
  struct nameidata *nd)
{
  	if (!proc_lookup(dir, dentry, nd)) {//顺序扫描指定路径的各个分量
  		return NULL;
  	}
  	
  //需要扫描的目录为一个pid目录,而该pid目录的proc_dir_entry还没有创建。
  	return proc_pid_lookup(dir, dentry, nd); // 查找指定pid目录下的目录或文件
  }
}

// proc_lookup 函数,PDE主要是由container_of机制实现的
struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, 
  struct nameidata *nd)
{
	return proc_lookup_de(PDE(dir), dir, dentry);
}

/*
 * Don't create negative dentries here, return -ENOENT by hand
 * instead.
 */
struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, 
  struct dentry *dentry)
{
	struct inode *inode = NULL;
	int error = -ENOENT;

	spin_lock(&proc_subdir_lock);
	for (de = de->subdir; de ; de = de->next) { //遍历de下面的所有路径分量
		if (de->namelen != dentry->d_name.len)
			continue;
		if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
			unsigned int ino;

			ino = de->low_ino;
			de_get(de);
			spin_unlock(&proc_subdir_lock);
			error = -EINVAL;
			inode = proc_get_inode(dir->i_sb, ino, de); // 查找成功,创建proc_dir_entry *de对应的proc_inode, 并返回&(proc_inode.vfs_inode)。注意inode的inode_operations初始化为de->proc_iops。
			goto out_unlock;
		}
	}
	spin_unlock(&pr      
    
[3]【五一呈献】Java 全能高效 MVC & REST 开发框架 Portal-Basic v3.1.1 正式发布
    来源: 互联网  发布时间: 2013-11-19

    Portal-Basic 是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截、Form / Dao / Spring Bean 装配、国际化、文件上传下载和页面静态化等基础 Web 应用组件,提供高效灵活的纯 Jsp/Servlet API 编程模型,可完美整合 Spring,支持 Action Convention,能快速开发传统风格和 RESTful 风格应用程序,文档和示例完善,非常容易学习。

  Portal-Basic 源码、示例及文档资源:请访问项目主页 ^_*

    Portal-Basic在设计之初就充分注重功能、性能与使用体验。Portal-Basic主要特点:

★ 功能全面:内置稳定高效的MVC基础架构和DAO框架,支持Action拦截、Form Bean / Dao Bean / Spring Bean装配和声明式事务,提供国际化、文件上传下载、缓存和页面静态化等常用Web组件,能满足绝大部分Web应用的需要。

★ 高度扩展:Portal-Basic通过的plug-in机制可以灵活扩展,Portal-Basic发布包中自带的portal-basic-ext-rest和portal-basic-ext-spring均以插件的形式提供,用户可根据需要加载或卸载这些插件。应用程序开发者也可以根据实际需要编写自定义插件来扩展Portal-Basic。

★ 强大的整合能力:Portal-Basic是一个Full-Stack框架,同时也是一个开放式框架,可以以非常简单的方式整合第三方组件。本开发手册会详细阐述如何在Portal-Basic中整合FreeMarker、Velocity、UrlRewrite、EHCache-Web、Spring、Hibernate和MyBaits等常用框架和组件。

★ 高性能:性能要求是Portal-Basic的硬性指标,从每个模块的设计到每行代码的实现都力求简洁高效。另外,Portal-Basic并没有对JSP/Servet API进行过多封装,开发者仍然使用JSP/Servet API开发应用程序,没有过多的迂回,性能得到保证。

★ 优秀的使用体验:Portal-Basic的设计目标之一是提供良好的开发体验,尽量减少应用程序开发者的工作,API的设计力求简单、完整、明确。同时,Portal-Basic为应用开发提供了大量Util工具,用来处理应用程序开发过程中通常会遇到的一般性问题,进一步减少应用程序开发者的工作负担。

★ 平缓的学习曲线:平缓的学习曲线:学习使用Portal-Basic只需掌握一定的Core Java与JSP/Servlet知识,本开发手册会循序渐进阐述每个知识点,每个知识点都会结合完整的示例进行讲述,知识点之间前后呼应,确保学习者在学习时温故知新,融会贯通。

★ 完善的技术支持:除了提供完善的开发手册和示例代码以外,还提供博客和QQ群用于解答使用Portal-Basic过程中碰到的所有问题。

 

    * Portal-Basic 总体架构

 

    * Portal-Basic 应用程序依赖关系

Portal-Basic 3.1.1 更新:

1、支持异步 Action(“异步处理” 是 Servlet 3.0 的新特性之一):

1) com.bruce.mvc 包中增加异步任务接口 AsyncTask 及实现类 AbstractAsyncTask、ActionTask
2) com.bruce.mvc.ActionSupport 增加异步处理相关方法:startAsync(...)

2、支持异步 REST Action(在 portal-basic-exe-rest-3.1.1 插件中实现):

1) com.bruce.ext.rest 包中增加 REST 异步任务实现类 RestActionTask
2) com.bruce.ext.rest.RestActionSupport 增加异步处理支持

3、增加两个 JDBC SessionMgr:

1) com.bruce.dao.jdbc.DruidSessionMgr :使用 Druid 连接池连接数据库
2) com.bruce.dao.jdbc.JndiSessionMgr  :使用 JNDI 连接池连接数据库

 4、其它更新:

1) 测试工程 MyPortal 加入异步处理 Action 请求和异步 Rest Action 请求示例
2) 测试工程 MyPortal 的所有 Hibernate 和 JDBC 示例都使用 Druid 取代原来的 Proxool 连接池
3) 开发手册《Portal-Basic Java Web 应用开发框架(v3.1.20130420)》加入 “异步 Action” 章节
4) Portal-Basic 的依赖库 “portal-basic-lib” 和 “spring-lib” 中的所有 jar 包更新到最新版本

 5、应用程序升级说明:

1) Portal-Basic 3.1.1 的 “异步处理” 功能只适用于支持 Servlet 3.0 的应用环境(如:JaveEE 6 / Tomcat 7)
2) 如果应用环境不支持 Servlet 3.0(如:JaveEE 5 / Tomcat 6),则只能使用原有功能
3) Portal-Basic 3.1.1 不再提供 JDK 1.5 的兼容版本
4) Portal-Basic 3.1.1 完全兼容 Portal-Basic 3.0.1 (非 JDK 1.5 版本)

 Portal-Basic 3.0.1 更新:

1、增加 Action Convention,支持“Action 零配置”:

1) 根据 Action 请求的地址信息自动加载 Action,并调用相应的入口方法处理请求
2) 根据 Action 请求的地址信息和 Action Result 自动组合出输出页面的地址并转发
3) 通过 @Result/@Results 和 @ExceptionMapping/@ExceptionMappings 注解自定义 Result 和 Exception 处理策略

2、增加 REST 支持:

1) 增加 REST 插件包 portal-basic-ext-rest-3.0.1.jar 用于支持 REST
2) portal-basic-ext 通过 com.bruce.ext.rest.RestDispatcher 过滤器把 REST 请求转换为 Action 请求
3) portal-basic-ext 提供 com.bruce.ext.rest.RestActionSupport 作为处理 REST 请求的 Action 基类
4) Action 的 REST 请求处理方法通过声明 @Get/@Post/@Put/@Delete 注解来匹配 REST 地址格式,并注入参数
5) 内置 Rails-style REST 标准方法
6) 同时支持 HTML/XML/JSON 三种视图格式,应用程序也可以扩展自己的视图格式
7) portal-basic-ext 与 Action Convention 结合使用能实现“零配置”处理 REST 请求


 开发文档目录:

 相关链接:

Portal-Basic Java Web 应用开发框架 —— 概述 Portal-Basic Java Web 应用开发框架:应用篇(一) —— 配置文件 Portal-Basic Java Web 应用开发框架:应用篇(二) —— Action 使用 Portal-Basic Java Web 应用开发框架:应用篇(三) —— 国际化 Portal-Basic Java Web 应用开发框架:应用篇(四) —— 文件上传和下载 Portal-Basic Java Web 应用开发框架:应用篇(五) —— DAO 框架 Portal-Basic Java Web 应用开发框架:应用篇(六) —— 公共组件 Portal-Basic Java Web 应用开发框架:应用篇(七) —— 页面静态化 Portal-Basic Java Web 应用开发框架:应用篇(八) —— 整合 Freemarker Portal-Basic Java Web 应用开发框架:应用篇(九) —— 多入口 Action Portal-Basic Java Web 应用开发框架:应用篇(十) —— 新 DAO 访问接口 Portal-Basic Java Web 应用开发框架:应用篇(十一) —— 整合 Spring Portal-Basic Java Web 应用开发框架:应用篇(十二) —— Action Convention
Portal-Basic Java Web 应用开发框架:应用篇(十三) —— REST Convention
Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
作者:DuMiYue 发表于2013-4-26 11:04:04 原文链接
阅读:151 评论:2
    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3