GVKun编程网logo

Spring集成-队列/轮询似乎耗尽线程池而无需任何操作(spring 轮询)

23

在本文中,我们将给您介绍关于Spring集成-队列/轮询似乎耗尽线程池而无需任何操作的详细内容,并且为您解答spring轮询的相关问题,此外,我们还将为您提供关于19.用过spring的线程池还是ja

在本文中,我们将给您介绍关于Spring集成-队列/轮询似乎耗尽线程池而无需任何操作的详细内容,并且为您解答spring 轮询的相关问题,此外,我们还将为您提供关于19. 用过 spring 的线程池还是 java 的线程池?、android – 应用程序在后台执行CPU时无需任何操作、dwr+spring集成、DWR3与spring集成(不使用springMVC,但使用注解的实例)的知识。

本文目录一览:

Spring集成-队列/轮询似乎耗尽线程池而无需任何操作(spring 轮询)

Spring集成-队列/轮询似乎耗尽线程池而无需任何操作(spring 轮询)

我有一个Spring集成应用程序,附加到AMQP经纪人。

我想从amqp队列接收消息,并更新数据库记录。

为了提高性能,我有一组工作人员允许同时进行多个更新。

我有以下配置:

<int-amqp:inbound-channel-adapter queue-names="pricehub.fixtures.priceUpdates.queue"                             channel="pricehub.fixtures.priceUpdates.channel"                            message-converter="jsonMessageConverter"/><int:channel id="pricehub.fixtures.priceUpdates.channel">    <int:queue  /></int:channel><int:service-activator ref="updatePriceAction"      method="updatePrices"      input-channel="pricehub.instruments.priceUpdates.channel">    <int:poller fixed-delay="50" time-unit="MILLISECONDS" task-executor="taskExecutor" /></int:service-activator><task:executor id="taskExecutor" pool-size="5-50" keep-alive="120" queue-capacity="500"/>

如果我开始运行此程序,而AMQP通道上没有任何入站消息要处理,则我很快会看到thredpool耗尽,并开始拒绝。

这是日志:

[Thu Apr 2013 23:41:51.153] DEBUG [] (org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:185) - Retrieving delivery for Consumer: tag=[amq.ctag-w4qPp60jVEQOIEovR4cERv], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), acknowledgeMode=AUTO local queue size=0[Thu Apr 2013 23:41:51.160] DEBUG [] (org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:185) - Retrieving delivery for Consumer: tag=[amq.ctag-Q3Lq4R9g9E8WBNVLYzaFmq], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,2), acknowledgeMode=AUTO local queue size=0[Thu Apr 2013 23:41:51.166] DEBUG [] (org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:185) - Retrieving delivery for Consumer: tag=[amq.ctag-w8bg7ltEV2mot8QXDPCmfK], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,3), acknowledgeMode=AUTO local queue size=0[Thu Apr 2013 23:41:51.170] DEBUG [] (org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:185) - Retrieving delivery for Consumer: tag=[amq.ctag-A-0KdqhFjpc-Hvjmv7aZAc], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,4), acknowledgeMode=AUTO local queue size=0[Thu Apr 2013 23:41:51.180] DEBUG [] (org.springframework.integration.endpoint.PollingConsumer:71) - Received no Message during the poll, returning ''false''[Thu Apr 2013 23:41:51.180] DEBUG [] (org.springframework.integration.endpoint.PollingConsumer:71) - Received no Message during the poll, returning ''false''[Thu Apr 2013 23:41:51.199] DEBUG [] (org.springframework.integration.endpoint.PollingConsumer:71) - Received no Message during the poll, returning ''false''[Thu Apr 2013 23:41:51.200] DEBUG [] (org.springframework.integration.endpoint.PollingConsumer:71) - Received no Message during the poll, returning ''false''[Thu Apr 2013 23:41:51.220] DEBUG [] (org.springframework.integration.endpoint.PollingConsumer:71) - Received no Message during the poll, returning ''false''

很快,线程池开始拒绝执行:

[Thu Apr 2013 23:47:15.363] ERROR [] (org.springframework.integration.handler.LoggingHandler:126) - org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@6ff3cb0e] did not accept task: org.springframework.integration.util.ErrorHandlingTaskExecutor$1@78615c8b    at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:244)    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:49)    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:231)    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53)    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)    at java.util.concurrent.FutureTask.run(FutureTask.java:138)    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)    at java.lang.Thread.run(Thread.java:680)Caused by: java.util.concurrent.RejectedExecutionException    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1768)    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)    at org.springframework.sched

uling.concurrent.ThreadPoolTask​​Executor.execute(ThreadPoolTask​​Executor.java:241)…还有12个

