当队列持久时,慢速HornetQ Producer

我在horntQ中尝试过Persistent Queue。 我做了两个单独的例子(Producer,Consumer)。 我的消费者工作得很好,但制作人花了太多时间来完成发送消息。 我既分开也分开跑。 可能是什么问题呢? 我的代码是:

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(); } } 

您持续发送这些消息,而非事务性发送。 什么意思,发送的每条消息都必须单独完成。

这意味着对于您发送的每条消息,您必须对服务器进行网络往返,并等待它完成持久性,然后才能发送另一条消息。

如果你在这种情况下有多个生产者,hornetq会批处理两个生产者,你会节省很多时间。 (即服务器将批处理许多写请求)。

如果你想加快发送单个生产者的速度,你应该使用交易。

例如:

我 – 将您的会话更改为transactioned:

 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(); 

您还可以禁用持久性消息上的同步。 (异步发送)。