1. 下载解压的版本:没有安全设置,开发设置全开(热部署等),生产版本需要修改
2. probe.sh?
3. jboss根目录:
    client用于远程客户端;
    lib用于启动jboss核心,不应该放入任何其他lib;
    server下的每个目录都叫一个server配置,每个配置包含一套服务和应用
4. server配置目录下的四个主目录:conf/deploy/deployers/lib 启动后新建目录:data log tmp work
    conf:只在启动时扫描一次,修改后需要重启server
        bootstrap.xml: 核心的microcontainser服务
        jboss-service.xml: 核心JMX服务
        jboss-log4j.xml:
        login-config.xml:验证授权模块
        standerjboss.xml: 各种ejb容器
    deploy:应用与服务的部署目录
    deployers:存放所有的jboss服务(用于分辨、部署不同的应用)
    lib:一个server配置里所有服务、应用都共享的lib
    新建的目录:
    data:服务和应用用于存放临时文件 而向文件系统写入的数据
    log:boot.log(log服务启动前的日志), server.log, audit.log
    tmp:各种服务用的临时文件夹
    work:web server使用的存放编译后的jsp和其他临时数据
5. -c命令改变启动配置 ./run.sh -c all,使用all配置启动

管理配置
1. 早期使用JMX(Java Management Extension),service以MBean方式提供 可以容易的插入/移出JMX kenel
    从JBoss4.0.3开始使用microcontainer,可以使用POJO代替MBean,但是现在MBean仍然起着十分重要的作用
2. microcontainer:类似spring的依赖注入系统,可以做如下工作
    声明初始化对象
    初始化时提供构造参数
    设置属性
    对象依赖:对象A引用对象B,需要在B初始化后在初始化
   
    并不是所有service都移植到了microcontainer,所以JMX仍然很重要(JMS JNDI)
   
    在server/default/config目录配置,大部分*-jboss-beans.xml,profile.xml是一个例外
   
3. JMX: 初始化MBean通过jboss-service.xml及其他*-service.xml
4. MBean name:domain:key,key

除了基于JMX标准的mbean实现方案,JBoss还支持用一个xml文件描述的方式将普通的Java对象开放为一个mbean,即 XMBean。在service描述文件里可以用xmbean-dd属性指明一个外部的XMBean定义,或者将xmbean-dd属性赋值为"",在 mbean标签中内嵌xmbean的内容说明。XMBean的优势在于a)不需要目标Java对象实现任何JMX有关的接口;b)相对Standard MBean可以在xmbean-dd的xml内提供丰富的元数据描述信息。


5. JMX kernel描述文件:server/xxx/conf/jboss-service.xml
6. 除了定义MBean的配置文件,也有Mbean使用的配置文件
    bootstrap.xml:初始化POJO的主文件
    jacorb.properties:用于配置Java Object Request Broker (JacORB)服务, 配置应用集群会使用到
    jax-ws-catalog.xml:将xml metadata名字映射到本地metadata描述文件,支持jax-ws需要
    jbossjta-properties.xml:已过期,使用
    jbossts-properties.xml:
    jboss-log4j.xml:
    jboss-minimal.xml:最小的应用配置,不会使用
    jboss-service.xml:JMX kernel使用
    jndi.properties:JNDI service用于定义默认属性
    login-config.xml:Security service用于定义login model
    standardjboss.xml :ejb用于定义设置
    standardjbosscmp-jdbc.cmp:当使用ejb2.x cmp,用于ejb为各种数据库定义类型映射
7. 配置目录
    jboss.home.dir
    jboss.server.base.dir
   
    run.sh -Djboss.server.log.dir=d:/log
    如果同时有url/dir,两个都要修改
8. 常用Mbean
    jboss:type=Service,name=SystemProperties
    jboss:service=JNDIView
    jboss.system:type=Log4jService,service=Logging
    !jboss.system:service=ThreadPool
    jboss.system:type=Server,  jboss.system:type=ServerConfig,jboss.system:type=ServerInfo
   
部署
1. 热部署缺点:任何应用的状态,包括session的状态都会丢失,
    如何热部署deploy\hdscanner-jboss-beans.xml,HDScanner scanEnabled
2. 新的class loader基于VFS:Virtual File System:简化、统一应用server的文件处理
3. 多class loader
    应用服务器使用多CL,每个load特定class,用于分隔部署的不同的应用
    Server跟踪CL,不仅定义那个CL加载那个class,而且定义规则一个CL是否能够访问其他CL、是否对其他CL可建
4. 数据源docs/examples/jca:*-ds.xml,部署后创建的Mbean:
    DataSourceBinding:管理 javax.sql.DataSource
    LocalTxCM:管理ConnectionManager,管理连接池,可以管理本地分布事务,比如定义timeout时间
    XATxCM:同上 管理XA
    NoTxCM:同上
    ManagedConnectionFactory:管理connection factory,创建db 连接
    ManagedConnectionPool:管理db 连接池,监控活动连接,修改最大最小连接数量
   
