Slow HornetQ Producer, когда очередь постоянна - PullRequest
6 голосов
/ 05 сентября 2011

Я пытался с Persistent Queue в horntQ. Я сделал два отдельных примера (производитель, потребитель). Мой потребитель работает хорошо, но продюсер тратит слишком много времени, чтобы закончить отправку сообщения. Я бегал как отдельно, так и вместе. В чем может быть проблема? мой код:

public  class HornetProducer implements Runnable{

    Context ic = null;
    ConnectionFactory cf = null;
    Connection connection =  null;
    Queue queue = null;
    Session session = null;
    MessageProducer publisher =  null;
    TextMessage message = null;
    int messageSent=0;

     public synchronized static Context getInitialContext()throws javax.naming.NamingException {

            Properties p = new Properties( );
            p.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
            p.put(Context.URL_PKG_PREFIXES," org.jboss.naming:org.jnp.interfaces");
            p.put(Context.PROVIDER_URL, "jnp://localhosts:1099");

            return new javax.naming.InitialContext(p);
        }  

    public HornetProducer()throws Exception{            

        ic = getInitialContext();
        cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
        queue = (Queue)ic.lookup("queue/testQueue2");
        connection = cf.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        
        publisher = session.createProducer(queue);
        connection.start();

    }

    public void publish(){      
        try{        

            message = session.createTextMessage("Hello!");
            System.out.println("StartDate: "+new Date());

            for(int i=0;i<10000;i++){                   
                 messageSent++;              
                 publisher.send(message);                
            }
            System.out.println("EndDate: "+new Date());
        }catch(Exception e){
            System.out.println("Exception in Consume: "+ e.getMessage());
        }           
    }

    public void run(){
         publish();
    }

    public static void main(String[] args) throws Exception{

        new HornetProducer().publish();    
    }

}

1 Ответ

3 голосов
/ 05 сентября 2011

Вы отправляете эти сообщения постоянно и без транзакций.Это означает, что каждое отправленное сообщение должно быть завершено индивидуально.

Это означает, что для каждого отправляемого сообщения вам необходимо совершить круговую поездку по сети на сервер и дождаться завершения целостности, прежде чем вы сможете отправить другое сообщение.

Если бы в этой ситуации было несколько производителей, hornetq объединял бы обоих производителей, и вы сэкономили бы много времени.(т. е. сервер будет отправлять много запросов на запись).

Если вы хотите ускорить отправку одного производителя, вам, вероятно, следует использовать транзакции.

, например:

I - изменить сеанс на транзакцию:

session = connection.createSession(true, Session.SESSION_TRANSACTIONED); 

II - зафиксировать каждые N сообщений:

   for(int i=0;i<10000;i++){                   
         messageSent++;              
         publisher.send(message);  
         if (messageSent % 1000 == 0) session.commit();              
    }
    session.commit();

Вы также можете отключить синхронизацию постоянных сообщений.(Отправляя их асинхронно).

...