Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 队列持续时慢HornetQ生成器_Java_Jboss_Queue_Hornetq - Fatal编程技术网

Java 队列持续时慢HornetQ生成器

Java 队列持续时慢HornetQ生成器,java,jboss,queue,hornetq,Java,Jboss,Queue,Hornetq,我在horntQ中尝试了持久队列。我分别举了两个例子(生产者、消费者)。我的消费者工作正常,但制作人花了太多时间来完成发送消息。我既单独运行,也一起运行。有什么问题吗? 我的代码是: public class HornetProducer implements Runnable{ Context ic = null; ConnectionFactory cf = null; Connection connection = null; Queue 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();    
    }

}
公共类HornetProducer实现可运行{
上下文ic=null;
ConnectionFactory cf=null;
连接=空;
队列=null;
会话=空;
MessageProducer publisher=null;
TextMessage=null;
int messageSent=0;
公共同步静态上下文getInitialContext()引发javax.naming.NamingException{
属性p=新属性();
p、 put(Context.INITIAL_Context_FACTORY,“org.jnp.interfaces.NamingContextFactory”);
p、 put(Context.URL_PKG_前缀,“org.jboss.naming:org.jnp.interfaces”);
p、 put(Context.PROVIDER\u URL,“jnp://localhosts:1099");
返回新的javax.naming.InitialContext(p);
}  
public HornetProducer()引发异常{
ic=getInitialContext();
cf=(ConnectionFactory)ic.lookup(“/ConnectionFactory”);
queue=(queue)ic.lookup(“queue/testQueue2”);
connection=cf.createConnection();
会话=connection.createSession(false,session.AUTO_-ACKNOWLEDGE);
publisher=session.createProducer(队列);
connection.start();
}
public void publish(){
试试{
message=session.createTextMessage(“你好!”);
System.out.println(“开始日期:+新日期());

对于(int i=0;i您正在以非事务方式持续发送这些消息。这意味着,每个发送的消息都必须单独完成

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

如果在这种情况下有多个生产者,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();

用于(int i=0;我等待您的答复。那么,哪种方法更好:将日志同步设置为false,还是按照您的建议对每个会话进行批处理。假设只有一个会话,并且所有生产者都同步以使用同一个会话?这完全取决于您的需要。将日志同步设置为false将使系统停止同步,最终您可能会错过失败情况下的数据。最佳方法是批处理事务…在一次提交时发送多条消息。在一次提交时使用多条消息(ACK)。这是否适用于嵌入式和核心api(不使用jms)?我没有连接对象,只有ClientSessionFactory。我看到了一个方法CreateTransactionSession(),这就是我在我的例子中使用的吗?它实际上…只是把这些东西翻译成CoreAPI,你就有了相同的语义。