我尝试将Apache CXF配置为使用有限数量的线程,但CXF似乎是基于CPU数量的某种自动调整大小。 (我认为这是因为在一台机器上运行的相同配置文件在具有更多CPU的另一台机器上失败)。
xml看起来像这样:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/transports/http-jetty/configuration
http://cxf.apache.org/schemas/configuration/http-jetty.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<httpj:engine-factory bus="cxf">
<httpj:engine port="0">
<httpj:threadingParameters minThreads="2" maxThreads="4" />
</httpj:engine>
</httpj:engine-factory>
</beans>
但是,当我在具有更多CPU的另一台机器上运行它时,我收到此错误:
Caused by: org.apache.cxf.interceptor.Fault: Could not start Jetty server on port 10,100: Not enough threads configured for port 10,100. Need at least 7 (6 for Jetty selectors and set managers) but only 4 configured.
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:386)
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:178)
at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:48)
at org.apache.cxf.binding.AbstractBaseBindingFactory.addListener(AbstractBaseBindingFactory.java:97)
at org.apache.cxf.binding.soap.SoapBindingFactory.addListener(SoapBindingFactory.java:901)
at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:131)
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:349)
... 7 more
Caused by: org.apache.cxf.interceptor.Fault: Not enough threads configured for port 10,100. Need at least 7 (6 for Jetty selectors and set managers) but only 4 configured.
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.setupThreadPool(JettyHTTPServerEngine.java:469)
at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine.addServant(JettyHTTPServerEngine.java:374)
... 13 more
我错过了什么?
答案 0 :(得分:0)
对于Web服务器,低线程数最大值非常糟糕。
现实线程计数最小值是根据以下系统和配置信息计算的。
与
等系统行为信息一起4处的线程数最大值 WAY 太低,您基本上将在单核心CPU上运行,具有1个网络接口,1个选择器,并且一次只处理1个请求序列。 (不切实际的情况)。
即便是第一个Android设备(G1)的系统规格最小线程数为19,只是为了启动,更不用说处理任何请求了。
一些统计数据,一个处理2个Web浏览器的Raspberry PI,提供静态页面(生成的html和系统监控进程中的图像),在线程数为45时运行效率最高。
一个小型生产系统预计会有几十个同时用户提供大量小额请求,这个系统是100个。
处理数千个快速API调用的大型生产系统大约有400个。
处理数千个较大尺寸响应(图像等)的大型生产系统的线程数约为600.
重点是,永远不要从低处开始,你只是把火箭筒带到你的脚上(你已经过去了,只是把你的脚踢掉了)。从默认值开始,然后根据您的系统和流量进行监控和调整。
答案 1 :(得分:0)
Jetty使用的线程是从系统计算的,其CPU编号是此计算中使用的参数之一。 因此,基于系统资源,jetty发现它需要7个线程。另一方面,在配置中我们发现线程参数&#34; max Threads&#34; .. 所以只需增加它:
<httpj:threadingParameters minThreads="1" maxThreads="7"/>