我怀疑罪魁祸首就在这里:BlockingQueueConsumer-表示每次对消息的轮询都会阻塞线程,直到消息到达为止…导致线程池迅速耗尽。

什么是正确的配置方式?

答案1

小编典典

QueueChannel为什么不简单地增加concurrent-consumers入站适配器上的属性,而不是使用and轮询器?

    <xsd:attribute name="concurrent-consumers" type="xsd:string">        <xsd:annotation>            <xsd:documentation>Specify the number of concurrent consumers to create. Default is 1.Raising the number of concurrent consumers is recommended in order to scale the consumption of messages coming infrom a queue. However, note that any ordering guarantees are lost once multiple consumers are registered. Ingeneral, stick with 1 consumer for low-volume queues.            </xsd:documentation>        </xsd:annotation>    </xsd:attribute>

并且,删除<queue/><poller/>

另外,我总是建议在日志中包含线程名称(%t对于log4J);它使调试线程问题变得更加容易。

编辑:

使用轮询器时,线程不足的原因是轮询器的默认receive-timeout值为1秒。您每50ms调度一个线程,但是每个线程等待QueueChannel1秒。最终,您的任务队列已满。

为避免这种情况,如果希望继续使用此技术,只需将设置receive-timeout0on,<poller/>但是在适配器中使用更高的并发效率更高,因为没有轮询或切换到另一个线程。

19. 用过 spring 的线程池还是 java 的线程池?

19. 用过 spring 的线程池还是 java 的线程池?

  SpingFrameWork 的 ThreadPoolTaskExecutor 是辅助 JDK 的 ThreadPoolExecutor 的工具类,它将属性通过 JavaBeans 的命名规则提供出来,方便进行配置。接下来就讲讲 ThreadPoolTaskExecutor 的使用。

  最常用的方式就是作为 BEAN 注入到容器中

<bean id="threadPoolTaskExecutor"  
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
    <property name="corePoolSize" value="10" />  
    <property name="maxPoolSize" value="15" />  
    <property name="queueCapacity" value="1000" />  
</bean>

  ThreadPoolExecutor 执行器的处理流程: 
(1) 当线程池大小小于 corePoolSize 就新建线程,并处理请求. 
(2) 当线程池大小等于 corePoolSize,把请求放入 workQueue 中,池子里的空闲线程就去从 workQueue 中取任务并处理. 
(3) 当 workQueue 放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了 maximumPoolSize 就用 RejectedExecutionHandler 来做拒绝处理. 
(4) 另外,当线程池的线程数大于 corePoolSize 的时候,多余的线程会等待 keepAliveTime 长的时间,如果无请求可处理就自行销毁. 


了解清楚了 ThreadPoolExecutor 的执行流程,开头提到的 org.springframework.core.task.TaskRejectedException 异常也就好理解和解决了.ThreadPoolTaskExecutor 类中使用的 
就是 ThreadPoolExecutor.AbortPolicy () 策略,直接抛出异常. 

android – 应用程序在后台执行CPU时无需任何操作

android – 应用程序在后台执行CPU时无需任何操作

当 android应用程序(JNI Java)转到后台时,那么基于Elixir监视器,它需要40-80%的cpu而没有任何明显的原因. Logcat没有任何实际活动的迹象,DDMS方法分析器没有找到任何方法调用.

事实上,几分钟后OS(ISC)至少有时似乎会自动修复它:重启应用程序进程,然后就像预期的那样 – 占用0%的cpu和一些内存.当我再次启动应用程序,然后按home将其带到后台时,会发生相同的cpu占用.

什么想法可以调查?

解决方法

所以我的结论是:1.如果方法调用没有在Profiler中显示,那很可能意味着cpu在NDK方面被浪费了,2.应该在那里使用基于GDB的分析,可能类似于 that

dwr+spring集成

dwr+spring集成

dwr+spring集成

DWR(Direct Web Remoting)是一个用于改善web页面与java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。

以下模拟一个简单的dwr入门案例,重点理解dwr是如何跟java后台服务器打交道的

模拟效果如下

该功能说明了dwr是怎么跟后台服务器打交道的

模拟从服务器加载下拉列表数据

模拟保存功能

模拟查询功能

接下来为dwr+spring集成步骤:

1、新建一个web工程,导入dwr+spring所需jar,如下图

目录结构图

修改web.xml

   
   
