如何提升消费者的速度,取决于消费者的逻辑,我给你这样的消费者逻辑:public void run() {
    Thread.sleep(100000);
}你把框架折腾烂了都无法改善你消息堆积的情况

解决方案 »

  1.   

    消费者可是设置并行的消费数,也就是再并行同一时间消费的数量。默认好像是5,具体可以自己调整。mdb中的maxSession字段
      

  2.   

    如果事物长时间占用,减少事物超时的时间,尽快的消费掉。能够让接下去的任务到达。
    transactionTimeout
      

  3.   

    先查看一下你消费者的逻辑和性能吧,如果本身的性能很差,在jms这一层上优化余地有限.如果你的消费者什么操作都没有,应该不会那么慢的。
      

  4.   

    我也碰到过同样的问题,使用JMS来远程调用出现慢速消费者的问题.我是这样解决的,消费者我只生成一个,这个消费者统一的来拿取消息.首先我建立了这样一个类.private static class MessageProbe {        private Object returnValue;
            private CountDownLatch latch = new CountDownLatch(1);        public Object await() throws InterruptedException {
                latch.await();
                return returnValue;
            }        public Object await(long timeout)
                    throws InterruptedException, TimeoutException {
                boolean noTimeout = false;
                noTimeout = latch.await(timeout, TimeUnit.MILLISECONDS);
                if (noTimeout) {
                    return returnValue;
                } else {
                    throw new TimeoutException("Response message timed out.");
                }
            }        public void obtainRetunValue(Object value) {
                returnValue = value;
                latch.countDown();
            }
        }
    发出调用请求后我就生成一个"MessageProbe"的实例,然后交给之前生成的消费者.
    我的每一次调用都会有一个唯一标识,就是根据这个标识来区分消费.
    Map<String, MessageProbe> registerPool =
                new ConcurrentHashMap<String, MessageProbe>();一个简单的JDK5提供的Map实现,就能满足消费者持有这些"MessageProbe"实例的要求了.
    接收到消息,查看自定义属性中的消息标识,根据这个标识找到"MessageProbe",然后调用"obtainRetunValue"方法为其注入消息.调用线程只需要阻塞在MessageProbe.awit()方法上即可.
      

  5.   

     <property name="pubSubDomain" value="true" />  采用订阅方式 , 监听器发部到多个机器上。 会分解一些压力