集群
1. 添加节点不需要管理,节点之间相互发现(哪些属性相同的节点可以认为是一个集群?如何相互发现,仅限于局域网?)   
2. jboss提供一个复杂的分布式cache 实现有状态组件在节点之间复制状态信息
3. homogenous cluster:应用、服务都相同
   heterogeneous cluster : 部署应用不同你
4. cluster不存在时,第一个启动的节点建立cluster,并作为协调者(coordinator),管理其他节点加入cluster
5. 自动发现功能是基于组通知机制:multicast(发送者只发送消息一次,并且不需要知道接受者的list),只要接受者监听channel,就能收到信息
    多播的channel包含 地址和端口
6. jboss使用JGroups作为点对点的通信工具,JGroups是一个稳定的多播通信工具
7. fault-tolerant: 一台服务器down,用户的状态信息能保存在另一台服务器,继续操作
8. state replication:jboss使用cluster cache复制各个node的状态信息
    需要牺牲性能,只有复制完成,才能给用户回复
9. TOTAL VERSUS BUDDY:前者集中,资源消耗大,后者环状结对
10. Session passivation:用户存储长期没响应的session,可能存于disk,db
11.    JGroups的两个组件:channel和protocal stack
12. 组成集群需要:
    多播地址:all\deploy\cluster\..\jgroups-channelfactory-stacks
    多播端口:all\deploy\cluster\..\jgroups-channelfactory-stacks
    clusterName/partitionName: all\deploy\cluster\hapartition-jboss-beans.xml
13. 各种j2ee组件对集群和复制的需要
            Load Balance    StateReplication
    JSP        Y                Y
    slsb    Y                N
    sfsb    Y                Y
    entity    N                Y
    MDB        Y                N
    JNDI    Y                Y
14. 如果应用是无状态的 没有必要用集群,只用load balance就行
    即使有状态,也不一定非要集群,除非需要fault-tolerant
15. 软件负载均衡可以用tomcat 也可以通过ajp协议使用本地web server
    AJP协议是专门用于与类似jboss web app通信的机遇TCP的二进制协议
16. apache有个插件mod_proxy:http ajp负载均衡都支持
17. 实现sticky-session:客户端浏览器始终访问同一个server:修改deploy/jbossweb.sar/server.xml
    添加jvmRoute,名字在集群中必须是唯一的
    <Service name="jboss.web">
    <Connector .../>
    <Connector .../>
    <Engine name="jboss.web"
            defaultHost="localhost"
            jvmRoute="node1">
           
session复制       
18. session复制: WEB-INF/web.xml,http的session会加入到分布式cache
    <web-app>
        <distributable/>
        ...
    </web-app>        
    http session cache:standard-session-cache在这个文件中,有一些可配置的参数:
    /all/deploy/cluster/jboss-cache-manager.sar/META-INF/jboss-cache-configs.xml
19. session复制的配置在应用程序的WEB-INF/jboss-web.xml:
    <jboss-web>
        <replication-config>
            <replication-trigger>
                SET_AND_NON_PRIMITIVE_GET
            </replication-trigger>
        </replication-config>
    </jboss-web>
   
    是整个sessin都复制 还是只复制修改的属性
    <jboss-web>
       <replication-config>
          <replication-granularity>SESSION</replication-granularity>
       </replication-config>
    </jboss-web>
    可选session/attribute/field, standard-session-cache to field-granularity-session-cache默认field,还有replication-field-batch-mode表示是否立即复制,true的意思是request结束马上执行
20. jboss-cache-configs.xml的CacheLoaderConfig
    passivation:控制cache与cacheloader的相互关系,true仅当从内存删除时才使用cacheLoader写入二级存储,false立即写入
   
    server的cacheLoader配置完,在应用的META-INF/jboss-web.xml 中配置如下才会启用passivation
    <max-active-sessions>20</max-active-sessions>
    <passivation-config>
      <use-session-passivation>TRUE</use-session-passivation>
      <passivation-min-idle-time>5</passivation-min-idle-time>
      <passivation-max-idle-time>10</passivation-max-idle-time>
    </passivation-config>

Jboss cache

HA Partition Cache:deploy/cluster/cluster-jboss-beans.xml
Stateful session bean cache:deploy/ejb3-interceptors-aop.xml
Entity bean cache :deployers/ejb3.deployer/META-INF/persistence.properties
HTTP session cache ;deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml
HTTP single-sign-on cache :Hardcoded to clustered-sso, which is aliased to ha-partition in the jboss-cache-manager-jboss-beans.xml


