web.xml中的filterMina的底层依赖的主要是Ja(37)

电脑杂谈  发布时间:2019-03-27 09:08:04  来源:网络整理

你尝试改变ClientHandler中的Synbol中的红色代码中的正负号,会看到服务端使用了两个不同的对其进行处理。

7.线程模型配置:

Mina 中的很多执行环节都使用了多线程机制,用于提高性能。Mina 中默认在三个地方使用了线程:

(1.) IoAcceptor:

来电:在启动程序的时候会通过sipdroidengine会根据配置,创建一个provider,这里用到udp传输,创建一个udpprovider,udpprover是一个thread,创建的时候就会启动线程,开始收到的信息,当受到信息后,通过onserviceterminated方法,把对象传出到udptransport,由udptransport处理,再通过ontransportterminated方法传出到sipprovider对象,最后将在sipprovider的processreceivedmessage方法中处理收到的消息,最后从listeners(map)中取出相应的listener,最后通过相应的listener中的onreceivemessage()来处理具体sip请求。2、此工具,相当于一个代理商,启动后它将本地的某个端口,然后再将请求转发给指定的目标ip和端口。该版本支持tcp的connect(作为客户端连接)和listen(打开一个端口),不支持udp协议。

(2.) IoConnector:

这个地方用于与服务端建立连接,每连接一个服务端(每调用一次connect()方法),就启用一个线程,我们不能改变。同样的,这个线程是否有连接被建立,一旦发现,则创建一个IoSession 对象。因为这个动作很快,所以有一个线程就够了。

(3.) IoProcessor:

这个地方用于执行真正的IO 操作,默认启用的线程个数是CPU 的核数+1,譬如:单CPU 双核的电脑,默认的IoProcessor 线程会创建3 个。这也就是说一个IoAcceptor 或者IoConnector 默认会关联一个IoProcessor 池,这个池中有3 个IoProcessor。因为IO 操作耗费资源,所以这里使用IoProcessor 池来完成数据的读写操作,有助于提高性能。这也就是前面说的IoAccetor、IoConnector 使用一个Selector,而IoProcessor 使用自己单独的Selector 的原因。那么为什么IoProcessor 池中的IoProcessor 数量只比CPU 的核数大1 呢?因为IO 读写操作是耗费CPU 的操作,而每一核CPU 同时只能运行一个线程,因此IoProcessor 池中的IoProcessor 的数量并不是越多越好。

这个IoProcessor 的数量可以调整,如下所示:

IoAcceptor acceptor=new NioSocketAcceptor(5);

IoConnector connector=new NioSocketConnector(5);

这样就会将IoProcessor 池中的数量变为5 个,也就是说可以同时处理5 个读写操作。还记得前面说过Mina 的要使用IoSession 保存状态变量,而不是Decoder 本身,这是因为Mina 不保证每次执行doDecode()方法的都是同一个IoProcessor 这句话吗?其实这个问题的根本原因是IoProcessor 是一个池,每次IoSession 进入空闲状态时(无读些数据发生),IoProcessor 都会被回收到池中,以便其他的IoSession 使用,所以当IoSession从空闲状态再次进入繁忙状态时,IoProcessor 会再次分配给其一个IoProcessor 实例,而此时已经不能保证还是上一次繁忙状态时的那个IoProcessor 了。你还会发现IoAcceptor 、IoConnector 还有一个构造方法, 你可以指定一个java.util.concurrent.Executor 类作为线程池对象,那么这个线程池对象是做什么用的呢?其实就是用于创建(1.)、(2.)中的用于是否有TCP 连接建立的那个线程,默认情况下,使用Executors.newCachedThreadPool()方法创建Executor 实例,也就是一个无界的线程池(具体内容请参看JAVA 的并发库)。大家不要试图改变这个Executor 的实例,也就是使用内置的即可,否则可能会造成一些莫名其妙的问题,譬如:性能在某个访问量级别时,突然下降。因为无界线程池是有多少个Socket 建立,就分配多少个线程,如果你改为Executors 的其他创建线程池的方法,创建了一个有界线程池,那么一些请求将无法得到及时响应,从而出现一些问题。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-93147-37.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 秦小舒
      秦小舒

      如果一个女人愿意同时嫁给一个以上男人

    • 杨孟
      杨孟

      看了你这么多文字

    热点图片
    拼命载入中...