<? xml version = " 1.0 encoding UTF-8 ?> < web - app version 2.4 xmlns http://java.sun.com/xml/ns/j2ee xmlns:xsi http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation http://java.sun.com/xml/ns/j2ee http: // java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- Spring上下文 --> context param > name contextConfigLocation </ value classpath:resource / app * .xml listener class org.springframework.web.context.ContextLoaderListener 配置DWR前端控制器 servlet dwrServlet org.directwebremoting.servlet.DwrServlet 指定配置文件 init config 如果有多个用 , 分开 WEB INF classes dwr.xml debug true mapping url pattern >/ dwr /* </url-pattern> </servlet-mapping> </web-app>

新建实体类Dept

   
   
package entity; public Dept { private Long id; String name; Dept() { } Dept(Long id,String name) { this .id id; .name name; } Long getId() { return id; } void setId(Long id) { String getName() { setName(String name) { name; } }

新建业务逻辑类

DeptServices类

   
   
services; import java.util.ArrayList; java.util.HashMap; java.util.List; java.util.Map; entity.Dept; @SuppressWarnings( unchecked ) DeptServices { List findDept() { throw new RuntimeException( 查找失败! ); } deleteDept(Long id) { System.out.println( Delete dept + id); } List getDeptsForPo() { List depts ArrayList(); depts.add( Dept( 1l 教质部 )); depts.add( 2l 学术部 3l 就业部 4l 咨询部 )); depts; } saveDept(List Dept depts) { System.out.println(dept.getId() + ":" + dept.getName()); System.out.println(depts); } List getDepts() { List depts ArrayList(); Map map HashMap(); map.put( id 01 ); map.put( ); depts.add(map); map 02 03 04 ); depts.add(map); try { Thread.sleep( 1000 catch (InterruptedException e) { e.printstacktrace(); } depts; } }

HelloServices类

   
   
/** * @author dlwu * */ HelloServices { String sayHello(String name){ System.out.println( Hello Now! ); Hello name ! ; } }

LoginService类

   
   
org.directwebremoting.WebContext; org.directwebremoting.WebContextFactory; LoginService { checkUserLogin(String userid,String pwd){ WebContext ctx WebContextFactory.get(); ctx.getSession().setAttribute( userid String getLoginUser(){ WebContext ctx WebContextFactory.get(); (String)ctx.getSession().getAttribute( ); } }

配置applicationContext.xml

   
   
配置系统基础环境 beans xmlns http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd bean id deptServices services.DeptServices ></ bean loginSrv services.LoginService beans >

配置dwr.xml,dwr.xml是前台js跟java服务器沟通的桥梁

   
   
<! DOCTYPE dwr PUBLIC -//GetAhead Limited//DTD Direct Web Remoting 2.0//EN http://getahead.org/dwr/dwr20.dtd 通用dwr配置 allow 建立JS对象,将目标对象的方法转换成JS对象的方法 create javascript helloSrv creator new param name class value services.HelloServices create 从Spring中获取Java对象 deptSrv spring beanName 禁止执行 exclude method deleteDept /> 指定针对于特定对象的转换器 convert match entity.* converter convert java.lang.Throwable include message >

页面

hello.jsp页面

   
   
<% @ page language java java.util.* pageEncoding %> String path request.getcontextpath(); String basePath request.getScheme() :// request.getServerName() : request.getServerPort() path ; DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN html head base href <%=basePath%> title My JSP ' hello.jsp starting page Meta http equiv pragma content no-cache cache-control expires 0 keywords keyword1,keyword2,keyword3 description This is my page 记得引入js,测试地址: http: localhost:8083/dwrweb/dwr/ --> script type text/javascript src dwr/engine.js script dwr/interface/helloSrv.js dwr/util.js function hello(){ 方法一 返回处理后的结果信息 var fn = function(result){ $("msg").innerHTML = result; } helloSrv.sayHello($("name").value,fn); 方法二 helloSrv.sayHello($( ).value,function(result){ $( msg ).innerHTML result; }); 方法三 使用如下的好处为:不用导入如上三个js 第一个参数: dwr访问路径,在web.xml中配置,如: <url-pattern>/dwr/*</url-pattern> 第二个参数: dwr与java服务器通信变量,在dwr.xml中声明 第三个参数: 服务器方法名 第四个参数: 页面请求参数,即服务器方法名得参数 第五个参数: 回调函数 dwr.engine._execute("dwr",'helloSrv','sayHello',$("name").value,0)"> } body div id div input type text id button Hello onclick hello(); >

dept.jsp页面

   
   
function loadDept(){ 说明已经加载,不必重新加载 if ($( depts ).options.length ){ ; } DWRUtil.addOptions( '' 正在下载... }],0)">); dwr.engine._execute( getDepts ); DWRUtil.addOptions( ); }); } function loadDept2(){ depts2 getDeptsForPo ); }); } function saveDept(){ 声明dept对象 var dept { id:$( deptid deptname ).value }; dwr.engine._execute( saveDept 保存成功! ); }); } function find(){ dwr.engine._execute( findDept 查询成功! ); },errorHandler:function(e){ alert( 查询失败: e); } }); } select id loadDept(); select loadDept2(); hr ID: input id type size 8 Name: input value 保存部门 saveDept(); 查找 find(); >

DWR3与spring集成(不使用springMVC,但使用注解的实例)

DWR3与spring集成(不使用springMVC,但使用注解的实例)

web.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>  
    <!DOCTYPE web-app PUBLIC  
        "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"  
        "http://java.sun.com/dtd/web-app_2_3.dtd">  
      
    <web-app id="dwr_dev">  
      
      <listener>  
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
       </listener>  
       <context-param>  
         <param-name>contextConfigLocation</param-name>  
         <param-value>  
           classpath:dwr3SampleAppSpring3AnnotNonspringMVC.xml  
         </param-value>  
       </context-param>  
      
       <servlet>  
         <servlet-name>dwr</servlet-name>  
         <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>  
         <init-param>  
           <param-name>debug</param-name>  
           <param-value>true</param-value>  
         </init-param>  
       </servlet>  
       <servlet-mapping>  
         <servlet-name>dwr</servlet-name>  
         <url-pattern>/dwr/*</url-pattern>  
      </servlet-mapping>   
    </web-app>  

spring的bean配置文件
    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:context="http://www.springframework.org/schema/context"  
           xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
           http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">  
        
       <dwr:configuration />     
       <dwr:annotation-scan base-package="org.uk.ltd.dwr.dev" scanDataTransferObject="true" scanRemoteProxy="true"/>     
    </beans>  

java文件
    package org.uk.ltd.dwr.dev.model;  
      
    import org.directwebremoting.annotations.DataTransferObject;  
      
    @DataTransferObject  
    public class Address {  
        private String street;  
        private String street2;  
        private String city;  
        private String state;  
          
        public String getStreet() {  
            return street;  
        }  
        public void setStreet(String street) {  
            this.street = street;  
        }     
        public String getStreet2() {  
            return street2;  
        }     
        public void setStreet2(String street2) {  
            this.street2 = street2;  
        }  
        public String getCity() {  
            return city;  
        }     
        public void setCity(String city) {  
            this.city = city;  
        }     
        public String getState() {  
            return state;  
        }     
        public void setState(String state) {  
            this.state = state;  
        }     
    }  

    package org.uk.ltd.dwr.dev.service;  
      
    import org.directwebremoting.annotations.RemoteMethod;  
    import org.directwebremoting.annotations.RemoteProxy;  
    import org.uk.ltd.dwr.dev.model.Address;  
      
    @RemoteProxy(name="dwrService")  
    public class DWRService {  
          
        public DWRService() { }  
          
        @RemoteMethod  
        public Address getAddress() throws Exception {  
            Address address = new Address();          
            address.setStreet("2245 NW Overlook Drive");  
            address.setCity("Portland");  
            address.setState("Oregon");  
            return address;  
        }  
          
        @RemoteMethod  
        public void printAddress() {  
            System.out.println("Printing");  
        }  
    }  

    <html>  
        <head>  
            <title>DWR Dev</title>  
            <script type="text/javascript" src="/dwr3SampleAppSpring3AnnotNonspringMVC/dwr/engine.js"></script>  
            <script type="text/javascript" src="/dwr3SampleAppSpring3AnnotNonspringMVC/dwr/util.js"></script>  
            <script type="text/javascript" src="/dwr3SampleAppSpring3AnnotNonspringMVC/dwr/interface/dwrService.js"></script>     
            <script>  
                function getDataFromServer() {  
                  dwrService.getAddress({  
                    callback: getDataFromServerCallBack  
                  });  
                }  
                function getDataFromServerCallBack(dataFromServer) {  
                  alert(dwr.util.toDescriptiveString(dataFromServer,3));  
                }  
            </script>  
        </head>  
        <body>  
            <h3> 3.x/Spring 3.x with Annotations and Spring MVC</h3>  
            <a href="#" onclick="getDataFromServer(); return false;">Retrieve test data</a><br/>  
        </body>  
    </html>  


今天的关于Spring集成-队列/轮询似乎耗尽线程池而无需任何操作spring 轮询的分享已经结束,谢谢您的关注,如果想了解更多关于19. 用过 spring 的线程池还是 java 的线程池?、android – 应用程序在后台执行CPU时无需任何操作、dwr+spring集成、DWR3与spring集成(不使用springMVC,但使用注解的实例)的相关知识,请在本站进行查询。

本文标签: