zoukankan      html  css  js  c++  java
  • activemq 消息阻塞优化和消息确认机制优化

    一、消息阻塞优化

    1.activemq消费者在从待消费队列中获取消息是会先进行预读取,默认是1000条(prefetch=1000)。这样很容易造成消息积压。

    2.可以通过设置prefetch的默认值来调整预读取条数,java代码如下

    //设置预读取为1
    ActiveMQPrefetchPolicy p = new ActiveMQPrefetchPolicy();
    p.setQueuePrefetch(1);
    //创建一个链接工厂
    connectionFactory = new ActiveMQConnectionFactory(username, pwd, url_one);
    //设置预读取为1
    connectionFactory.setPrefetchPolicy(p);
    //从工厂中创建一个链接
    connection = (ActiveMQConnection) connectionFactory.createConnection();
    //启动链接
    connection.start();
    //创建一个事物session
    session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
    queue = session.createQueue(queueResponse);
    consumer = session.createConsumer(queue);
    //设置消息监听器
    consumer.setMessageListener(new ReceiveListener());


    二、消息确认机制优化
    1.activemq默认是自动确认消费机制,即消费者接收了此消息,此消息便从待消费队列中剔除,进入已消费队列。
    2.我们可以将消费确认模式改成手动确认。java代码如下:
    //创建一个事物session
    session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);


        createSession(paramA,paramB);

        paramA 取值有 : true or false 表示是否支持事务 
        paramB 取值有:Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE,SESSION_TRANSACTE

     createSession(paramA,paramB); 
        paramA是设置事务的,paramB设置acknowledgment mode 
        paramA设置为false时:paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。 
        paramA设置为true时:paramB的值忽略, acknowledgment mode被jms服务器设置为SESSION_TRANSACTED 。 
        Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。 
        Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。 
        DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。

     3.然后在消费者监听器中,调用

        msg.acknowledge(); 
    方法来手动返回消费确认标志。代码如下:
      @Override

      public void onMessage(Message message) {
        TextMessage msg = (TextMessage) message;

        //do something

        msg.acknowledge(); 


      }





        

  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/raymond-yan/p/10449646.html
Copyright © 2011-2022 走看看