精华内容
下载资源
问答
  • 代理访问规则(ACS)可以由管理员来决定用户是否...另外,用户还可以通过代理软件的UI界面来关闭这个功能。如果你关闭了代理安全功能,你只能手工恢复,或者下次系统启动后自动恢复。 如果你不想让用户自己停止或卸

          代理访问规则(ACS)可以由管理员来决定用户是否能够停止代理安全访问。要停止某个访问,在Windows下是通过 net stop 命令来完成的;在UNIX下是通过 /etc/init.d/ciscosec stop来完成。另外,用户还可以通过代理软件的UI界面来关闭这个功能。如果你关闭了代理安全功能,你只能手工恢复,或者下次系统启动后自动恢复。

         如果你不想让用户自己停止或卸载这个服务,通过以下步骤可以实现这个功能:

    1. 在规则列表的底部选择添加规则 (Add Rule),此时会弹出一个可用的规则类型列表。
    2. 选择代理服务控制规则 (Agent Service Control Rule)
    3. 在代理服务控制规则配置视图,输入以下信息:
      • 描述(Description)—输入规则的描述

      • 使能(Enabled)—使用该复选框来启用这个规则

    4. 完成动作(action)的选择,注意,在Windows平台下可能不是所以得动作都被支持。

    5. 然后,

      • 日志(Log)—复选这个功能可以开启对这个规则记录日志的功能

      • Take precedence over other rules—复选这个选项可以使本规则的优先级高于其他规则

    6. When

      • Applications in any of these selected classes
        选择一个或者多个预先配置好的应用程序类。默认这个项目是被选上的。

        注意:
        在UNIX系统, 任何具有root访问权限的用户都可以停止代理服务,为了防止这种情况发生,你还需要配置一个规则来拒绝停止代理服务,而只允许管理员用户有权限停止代理服务。
        But not in the following class—这个功能可选,你可以在这排除你不想要的应用程序类。

      • Attempt to disable agent security
        这个复选框决定管理员用户是否有权限通过服务控制管理来停止代理服务,或者通过命令行net stop "Cisco Security Agent" 在Windows下停止服务,UNIX下通过 /etc/init.d/ciscosec stop 停止服务。

      • Attempt to modify local agent configuration 
        Cisco安全代理内建了全局安全策略,你可以通过它来监视、终止或标记一个尝试修改代理配置的行为。

    7. 选择保存 (Save).

    展开全文
  • 一般故障分为 网络故障,硬件故障,软件故障,对于ActiveMQ来说就是如何改善的软件故障来提供高可用性。 介绍三种 主/从结构 10.2.1. 分享式主从结构 到主代理器挂了,有两种操作 第一种:从代理器也关闭 ...

    10.1、概述:本章主要是ActiveMQ 集群 拓扑结构设计

    10.2、代理商高可用性

    一般故障分为 网络故障,硬件故障,软件故障,对于ActiveMQ来说就是如何改善的软件故障来提供高可用性。

    介绍三种 主/从结构

    10.2.1. 分享式主从结构


    到主代理器挂了,有两种操作

    第一种:从代理器也关闭

    第二种:从代理器上位成主代理器

    如果是第二种可以如下配置

    failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false

    10.2.1.1.配置分享式主/从

    remoteURI:主代理器监听地址

    userName: 可选,用户名

    password : 可选,密码

    master(主代理器配置)

    <services>
    <masterConnector remoteURI= "tcp://localhost:62001" userName="Rob" password="Davies"/>
    </services>
    slave(从代理器配置)

    shutdownOnmasterFailure : 默认值false, 当master挂了,slave将会关闭

    waitForslave: 默认值false  , 在从代理器没有与主代理器通讯时不允许客户端访问

    shutdownOnslaveFailure , 默认值为false, 如果为true,如果slave断开的时候,master将会关闭

    10.2.1.2.什么时候使用master/slave

    可以人工干预,你可以用于已经运行中代理器中配置高可用性

    10.2.2. 分享数据库 主从


    10.2.2.1、什么时候使用数据库主从

    它的性能低于分享式主从,它不需要额外配置和slave数量的限制

    10.2.3.分享式文件系统主从


    SAN(Storage area network): 例如 Network File System (NFS)  、Global File System (GFS)

    10.2.3.1、什么时候使用分享文件系统主从

    它与AMQMessageStore 或KahaDB整合使用,它的唯一缺陷,只支持分布锁环境文件系统

    10.3 网络代理器

    通过网络进行传输数据

    10.3.1、 存储和传输


    以上是单向通道,如果是双向通道







    文件配置为:

    <networkConnectors>
    <networkConnector uri="static://(tcp://backoffice:61617)"
    name="bridge"
    duplex="true"
    conduitSubscriptions="true"
    decreaseNetworkConsumerPriority="false">
    </networkConnector>
    </networkConnectors>

    配置的顺序要求

    <?xml version="1.0" encoding="utf-8"?>
    <beans xmlns="http://activemq.org/config/1.0">
        <broker brokerName="receiver" persistent="true" useJmx="true">
            <networkConnectors>
                <networkConnector uri="static:(tcp://backoffice:61617)" />
            </networkConnectors>
            <persistenceAdapter>
                <kahaDB />
                <kahaDB></kahaDB>
            </persistenceAdapter>
            <transportConnectors>
                <transportConnector uri="tcp://localhost:62002" />
            </transportConnectors>
        </broker>
    </beans>

    高性能网络配置

    引用《ActiveMQ in Action》


    10.3.2. 网络发现

    网络发现有两种:

    1、动态(dynamic):自动搜索发现新代理器(使用multicast)

    2、静态(Static):列举所有网络(static)

    <networkConnectors>
    <networkConnector uri="multicast://default"/>
    </networkConnectors>

    <networkConnectors>
    <networkConnector uri="static:(tcp://remote-master:61617,tcp://remote-slave:61617)"/>
    </networkConnectors>
    static 的配置参数有:

    initialReconnectDelay(默认值为1000)单位毫秒初始化重连延迟,只有useExponentialBackOff不可用

    maxReconnectDelay (默认值为30000)最大延迟,只有useExponentialBackOff不可用
    useExponentialBackOff: (默认值为true)重连时间等待时间会更长

    backOffMultiplier:(默认值为2) 这是增加useExponentialBackOff重连等待时间的基数

    例如:

    <networkConnectors>
    <networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false"/>
    </networkConnectors>

    10.3.3,网络配置

    10.3.3.1. 网络属性:dynamicOnly

    默认值为false,如果为true,活动时候才会传递消息给远程代理器

    10.3.3.2、网络属性:prefetchSize

    默认值为1000,读取远程代理器打包消息大小

    10.3.3.3网络属性:conduitSubscriptions

    避免多个代理器发送消息重复

    10.3.3.4.网络属性:excludedDestinations

    去除目的地

    它优先级高于staticallyIncludedDestinations和dynamicallyIncludedDestinations.(也就是这两个属性设置无效)

    例子:

    <networkConnectors>
        <networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false" />
        <excludedDestinations>
            <queue physicalName="audit.queue-1" />
            <queue physicalName="audit.queue-2" />
            <queue physicalName="local.>" />
            <topic physicalName="local.>" />
        </excludedDestinations>
    </networkConnectors>

    10.3.3.5、网络属性:dynamicallyIncludedDestinations

    包含目的地(白名单)

    10.3.3.6、网络属性:staticallyIncludedDestinations

    包含目的地(白名单)

    <networkConnectors>
        <networkConnector uri="static:(tcp://remote:61617)?useExponentialBackOff=false" />
        <staticallyIncludedDestinations>
            <queue physicalName="management.queue-1" />
            <queue physicalName="management.queue-2" />
            <queue physicalName="global.>" />
            <topic physicalName="global.>" />
        </staticallyIncludedDestinations>
    </networkConnectors>

    10.3.3.7、网络属性:decreaseNetworkConsumerPriority

    默认值为false,如果设置true,表示本地优先级高于远程

    10.3.3.8、网络属性:networkTTL

    默认值为1,心跳

    10.3.3.9,网络属性:name

    默认值是bridge,一般忽略这个参数,保证唯一

    <networkConnectors>
        <networkConnector uri="static://(tcp://remotehost:61617)" name="queues_only" duplex="true">
            <excludedDestinations>
                <topic physicalName=">" />
            </excludedDestinations>
        </networkConnector>
        <networkConnector uri="static://(tcp://remotehost:61617)" name="topics_only" duplex="true">
            <excludedDestinations>
                <queue physicalName=">" />
            </excludedDestinations>
        </networkConnector>
    </networkConnectors>

    10.4、应用分割

    实现高并发,负载均衡

    10.4.1、垂直分割

    设置传输为nio

    <broker>
    <transportConnectors>
    <transportConnector name="nio" uri="nio://localhost:61616"/>
    </<transportConnectors>
    </broker>
    设置线程池

    ACTIVEMQ_OPTS="-Dorg.apache.activemq.UseDedicatedTaskRunner=false"

    同时设置虚拟机内存大小

    ACTIVEMQ_OPTS="-Xmx1024M -Dorg.apache.activemq.UseDedicatedTaskRunner=false"

    设置代理器的内存大小:对于100多个连接最小内存大小512MB

    <systemUsage>
        <systemUsage>
            <memoryUsage>
                <memoryUsage limit="512 mb" />
            </memoryUsage>
            <storeUsage>
                <storeUsage limit="10 gb" name="foo" />
            </storeUsage>
            <tempUsage>
                <tempUsage limit="1 gb" />
            </tempUsage>
        </systemUsage>
    </systemUsage>
    
    

    为了减少CPU加载连接,需要将tightEncodingEnabled设置为false

    String uri = "failover://(tcp://localhost:61616?wireFormat.tightEncodingEnabled=false)";
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(url);
    设置队列最优化

    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue=">" optimizedDispatch="true" />
            </policyEntries>
        </policyMap>
    </destinationPolicy>

    “>”表示所有队列(Queues)

    整体配置文件如下

    <?xml version="1.0"?>
    <broker xmlns="http://activemq.org/config/1.0" brokerName="amq-broker" dataDirectory="${activemq.base}/data">
        <persistenceAdapter>
            <kahaDB directory="${activemq.base}/data" journalMaxFileLength="32mb" />
        </persistenceAdapter>
        <destinationPolicy>
            <policyMap>
                <policyEntries>
                    <policyEntry queue=">" optimizedDispatch="true" />
                </policyEntries>
            </policyMap>
        </destinationPolicy>
        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="512 mb" />
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="10 gb" name="foo" />
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="1 gb" />
                </tempUsage>
            </systemUsage>
        </systemUsage>
        <!-- The transport connectors ActiveMQ will listen to -->
        <transportConnectors>
            <transportConnector name="openwire" uri="nio://localhost:61616" />
        </transportConnectors>
    </broker>

    10.4.2.水平分割

    随机连接

    failover://(tcp://broker1:61616,tcp://broker2:61616)?randomize=true
    

    为了代理器之间消息不孤立,如下设置

    <networkConnector uri="static://(tcp://remotehost:61617)"
    name="bridge"
    dynamicOnly="true"
    prefetchSize="1"
    </networkConnector>

    10.4.3、交通分配(traffic partitioning )

    traffic partitioning 是垂直和水平分割的混合体,

    引用《ActiveMQ in Action》
    展开全文
  • 在上一篇介绍了如何部置vMA,在本篇我们利用vMA使UPS在市电断电后,自动关闭ESXi主机及里面的所有虚拟机。 需求 现有一服务器,安装 ESXi55,里面有若干虚拟机,一台山特C3K UPS,市电断电后,要求UPS通知ESXi关机...
    在上一篇介绍了如何部置vMA,在本篇我们利用vMA使UPS在市电断电后,自动关闭ESXi主机及里面的所有虚拟机。
    

    需求

      现有一服务器,安装 ESXi55,里面有若干虚拟机,一台山特C3K UPS,市电断电后,要求UPS通知ESXi关机,
    

    原理

      断电后,UPS透过RS-232通知安裝在Windows中的UPS代理程序,代理程序通知vMA,vMA对Esxi Server執行關機腳本,Esxi Server使用shutdown guest功能关闭所有VM后,再关闭ESXi实体主机。
    

    软件安装

       我们使用Winpower作为代理程序,下载地址:[http://www.ups-software-download.com/](http://www.ups-software-download.com/)。最新版本是V4.4.03,支持ESXi5.5,在这里,需要下载二个软件:
    

    1、Winpower_setup_LinuxAMD64.tar.gz

    2、Winpower_setup_Windows.zip

    其中第一个软件要安装在vMA虚拟机上,充当主控代理程序,第二个是Windows平台上的程序,用于设置UPS关机条件的各个参数。

    用putty登录进入,如图1。

    图1

    将ESXi主机加入到vMA,只有加加入了vMA,才可以由vMA管理,如图2

    在这里插入图片描述

    图2

    初始化ESXi主机,使用命令:vifptarget -s server,如图3.

    图3

    通过winscp将Winpower_setup_LinuxAMD64.tar.gz上传到vMA的/home/vi-admin/下,解压缩tar -v

    zxvf Winpower_setup_LinuxAMD64.tar.gz,解压到当前Winpower_setup_LinuxAMD64文件夹下,进入到其子文件夹LinuxAMD64,运行./setup_console.bin,如图4。

    wKioL1Q3TPTwHnlXAAHCiny2VfE769.jpg在这里插入图片描述

    图4

    出现安装界面,提示按回车键继续,若想退出安装,可以输入quit,如图5

    在这里插入图片描述

    图5

    回车键后,提示安装路径,默认是/opt/MonitorSoftware,改变其路径,这里设为/home/vi-admin/winpower,输入y确认,如图6

    在这里插入图片描述

    图6

    安装完成后,进入到/home/vi-admin/Winpower文件夹下,输入./agent start启动监控程序, 如图7

    在这里插入图片描述

    图7

    验证是否正常工作,输入./agent status, 返回Agent is runing…,说明程序运行中,下一步是安装Windows平台的程序,过程不提供图片,重点是设置参数,首先以管理员身份登录,否则不能修改任何参数,管理员初始密码是Administrator,注意,第一个字母是大写A,如图9

    图9

    进入主界面,显示UPS状态,如图10

    在这里插入图片描述

    图10

    打开Device菜单下的Shutdown Parameter子菜单,如图11

    在这里插入图片描述

    图11

    在Shutdown Options下是设置关机条件参数,我们作如下设置:

    1、【电源低电位是立即关机】:Begin Shutdown Immediately when Battery is Low。

    2、【主机关机】:System->Shut down。

    3、【UPS关机】:Shut down UPS。

    4、【系统关机后,UPS关机延时时间】 System shutdown need time 设为5分钟。

    Shutdown Remote Agents 选项设置远程代理主机关机条件,通过Add按钮可以增加多台远程代理主机,

    输入远程代理主机的IP地址就可以了,如图12

    在这里插入图片描述

    图12

    测试

    我们拨掉UPS的电源线,验证UPS是否会按设定的条件关机。
    

    转载至:https://blog.51cto.com/261402/1561917

    展开全文
  • 如果业务层的方法中没有使用事务,那么数据库连接最后并没有关闭。 添加事务的话,需要在业务层的方法中, 嵌入一段重复编写的代码;让业务层只负责专心处理业务相关的事情,不负责处理事务。 那么以上问题如何解决...

    目前还存在问题:

    1. 如果业务层的方法中没有使用事务,那么数据库连接最后并没有关闭。
    2. 添加事务的话,需要在业务层的方法中, 嵌入一段重复编写的代码;让业务层只负责专心处理业务相关的事情,不负责处理事务。

    那么以上问题如何解决?

     

    1. 注解
      1. 概述

    注释://   /**/  /** */  <!--  --> 给人(软件开发工程师)看

    注解: 给程序(编译器、类加载器、JVM)看的

    注解的作用:在一些使用场景中,实现轻量级的配置。

       (副作用耦合度增加了)

      1. 常见的注解
        1. @Override

    表示被它修饰的方法,是重写父类的方法。给编译器看,在编译时验证该方法是否符合重写的规则,符合编译通过,反之编译不通过。

    @Override

    public String toString() {

    return super.toString();

    }

        1. SuppressWarnings抑制编译器出现警告

    @SuppressWarnings("unused")

    public static void main(String[] args) {

    int x = 5;

    }

    @SuppressWarnings({ "unused", "deprecation" })

    public static void main(String[] args) {

    int x = 5;

    Date date = new Date();

    System.out.println(date.toLocaleString());

    }

     

        1. @Deprecated

    表示被它修饰的方法已经过时,不建议使用。

    @Deprecated

    public static void sleep(){

    }

     

      1. 注解开发的流程

    定义注解->反射注解->使用注解

    @注解名称【 (属性名1=值1[,属性名2=值2,…,属性名N=值N]) 】

    使用时可以有属性赋值,也可以没有属性赋值。

      1. 自定义注解

    public @interface Anno1 {

    }

    格式:public @interface  注解名称{}

    底层帮我们自动实现了java.lang.annotation.Annotation,但是我们在定义注解时不能这样做:public class Anno3 implements Annotation{},在使用时不识别。

      1. 源生注解:用于修饰注解的注解。

    @Target(ElementType.XXX):表示被修饰的注解能够在什么元素(类和接口,方法、属性、成员变量、构造方法..)上使用

    @Retention(RetentionPolicy.SOURCE):表示注解的保留域。

    @Documented:表示生成的javadoc中是否保留注解的信息。

      1. 注解的属性
    1. 和接口中的方法定义类似:public 类型  属性名称() [default  …];可以default指定默认值
    2. 如果属性定义时没有指定默认值,那么对应注解使用的时候必须为该属性赋值;
    3. 如果在某些场景,使用注解时必须为其中某一个属性赋值,赋值后该注解才可以被使用,那么不要使用default指定默认值。
    4. 特殊属性value,单独为该属性赋值时,“value=”可以省略;除了为value赋值以外,同时还需要为其他属性赋值,这时“value=”不可以省略。
    5. 属性的类型通常是八种基本数据类型、Class类、枚举、String等类型;以及以上类型的一维数组。
    6. 为数组类型的属性赋值时,如果值只有一个,那么赋值时”{}”可以省略。

     

      1. 源生注解详解
        1. @Target(ElementType.XXX):

    表示被修饰的注解能够在什么元素(类和接口,方法、属性、成员变量、构造方法..)上使用

    ANNOTATION_TYPE 注解类型声明

    CONSTRUCTOR构造方法声明

    FIELD字段声明(包括枚举常量)

    LOCAL_VARIABLE局部变量声明

    METHOD方法声明

    PACKAGE包声明

    PARAMETER参数声明

    TYPE类、接口(包括注解类型)或枚举声明

     

    源代码:

    @Documented

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.ANNOTATION_TYPE)

    public @interface Target {

        ElementType[] value();

    }

    在定义注解时,如果没有使用Target指定,默认都可以使用。如果使用了Target指定使用的位置,那么该注解只能在所指定的位置使用。

    比如:@Target(ElementType.METHOD)修饰的注解只能被用在方法上。

     

        1. @Retention

    @Retention(RetentionPolicy.SOURCE):表示注解的保留域。

           编译器      类加载器      JVM

    .java   -> .class   ->加载至内存->运行

    CLASS  编译器将把注释记录在类文件中,但在运行时 JVM 不需要保留注释。

    RUNTIME 编译器将把注释记录在类文件中,在运行时 JVM 将保留注释,因此可以反射性地读取。

    SOURCE编译器要丢弃的注解。

    SOURCE 给编译器看的,编译器看完后不再保留。生成的.class字节码文件中不再保留该类型的注解。

    CLASS 给类加载器看的在类加载时根据相关的注解做一些引导操作编译时保留(.class字节码文件中保留),类加载时使用后丢弃

    RUNTIME 给JVM看的.编译器编译后保留,类加载器加载后保留,JVM运行时保留。

     

        1. @Documented

    表示生成的javadoc中是否保留注解的信息。

    @Documented

    public @interface Anno1 {}

     

    @Anno1

    public class Student {

    @Anno1(name="zs",value="val",like={"fb","bb"})

    private String name;

    @Anno1

    public void setName(@Anno1 String name){

    this.name =name;

    }

    }

     

     

     

      1. 反射注解

    前提条件:注解要想被反射的到,注解的保留域必须指定为RUNTIME,否则反射不到。

    jdk中提供的注解反射接口:AnnotatedElement,提供了以下方法:

    <T extends Annotation> T

     getAnnotation(Class<T> annotationClass)

         如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。

     Annotation[] getAnnotations()  返回此元素上存在的所有注释。

     Annotation[] getDeclaredAnnotations()

              返回直接存在于此元素(类或接口、方法、…)上的所有注解。

     boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。

    java.lang.reflect

    接口 AnnotatedElement

    所有已知实现类: 

    AccessibleObject, Class, Constructor, Field, Method, Package

     

    案例演示:

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.TYPE)

    public @interface PoliceLevel {

    public String level() default "";

    }

    class Plice{

    public void getMoney(){

    System.out.println("敬个礼,您违章了,罚款200..");

    }

    }

    @PoliceLevel(level="大队长")

    public class Police {

    public void getMoney(){

    System.out.println("敬个礼,您违章了,罚款200..");

    }

    public static void main(String[] args) {

    //Police p = new Police();

    Plice p = new Plice();

    p.getMoney();

    //你该如何操作

    //判断p对象是真的交警还是假的

    if(p.getClass().isAnnotationPresent(PoliceLevel.class)){

    //真的,有证件(有指定的注解)

    //获取注解对象

    PoliceLevel pl = p.getClass().getAnnotation(PoliceLevel.class);

    //获取注解中的属性

    String level = pl.level();

    if("协警".equals(level)){

    System.out.println("偷么给50,不要发票..");

    }else if("交警".equals(level)){

    System.out.println("给200,给个发票...");

    }else if("大队长".equals(level)){

    System.out.println("给2000,给开一个年票..");

    }

    }else{//假的

    System.out.println("打一顿,送到警察局....");

    }

     

    }

    }

     

      1. 自定义事务的注解

    @Target(ElementType.METHOD)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Tran {

    }

     

    在哪里反射事务的注解呢?

     

    1. 代理模式
      1. 静态代理

     

    !!!静态代理:为某个对象(杀手对象)提供一个代理对象,以控制对这个对象(杀手)的访问。 代理类(ProxyKiller)和委托类(Killer)有共同的父类或接口(Kill),这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。 由软件工程师创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

     

    public interface Kill {

    public void kill(String name);

    }

    public class Killer implements Kill {

    public void kill(String name){

    System.out.println(name+"被杀死了...");

    }

    }

    public class ProxyKill implements Kill{

    private Kill kill;

    public ProxyKill(Kill kill) {

    this.kill = kill;

    }

    public void kill(String name) {

    System.out.println("收50%定金");

    kill.kill(name);

    System.out.println("收50%尾款");

    }

    }

    public class BasicFactory {

    public static Kill getInstance(){

    return new ProxyKill(new Killer());

    }

    public static void main(String[] args) {

    //代理类的对象

    Kill kill = getInstance();

    kill.kill("上课睡觉者");

    }

    }

     

        静态代理类优缺点

    优点:委托类(业务类)只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

    缺点:每一个委托类需要编写一个代理类,委托类和接口每添加或删除一些方法的时候,代理类需要同步调整跟着修改。如果项目比较庞大的话,需要编写大量的代理类。

    委托类 1---1 代理类:静态代理

    委托类 n---1类:动态代理。

    和装饰者设计模式的核心区别是:装饰者设计模式是对被装饰者对象执行结果(map)的处理;而静态代理是在调用委托类对象方法执行前后做一些其他操作(事务管理、日志记录、权限的判断等)。

     

      1. 动态代理

    使用动态代理升级杀手案例:

    public class BasicFactory {

    public static Kill getInstance(){

    //声明代理对象

    Kill proxy = null;

    //proxy = new ProxyKill(new Killer());

    //创建的委托类对象

    final Killer k = new Killer();

    //创建动态代理对象

    proxy = (Kill)Proxy.newProxyInstance(

    //获取类加载器

    k.getClass().getClassLoader(),

    //获取委托类实现所有接口(通常是一个接口)

    k.getClass().getInterfaces(),

    new InvocationHandler(){

    /**proxy:代理对象

     * method:执行的方法对应Method类的对象

     * args:方法的所有参数

     */

    public Object invoke(Object proxy, Method method,

    Object[] args) throws Throwable {

    Object result = null;

    try{

    System.out.println("开启事务");

    //执行委托对象的方法

    result = method.invoke(k, args);

    System.out.println("提交事务");

    }catch (Exception e) {

    System.out.println("回滚事务");

    }finally{

    System.out.println("释放数据库连接");

    }

    return result;

    }

    });

    return proxy;

    }

    public static void main(String[] args) {

    //代理类的对象

    Kill kill = getInstance();

    kill.kill("上课睡觉者");

    }

    }

     

     

    1. 使用注解和动态代理升级事务管理

    @Target(ElementType.METHOD)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Tran {

    }

     

    由于只有业务层对象才需要创建代理对象,所以我们需要区分t是service层对象还是dao层对象。

    Class类中提供一个方法:

     boolean

    isAssignableFrom(Class<?> cls) 

    Class clzA(A.class)    Class clzB(B.class)

    clzA.isAssignableFrom(clzB);

    返回true的几种情况,A类是B类超类或超接口或同一个类对象Class对象,如下:

    情况一:

    clzA = Student.class;

    Student stu = new Student();

    clzB = stu.getClass();

    情况二:

    public class Student extends Person{}

    clzA = Person.class;

    clzB = Student.class

    情况三:

    public class Student implements Play{}

    clzA = Play.class;

    clzB = Student.class;

    情况四:

    public interface Live{}

    public interface Play extends Live{}

    public Student implements Play{}

    clzA = Live.class;

    clzB = Student.class;

    类推:

    public interface Service{}

    public interface **Service extends Service{}

    public class **ServiceImpl implments **Service{}

    clzA = Service.class

    clzB = OrderServiceImpl.class

    接下来,执行以下开发步骤:

    1. 创建两个标识接口Service和Dao
    2. 让所有业务层的接口继承Service接口
    3. 让所有Dao层的接口都继承Dao接口
    4. 修改BasicFactory类的getInstance()方法

    public <T> T getInstance(Class<T> clazz) {

    try {

    // 1.读取配置文件中配置的信息(UserDao的实现类)

    // cn.tedu.dao.UserDaoImpl

    String className = prop.getProperty(clazz.getSimpleName());

    // 2.根据类的全限定名称获得该类的Class对象

    Class clz = Class.forName(className);

    // 3.利用反射技术根据该类Class对象创建该类的实例

    //T t = (T)clz.newInstance();

    //区分t是Service层对象还是Dao层对象

    if(Service.class.isAssignableFrom(clz)){

    final T t = (T)clz.newInstance();

    //service层

    //创建代理对象

    @SuppressWarnings("unchecked")

    T proxy = (T)Proxy.newProxyInstance(clz.getClassLoader(),

    clz.getInterfaces(),

    new InvocationHandler() {

    public Object invoke(Object proxy, Method method, Object[] args)

    throws Throwable {

    Object result = null;

    //判断method上是否使用事务的注解@Tran

    if(method.isAnnotationPresent(Tran.class)){

    //使用了事务

    try{//开启事务

    TranManager.startTran();

    //执行委托类对象(真实对象)的方法

    result = method.invoke(t, args);

    //提交事务

    TranManager.commitTran();

    }catch (Exception e) {

    e.printStackTrace();

    //回滚事务

    TranManager.rollbackTran();

    }finally{//释放事务中使用数据库连接

    TranManager.releseTran();

    }

    }else{//未使用事务

    try{

    result = method.invoke(t, args);

    }catch (Exception e) {

    e.printStackTrace();

    }finally{

    TranManager.releseTran();

    }

    }

    return result;

    }

    });

    return proxy;

    }else if(Dao.class.isAssignableFrom(clz)){

    //dao层

    return (T)clz.newInstance();

    }else{//既不是service也不是dao层

    System.out.println("别捣乱....");

    return null;

    }

    } catch (Exception e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    1. 修改OrderService接口,在addOrder()上使用事务的注解
    2. 修改OrderServiceImpl的addOrder(…),删除事务管理的相关代码。
    3. 测试,事务的处理生效了,但是流程跳转出现了错误,本来库存不足时,应该跳转到cart.jsp,结果跳转到OrderListServlet->order_list.jsp

    分析:自定义异常在动态代理调用的过程中被封装成了InvocationTargetException类的target属性了,所以修改代码:

    catch (InvocationTargetException e) {

    e.printStackTrace();

    //回滚事务

    TranManager.rollbackTran();

    throw e.getTargetException();

    }

    注意:修改了两处.

    展开全文
  • 当你用浏览器搜索了某样物品,再浏览其他网站时,就会收到软件推送的相应广告,不断提示你商品有折扣了。这样的情况每天都在互联网上发生,仿佛生活被窥视了一样,让人难以忍受。 这其实是IP活动被记录了,你的浏览...
  • 软件界面设计工具_3款合集

    千次下载 热门讨论 2010-06-29 03:52:47
    那么腾讯CDC是如何设计软件原型的呢?这里向大家介绍我们正在研发的原型设计利器UIDesigner。  首先,先让我们来体验一下UIDesigner制作出来的原型效果。这个原型是一个设置窗体,主要由按钮、复选框、分组框和...
  • Java7基础增强、菱形语法、自动关闭资源的try语句,NIO.2,AIO、泛型、注解、类加载与反射、动态代理。 深入JavaScript编程、DHTML、DOM:深入讲解JavaScript的动态特征,包括如何创建JavaScript类、如何创建Jav
  • 1.我编写了一个SOCKET程序,功能类似代理软件,主要是将指定服务器的页面转发到本地。 2.在浏览器访问本地地址时,就会打开指定服务器的页面 3.现在的问题是可以获取到文本数据,如: ``` ; charset=utf-8" /...
  • Charles的使用

    2019-11-19 23:10:30
    安装 来到Charles的下载页面,下载Mac版本,然后按照正常软件的安装方法安装...如果想取消也很简单,只需要取消菜单:Proxy-macOX Proxy前面的对勾就关闭了电脑代理。如下图: 如何抓iPhone模拟器请求包 对应iPhon...
  • v2ray: 著名代理软件,Shadowsocks 代替者,1.17后集成了 kcp协议,使用UDP传输,无数据包特征。 HP-Socket: 高性能网络通信框架 HP-Socket。 frp: 高性能内网穿透的反向代理软件,可将将内网服务暴露映射到外网...
  • 那么如何在app上面查看数据交互呢,也是测试工程师常常使用的软件工具,fiddler 首先在百度上面下载安装,然后配置属性,关闭重起。 设置手机为代理,端口,前提是在同一局域网中,且访问代理的IP:端口,安装...
  • 包括但不限于如何解决错误,如何在不同的操作系统安装软件、依赖,设置代理,成功的使用软件的经验。对于正确的issue,我会收集到项目代码中。 ShadowsocksR跨平台客户端 这是一个跨平台(支持Windows MacOS Linux...
  • 弱网测试

    2018-07-24 17:16:00
    什么样的网络属于弱网 低于2G速率的时候都属于...2、具体弱网场景测试,常见场景包括:地铁/巴士、电梯、楼梯间、停车场3、使用虚拟机模拟网络速度,如用树莓派搭建的弱网测试仪4、使用软件进行网络代理,模拟不同...
  • 保存关闭配置文件之后,重启您的软件。 1.1.0.7增加了日志记录功能 如何启用日志记录功能: 1、在DLL同一个目录里面创建一个名称为UUExtConfig.ini的文件 2、在文件里面输入如下内容: [Debug] LogLevel = ...
  • realplayer

    2010-08-18 10:57:02
    您同意由 DRM 启用和(或)执行的通信,包括未经进一步通知的 DRM 自动更新,而无论第 6 章节对 AutoUpdate 如何定义。 您同意保护和保障 RN 免于任何与使用第三方 DRM 有关的索赔。 b) 内容供应商使用本“软件”所...
  • 全书共分为15章,主要包括:如何成为一名黑客,黑客需要掌握的基本知识,网络安全技术基础,加密解密技术基础,软件破解技术基础,防不胜防的病毒攻击,揭秘木马技术,恶意网页代码技术,漏洞攻击技术,跳板、后门与...
  • iOS系统的代理软件</li></ul> <h2>3. 详细叙述 (1) 具体问题 <p>A:actions云函数自动部署 的workflow 不显示在actions中请问如何配置,看了触发机制是 on: workflow_dispatch:,但就是不触发 ...
  • iOS系统的代理软件</li></ul> <h2>3. 详细叙述 (1) 具体问题 <p>A:serverless.yml 怎么使用,deploy_tencent_scf.yml 已经有了但actions中不显示, 已经import 了,环境变量也社会好了 ...
  • asp.net知识库

    2015-06-18 08:45:45
    .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的...
  • VB网络编程实例

    千次下载 热门讨论 2007-05-29 15:46:04
    ◆ 50.htm 强制一个本地或远程NT系统关闭 ◆ 51.htm 取得网卡序列号 ◆ 52.htm 如何从 Internet 上取回某一个网页的內容? ◆ 53.htm 如何检测是否已连接到Internet? ◆ 54.htm 如何利用...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    Android Battery Dog 是 Android 平台上用来监控电池电量的服务软件,它生成电池记录文件:/sdcard/BatteryDog/battery.csv ,该文件包含时间、电量信息、温度和电压以及一些简单的图形。 项目就四个源码文件: ...
  • 禁止IE的代理服务器.reg 禁止IE浏览器的脚本调试程序.reg 禁止IE浏览器的升级检查.reg 禁止IE显示图片.reg 禁止IE自动安装组件.reg 禁止Outlook Express用户打开可能包含病毒的附件.reg 禁止打开或保存带病毒...
  • 使用代理服务器 142 配置用户身份验证 142 为工作区控制配置身份验证 143 配置 Kerberos 登录 143 系统要求 143 启用 Citrix XML Service DNS 地址解析 144 禁用服务器的 Kerberos 登录 144 1.8.6.2.3. Windows ...
  • 使用前请确保手机HTTP代理关闭 Demo APK下载 点击查看操作手册 功能简介 1. HTTP/HTTPS抓包 当用户通过AndroidHttpCapture访问页面的时候,所有的http请求都会被记录下来,然后这些请求包可以预览、分享、...
  • 5.4.3 关闭一个应用程序会话 5.4.4 取消未完成的服务请求 5.5 在地址空间中查找信息 5.5.1 使用服务发现地址空间 5.5.2 在地址空间中查找信息的用例 5.6 读写数据及元数据 5.6.1 读取数据 5.6.2 写入数据 5.7 订阅...
  •  Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • windowsnt 技术内幕

    2014-04-09 20:47:17
    调协系统管理告警(Administrative Alert) 向用户发送系统管理消息 远程关闭一台Windows NT计算机 使用Windows NT系统属性对话框 Windows NT诊断程序(Diagnostic)简介 使用Windows NT诊断程序打印一份报告 在Windows ...
  • Qt Creator 关闭.cpp文件右侧的黄色警告 小技巧:Design设计师里,无法拖拽action到toolbar里 小技巧:设置QToolBox的每一页page的使用单独的布局(QTabWidget同理) 小技巧:QtCreator用快捷键秒实现,声明在...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

如何关闭代理软件