2011-09-03 36 views
5

我想在覈心HornetQ的客戶端持久化隊列。問題是,當我停止服務器隊列和數據將被銷燬。如何使隊列持久? 我的代碼是:如何使HornetQ在隊列中堅持2.2.5核心客戶?

import java.util.Date; 
import org.hornetq.api.core.TransportConfiguration; 
import org.hornetq.api.core.client.ClientConsumer; 
import org.hornetq.api.core.client.ClientMessage; 
import org.hornetq.api.core.client.ClientProducer; 
import org.hornetq.api.core.client.ClientSession; 
import org.hornetq.api.core.client.ClientSessionFactory; 
import org.hornetq.api.core.client.HornetQClient; 
import org.hornetq.api.core.client.ServerLocator; 
import org.hornetq.core.config.Configuration; 
import org.hornetq.core.config.impl.ConfigurationImpl; 
import org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory; 
import org.hornetq.core.remoting.impl.invm.InVMConnectorFactory; 
import org.hornetq.core.server.HornetQServer; 
import org.hornetq.core.server.HornetQServers; 

public class EmbeddedExample 
{ 

    public static void main(final String[] args) 
    { 
     try 
     { 

     // Step 1. Create the Configuration, and set the properties accordingly 
     Configuration configuration = new ConfigurationImpl(); 
     configuration.setPersistenceEnabled(false); 
     configuration.setSecurityEnabled(false); 

     configuration.getAcceptorConfigurations().add(new TransportConfiguration(InVMAcceptorFactory.class.getName())); 

     // Step 2. Create and start the server 
     HornetQServer server = HornetQServers.newHornetQServer(configuration); 
     server.start(); 

     // Step 3. As we are not using a JNDI environment we instantiate the objects directly 
     ServerLocator serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName())); 
     ClientSessionFactory sf = serverLocator.createSessionFactory();   

     // Step 4. Create a core queue   
     ClientSession coreSession = sf.createSession(false, false, false);  

     final String queueName = "queue.exampleQueue"; 

     coreSession.createQueue(queueName, queueName, true); 


     coreSession.close(); 

     ClientSession session = null; 

     try 
     { 

      // Step 5. Create the session, and producer 
      session = sf.createSession(); 

      ClientProducer producer = session.createProducer(queueName); 

      // Step 6. Create and send a message 
      ClientMessage message = session.createMessage(true); 

      final String propName = "myprop"; 

      message.putStringProperty(propName, "Hello sent at " + new Date()); 

      System.out.println("Producer:"); 
      System.out.println("StartDate: "+new Date()); 
      for (int i = 0; i < 100000; i++) 
      { 
        message = session.createMessage(true); // move it 
        message.putStringProperty(propName, "Message: " + i); 
        producer.send(message);  
      } 
      System.out.println("EndDate: "+new Date()); 
      // Step 7. Create the message consumer and start the connection 
      ClientConsumer messageConsumer = session.createConsumer(queueName); 

      session.start(); 

      // Step 8. Receive the message. 
      System.out.println("Consumer:"); 
      System.out.println("StartDate: "+new Date()); 

      //for (int i = 0; i <= 100000; i++)   
      int i=0; 
      while(true) 
      { 
       i++; 
       if(i == 10000){  
        i=0; 
        session.start(); 
        System.out.println("EndDate: "+new Date());       
       } 
       ClientMessage messageReceived = messageConsumer.receive(5000); 
       if (messageReceived!=null) messageReceived.acknowledge(); 
       //System.out.println(messageReceived.getStringProperty(propName)); 
      } 

     } 
     finally 
     { 
      // Step 9. Be sure to close our resources! 
      if (sf != null) 
      { 
       sf.close(); 
      } 

      // Step 10. Stop the server 
      server.stop(); 
     } 
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 
} 
+0

爲什麼不在這裏粘貼代碼? - 並執行configuration.setPersistenceEnabled(假)有事情做與隊列不堅持? (只是在黑暗中猜測) – stakx

+0

我試圖與configuration.setPersistenceEnabled(真);但它給了我「java.lang.UnsatisfiedLinkError」異常。 –

+1

你能添加到此處的代碼編輯您原來的問題?這對未來的參考文獻來說會好得多..因爲沒有什麼能保證你製作的paste.bin會永遠活着。 –

回答

3

如果禁用持久性,你不會有持久性:

Configuration configuration = new ConfigurationImpl(); 
configuration.setPersistenceEnabled(true); <<<< Make this true 

的UnsatisfiedLinkError可能是因爲你選擇AIO並沒有對LD_LIBRARY_PATH本地庫,可以設置Journal或在Linux系統中使本地庫可用。

configuration.setJournalType(JournalType.NIO);