??xml version="1.0" encoding="utf-8" standalone="yes"?>
There is a small number of major design decisions that make Kafka different from most other messaging systems:
The working of the zookeeper-based load balancing is described below. Zookeeper watchers are registered on the following events—
Internally, the producer maintains an elastic pool of connections to the brokers, one per broker. This pool is kept updated to establish/maintain connections to all the live brokers, through the zookeeper watcher callbacks. When a producer request for a particular topic comes in, a broker partition is picked by the partitioner (see section on semantic partitioning). The available producer connection is used from the pool to send the data to the selected broker partition.
producer通过zkQ管理与broker的连接。当一个请求,Ҏ(gu)partition rule 计算分区Q从q接池选择对应的connectionQ发送数据?br />
6.2 Asynchronous send
2.jsp代码Q文件login.jsp
目的Q当你再ơ打开login.jsp面Q表单里面的内容已经写好了,是你上一ơ的登陆信息Q?/p>
- 修改U有?/span>
- U有Ҏ(gu)
- 试U有Ҏ(gu)
- Mock
- Verify
- 静态方?/span>
- Mock
- 抛出异常
- Verify
- Mockc部分方?/span>
- Mock Java core libraryQ如Q?/span>Thread
- Mock 构造器
/Files/shijian/powermock.rar
题记Q徏议关?/span>spring问题Q请记得查看spring reference?/span>
一?/span>annotation前生后世
Annotations do not directly affect program semantics, but they do affect the way programs are treated by tools and libraries, which can in turn affect the semantics of the running program. Annotations can be read from source files, class files, or reflectively at run time.
译:annotation不会直接影响E序的语义,xxx?/span>Annotation可以从源文g?/span>class文g、通过反射在运行时d?/span>
参考:http://www.developer.com/print.php/3556176
1. 定义
Annotation type declarations are similar to normal interface declarations. An at-sign (@) precedes the interface keyword. Each method declaration defines an element of the annotation type. Method declarations must not have any parameters or a throws clause. Return types are restricted to primitives, String, Class, enums, annotations, and arrays of the preceding types. Methods can have default values.
Annotation声明与普通的interface非常怼Q在关键?/span>interface前加@。每一个方法的声明定义一?/span>annotation的元素。方法不能有M的参数或throws异常。返回类型被限制为:原始cd?/span>String?/span>Class?/span>enum?/span>annotation、前面描q的cdl成的数l?/span>method定义允许有默认倹{?/span>
2. Java annotation
There are two types of annotations available with JDK5:
1Q?nbsp;Simple annotations: These are the basic types supplied with Tiger, which you can use to annotate your code only; you cannot use those to create a custom annotation type.
三个基本?/span>annotationQ如Q?/span>Override?/span>Deprecated?/span>SuppresswarningsQ不能用它d义新?/span>annotation?/span>
2Q?nbsp;Meta annotations: These are the annotation types designed for annotating annotation-type declarations. Simply speaking, these are called the annotations-of-annotations.
?/span>annotationQ定?/span>annotation的类型。如Q?/span>Target?/span>Retention?/span>Documented?/span>Inherited?/span>
A. TargetQ声?/span>annotation注解的目标类型。如@Target(ElementType.TYPE)?/span>@Target(ElementType.METHOD)
B. RetentionQ声?/span>annotation被保留的长度。如Q?/span>RetentionPolicy.SOURCE?/span>RetentionPolicy.CLASS?/span>RetentionPolicy.RUNTIME
C. DocumentedQ声明被注解?/span>target生成doc是否需要显C?/span>annotation信息?/span>
D. InheritedQ?/span>xxx
3. annotation作用
aQ?nbsp;不媄响程序原本语义的情况下,增加信息+工具=声明式编E。如Q?/span>spring aop
bQ?nbsp;~译?/span> Q?/span>
二、利?/span>annotation实现aop
1. 思\
AQ自定义注解定义规则Q何时执行)
BQ标记行为(执行什么)
CQ通过反射生成代理Q在对象执行MҎ(gu)Ӟq行拦截判断是否W合规则Q若W合Q执行对应的行ؓ?/span>
2. 例子
场景Q一个表演家Q表演节目后Q观众拍手鼓?/span>
原始Q表演家拥有所有观众的引用Q在自己表演完后Q通知观众鼓掌
问题Q表演家应该x表演自n的事情,有哪些观众、观众是否鼓掌,不是其所x?/span>
改进Q?/span>AOP方式Q表演家仅关注表演,观众鼓掌由其它h负责
ȝQ?/span>
面向切面~程 (AOP) 提供从另一个角度来考虑E序l构以完善面向对象编E(OOPQ?/span> 面向对象应用程序分解成各个层次的对象,?/span>AOP程序分解成各个切面或者说x炏V这使得可以模块化诸如事务管理等q些横切多个对象的关注点?/span>
三?/span>spring aop如何使用annotation
1. 基本方式Q通过ProxyFactoryBean
aQ通知
bQ切入点
bQ通知+切入?/span> à 切面
cQ实际对?/span>+接口+切面 à 接口代理Q)
2. 自动代理方式Q?/span>
基本方式的问题是Q?/span>xml配置文gJ琐?/span>
1Q基?/span>spring上下文的通知?/span>Bean的自动代理(利用PostBeanProcessor Q)
BeanNameAutoProxyCreatorQ有属性:beanNamesQ被代理对象Q?/span>interceptorNamesQ通知Q。自动代?/span>beanNames指定?/span>beanQ此?/span>interceptorNames指定通知Q但interceptor需要实现特定的接口Q如Q?/span>MethodBeforeAdvice?/span>
2Q?nbsp;ZaspectJ注解驱动
使用aspectJ风格的注解。原理:生成代理Q仅Ҏ(gu)U别。?/span>AspectJ 提供的一个库来做切点Q?/span>pointcutQ解析和匚w?/span>
4. <aop:config>Q优点:Mc都能{化ؓ切面Q不需要特D接口或注解Q原?/span>pojo对象
5. aop参数传递,见:spring reference 6.3.3.6 通知参数
aQ?nbsp;around切点Q必M?/span>ProceedingJoinPoint参数Q通过ProceedingJoinPoint取得Ҏ(gu)的所有信息?/span>
bQ?nbsp;其它切点Q利?/span>JoinPoint取得Ҏ(gu)的所有参数?/span>
cQ?nbsp;通过参数名绑定传递参敎ͼ未理?/span>?/span>
四?/span>annotation相关技?/span>
1. cglib
它的原理是?/span>Enhancer生成一个原有类的子c,q且讄?/span>callback?/span>proxyQ?/span> 则原有类的每个方法调用都会{用实CMethodInterceptor接口?/span>proxy?/span>intercept() 函数?/span>
2. asm
ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or dynamically generate classes, directly in binary form. Provided common transformations and analysis algorithms allow to easily assemble custom complex transformations and code analysis tools.
ASM offer similar functionality as other bytecode frameworks, but it is focused on simplicity of use and performance.
单理?/span>asm是比cglib更高U的code generate lib?/span>
五?/span>others问题
1. Generics
Generics - This long-awaited enhancement to the type system allows a type or method to operate on objects of various types while providing compile-time type safety. It adds compile-time type safety to the Collections Framework and eliminates the drudgery of casting. See theGenerics Tutorial. (JSR 14)
泛型提供了编译时cd查安全。这点很重要?/span> Q?/span>
2. Z?/span>spring aop aspectJ anonotation?/span>pointcut声明Q必L解在Ҏ(gu)?/span> Q通过Ҏ(gu)唯一标识一?/span>pointcut Q?/span>
猜测Q?/span>@Pointcut?/span>Target属性指定仅?/span>method。方法签名成?/span>pointcut?/span>id?/span>
一、摘?/span>
1. 什么是“代理”
2. 代理模式与适配器模式、装饰者模式的区别Q适用场景
3. 手工代理
4. 动态代理的原理
二、什么是“代理”
如:一?/span>CEOQ会有一个助理,M需?/span>CEO处理的事情,都会l过助理qo、整理后交给CEO。助理就?/span>CEO的代理?/span>
自己理解Q代理就是ؓ帮实际的执行者,做数据的qo和控Ӟ为实际执行者屏蔽掉外部其它因素的媄响,专心d应该做的事情?/span>
三、代理模式与适配器模式、装饰者模式的区别Q适用场景
1、代理模?/span>
HeadFirst 定义Qؓ另一个对象提供一个替w或占位W以控制对这个对象的讉K?br />
如上图,代理模式的结构?/span>
适用的场景,如:q程讉K、访问权限控制、日志记录等?br />
装饰者模式,IOcdl构如下Q?/span>
可以?/span>OutputStream à FileOutputStream à BufferedOutputStreamQ功能依ơ增强,为对象增加更多的行ؓ?/span>
自己理解Q目的不一P代理是ؓ控制对被代理对象的访问;装饰者,是对被装饰者功能的增强Q避免过度用承实C同的功能?/span>
ClienthExecuteClassQ但ExecuteClass暴露的接口不W合client的要求,在双方系l都不修改的情况下,利用适配器模式解x问题?br />
三、手工代?br />
场景Q根?/span>idQ获?/span>ItemQ代理检查用L权限是否有权限查?/span>ItemQ已l记?/span>log日志。具体代码很Ҏ(gu)实现?br />
四、动态代?/span>
对上面的场景Q如果用动态代理,步骤Q?/span>
1. Ҏ(gu)interfaceQ通过loaderQ生?/span>Class对象
Class clazz = Proxy.getProxyClass(ItemService.class.getClassLoader(), ItemService.class);
2. 通过反射Q获?/span>Class对象?/span>Construct对象Q注意:Construct对象需要的参数cdQ?/span>
Constructor c = clazz.getConstructor(InvocationHandler.class);
3. 调用Construct对象 newInstance()生成实例对象
proxy = (ItemService)c.newInstance(this); //this?/span>InvocationHandler实例
思考问题:实现原理是什?/span> Q?/span>
对于上面场景Q实际动态生成的代理的类图。对代理的Q何调用都会,super.handle.invoke()Q用户实?/span>InvocationHandlerQ覆?/span>invokeҎ(gu)Q实现基于方法的控制?/span>
从类图,也解释了Z么只能实?#8220;接口”的动态代理,因ؓ代理本n需要?/span>ProxyQ如果实?#8220;c?#8221;的代理,意味着要同时承两个类Q与Java不支持多l承相违背?br />
附代码是从网上摘抄过来的Q代理的源码Q?br />
1.Thread?/span>ThreadLocalMap threadLocals 属?/span>什么时候实例化 Q?/span> U程实例化时?/span> Q?br />
{:W一ơsetӞ会判断是否ؓnullQ若为nullQ初始化?/span>
2.ThreadLocalMap replaceStaleEntry(key,
value, i); 做了什?/span> Q?/span>
{:全清z?/span>stale对象Q存攑ֽ前对象在发现的第一?/span>stale位置。因为Entry是承WeakRerfenceQQ何一ơ的垃圾攉Q都会导致其引用的对象被回收?br />
4.?/span>Map方式的一些区?/span> Q?br />
Map{略Q?/span>a、相?/span>hash&keyQ覆?/span>valueQ?/span> b、相?/span>hashQ?/span>key不同Q当前元素做为单向链的第一个元素,原来W一个元素做为当前元素的下一个?br />
ThreadLocalMap{略Qa相同Q?/span>是不存在b情况Q以ThreadLocal作ؓkeyQ?/span>ThreadLocal?/span>threadLocalHashCode?/span>原子AtomicInteger计算getAndAdd(0x61c88647)得到Q在Entry[]数组的位|,通过threadLocalHashCode
& (length-1)计算Q对于b情况Ql查?/span>Entry[]数组?/span>下一个位|,是否可存放(key相同或nullQ;当size>=threshold(len*2/3)做resize=oldLen*2.
题记Q一?/span>cookieQ整个下午都没有扑ֈ解决的办法?/span>
一、遇到的问题
1. 情景Q访?/span>http://list.mall.daily.taobao.net/50024400/xxxQ当前页面通过ajaxhq告Q请求的域ؓhttp://tmatch.simba.taobao.com/xxxQ广告引擎向面U?/span>seesion范围?/span>cookie?/span>_backQ用于标识翻;
2. 问题Q?/span>
点击当前面的翻,IE下广告不页Q通过firebug?/span>httpwatchҎ(gu)Q发?/span>IE?/span>cookie“_back”不正。开始猜是引擎U?/span>cookie的逻辑存在问题Q但很多地方都在使用此接口,均没有问题?/span>
且有人的机器页正常Q此时怀疑是览器设|问题?再用httpwatch观察“httph?/span>”Q发?/span>_back没有回传l引擎(其实httpwatch?/span>cookies也可以观察到Q如果发?/span>cookie的话Q会昄?/span>SentQ之前只观察?/span>ReceivedQ? 认是浏览器的问题?/span>
3. 解决Q打开IE隐私设计Q通常默认讄?/span>“?/span>”Q拒l?/span>“没有隐私政策的第三方cookie ...”Q意味着_backq没有成功写入客LQ所有请求引擎导致不能正回?/span>_backQ翻失败?/span>
q么说淘宝所有的q告的翻都是不可用?/span> Q肯定不是。问题在”W一?/span> Cookie 来自(zhn)正览的网站,它们可以是永久的或时的Q第三方 Cookie 来自(zhn)正览的网站上的其他网站的q告”Q对于浏览器“taobao.net?/span>taobao.com”是不同的两个网站,所以引擎的_back是无法种在客L。此情景?/span>daliy环境Q线上的环境讉K的是list.mall.daily.taobao.com,所以不存在“W三?/span>cookie”的概念,q告是可以正显C?/span>
二、关?/span>cookie知?/span>
1.IE Cookie的格?/span>
W一?/span>“名称”Q第二行“?/span>”Q第三行“所属域” ...比如“.taobao.com”存在cnaQ此cookie会被览器自动发送到M属于此域的子域;www.taobao.com\taobao.comQ后面的是根域,前一个是二域?/span>xp存放目录为:C:\Documents and Settings\<username>\Cookies\Q文件命名:你的用户?/span>@生成COOKIE?/span>domain[COOKIE改变的次?/span>].txt
参考:http://blog.csdn.net/zhangxinrun/archive/2010/07/31/5779574.aspx
2.Js Cookie跨域?/span>
http://blog.csdn.net/tongdoudpj/archive/2009/05/10/4166096.aspx
3.cookie?/span>session的关p?/span>
Ҏ(gu)的原因:http协议的无状态性,cookie的出现就是ؓ了解册个问题?/span>
session是一U在客户端与服务器之间保持状态的解决Ҏ(gu)。服务端存储内容Q返回对应的keyl客LQ当下次讉KӞ带上?/span>keyQ实现状态的l持?/span>
session实现Q?/span>
1.依赖cookieQ?/span>The session cookie is stored in temporary memory and is not retained after the browser is closed。(实际试QIE8Q未?描述的位|找?/span>sessionU别cookie对应的文Ӟ猜测‘临时存储在浏览器内存’Q当关闭览器时则丢失keyQ?/span>
2.url重写?/span>Servlet规范定义此功能。当览器禁?/span>cookieӞqsessionU别的内容也不会被存储?/span>resp.encodeRedirectURL(url)Q且仅当用cookie时有效,重写l果如:http://www.demo.com/cookie.do;jsessionid=19gfy1sg740dl1whwd72lbqlhb
疑问Q?/span>server如何判断Q是否需要重写呢Q从实验现象看,判断是否收到name=JSESSIONID ?/span>cookieQ若无,则进?/span>url重写?/span>
最好的方式Q翻?/span>tomcat?/span>jetty的源码实玎ͼ但未扑ֈ对应的代码?/span>
关于cookie的详l信息参见: http://en.wikipedia.org/wiki/HTTP_cookie
题记Q?/span>.java源文件是如何被找到的Q?/span>.class字节码文件是如何被找到的Q?/span>内容Q全部借鉴《Java深度历险?/strong>
PackageQ命名空间的问题Q隔ȝ之间的关pR?/span>
ImportQ声明引入的cȝ路径Q仅在编译时有作用,~译后的文gQ类的声明已lؓ全\径)Q好?#8220;明晰的代码结构,分离在多个文Ӟ帮助实现动态链接的功能”?/span>
一?span style="font-family:宋体;Times New Roman";Times New Roman"">~译
package edu.nctu;
import com.taobao.Test;
import edu.nctu.*;
public class C
{
public void print() {
System.out.println("package test") ;
}
}
步骤Q?/span>
1. Ҏ(gu)classpath建立Q?#8220;cȝ对\径参考表”
如:javac –cp .;d:/test/Q在d:/下执行,l果Q?/span>d:/Q?/span>d:/test/?/span>
2. ?#8220;cȝ对\径参考表”作ؓ相对起始路径Q验证能够找到所有要用的package?/span>
Ҏ(gu)import引入?/span>package或全限定cdQ?/span>import packagename.classnameQ?/span>?/span>packagename之中?/span>“.”?/span>“/”取代.
2.1 ?/span>com.taobao.*形式Q验证在d:/目录下是否存?/span>com/taobao/目录Q若不存在,依次?/span>d:/test/?/span>
2.2 ?/span>com.taobao.Test形式Q验证是否存?/span>com/taobao/TestQ与上相同?/span>
3. 建立“cd考表”?#8220;相对cd考表”
3.1 cd考表Q?/span>com.taobao.Test
3.2 cȝ对参考表Q?/span>com.taobao.*
4. 解析class{} 包含的代?/span>
是否全限定类?/span>
4.1 是,l对路径 =“cȝ对\径参考表”+全限定类名,查找Q不存在为错误;
4.2 否,l对路径 =“cȝ对\径参考表”Q查找;
4.2.1是,~译
4.2.2否,解析package
4.2.2.1 在类参考表Q是否存?/span>1以上的同名类Q出错;否则Q绝对\?/span> =“cȝ对\径参考表”+ “cd考表”Q正?/span>
4.2.2.2 在类参考表找不刎ͼl对路径 = “cȝ对\径参考表”+ “相对cd考表”Q若存在一个以上的c,出错Q否则,正确?/span>
提醒Q?/span>
1.
如果已经存在A .class文gQ?/span>A .java不是必须的;
2. ~译器在扑ֈ源码或字节码Q对会验证是否属于此packageQ但没有通过make机制的编译,是不会验证的Qmake机制Q即~译器自动维护具有相互依赖关pȝ文gQjavac命o直接~译文gQ如Qjavac -cp d:/test com.edu.C.javaQ编译器角度Qcom.edu.C.java 是一个文件名Q且没有通过make机制Q所?cp指定的\径徏立的“cȝ对\径参考表”也不会用,~译器直接在当前目录下查?/span>com.edu.C.javaQ结?ClassNotFoundException ?/span>
二?span style="font-family:宋体;Times New Roman";Times New Roman"">q行
1?nbsp;~译l束后,import指o已经不存在,c被替换?#8220;全限定类?#8221;
2?nbsp;q行时类的加载,都是通过classloaderq行Q所以必遵循正的“包目?#8221;l构Q不是否直接通过命o行执行?/span>
步骤Q?/span>
1. 建立“字节码\径参考表”Q根?/span>classpath
2. l对路径 = “字节码\径参考表”+ 全限定类名,查找Q加载;找不刎ͼ报错?/span>