21. SFSB的状态复制
/all/deploy/cluster/jboss-cache-manager.sar/META-INF/jboss-cache-configs.xml:sfsb-cache
22. session bean client端得动态代理可以实现负载均衡
23. jboss使用hibernate作为其jpa实现
24. HA-JNDI service
    负载均衡和fail-over
    查询每个server的本地jndi
    自动发现naming server
    复制cache
   
    每台server同时有local和HA jndi服务,HA通过JGroups通信
    绑定到HA的对象才会在server之间复制,绑定到local不会
   
    配置文件/all/deploy/cluster/hajndi-jboss-beans.xml
    jndi配置文件jndi.properties

调试
1. 32 or 64位
    32:如果只运行jboss,2GRAM足够,可以分配一个1.4G的heap;再打怕是也没有,OS需要2G
    64:通常4G足够,越大的heap垃圾回收越慢,回收时应用程序可能长时间等待
2. OS
    CPU最好50-80,80以上就太高了
3. processor affinity
    processor affinity:大多数支持多cpu的系统都提供一个功能,限制一个给定的进程使用的cpu
    原因:cpu执行一个进程中的线程时,会将其数据和code缓存到cpu的cache,如果时间片段用完或等待资源,cpu执行其他线程,如果cpu cache够大,原线程在重新执行时有很大可能性其code和数据还在cpu的cache中(如果不在需要从ram读取,要慢很多)
   
    并不是说java不能用多cpu,有独立线程的应用可能很好的使用64个甚至更多的cpu,但是App server中每个线程的工作不是专门用于某个工作,所以很难使用4个以上的cpu
   
    如果有8个cpu,可以利用这个特性启动4个server,每个server使用两个cpu
4. JVM参数
    建议heap的最大最小值相同:-Xms -Xmx:否则每次GC之后都会花费时间判断是否调整大小
    建议young generation最大最小值相同:-XX:NewSize -XX:MaxNewSize=<size>
    建议young generation为heap的1/4到1/3
5. GC两种:minor major
    minor:the young generation
    major:tenured generation and the young generation
   
    收集YG的时候,没有被回收的存于suvior space,收集结束,YG和suvivor space清空;过程中YC满了,
   
生产环境
1. 组件server:JBOSS web server;ejb server;messaging server;web service container
2. JBoss Enterprise Application Platform:收费的企业版,包含各种经过测试的service的打包
    JBoss AS
    JBoss Web Server
    JavaServer Faces
    JBoss Clustering
    JBoss Cache
    JBoss Messaging
    JBoss Transactions JTA
    Hibernate
    JBoss Seam
3. 一台机器运行多个instance
    使用两个配置,各自拥有自己的目录
    避免port冲突:server\default\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml;
    可以使用jboss.service.binding.set改变端口
   
    虚拟ip地址:windows里设置指定ip,高级里新建ip
4. 删除不需要的service
    原因:安全,删除了一个对外的端口;消耗内存、cpu
    可以通过删除file和目录删除的服务:
        mail:mail-service.xml
        Scheduler:scheduler-service.xml  schedule-manager-service.xml
        Monitoring:monitoring-service.xml
        Messaging (JMS):/messaging jms-ra.rar
        Unique ID key generator:uuid-key-generator.sar
        Home page:ROOT.war
        JMX Console:jmx-console.war
        Web Console:management
        Quartz:quartz-ra.rar
5. 应用安全:  JMX Console, the Web Console, and the root web application
    删除
    添加安全验证
    只允许本地访问
6. 修改默认数据库
    Login modules :    conf/login-config.xml
    CMP-EJB 2.x:        conf/standardjbosscmp-jdbc.xml
    Timer service-ejb2     deploy/ejb2-timer-service.
    Timer service-ejb3     deploy/ejb3-timer-service.xml
    Schedule manager     deploy/schedule-manager-service.xml
    Messaging             deploy/messaging/hsqldb-persistence-service.xml
                        deploy/messaging/messaging-jboss-beans.xml
    UDDI                deploy/juddi-service.sar/juddi.war/WEB-INF/jboss-web.xml   
    SNMP Adaptor        deploy/snmp-adaptor.sar/attributes.xml
    UUID                deploy/uuid-key-generator.sar/META-INF/jboss-service.xml
   
    删除hsqldb-ds.xml,xxx/lib/hsqldb*.jar
7. jsp预编译
    不预编译两个缺点:第一个访问者慢;一直检查是否有更新
    server/xxx/deployers/jbossweb.deployer/web.xml
        development:如果true,检查jsp修改的间隔为modificationTestInterval
        checkInterval:如果develop是false,这个值大于0,会启动后台编译,单位秒 检查jsp是否需要重新编译
        modificationTestInterval:0表示每次访问都检查是否有更新,默认值4