[jboss-user] [JBoss Messaging] New message: "Re: Problem with cluster failover."

Krystian Siuda do-not-reply at jboss.com
Fri Jan 8 03:35:01 EST 2010


User development,

A new message was posted in the thread "Problem with cluster failover.":

http://community.jboss.org/message/518899#518899

Author  : Krystian Siuda
Profile : http://community.jboss.org/people/ksiuda

Message:
--------------------------------------------------------------
Hi,
 
When an Exception is thrown dealing with Connection/Session/Producer(in the "sender" thread)/Consumer(in the "receiver" thread) the connection is restarted compleatly. The Exception you qoted ("Maximum number of failover attempts exceeded.") has been thrown only by the "receiver" thread, I think that the "prodcuer" was allready blocked at that time (I can check it to be sure if it's revelant).
 
This is how I handle Exceptions in "sender" ("receiver" is very simmilar, this is very dirty code..sorry):
     public static void sendWrap(ConnectionFactory cf, Destination target) {
          for(;;) {  // just loop forever
               try {
                    Thread.sleep(1000);
                    send(cf, target);
               } catch (Exception e) {
                    if(e instanceof InterruptedException) {
                         LOGGER.info("exiting sender", e);
                         return;
                    }
                    else {
                         LOGGER.warn("send got exception", e);
                    }
               }
          }
     }

and the "send" method:
     public static void send(ConnectionFactory cf, Destination target) throws Exception {
          Connection connection = null;
          try {
               connection = cf.createConnection("ecm-user", "ecm-user");
               Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
               MessageProducer producer = session.createProducer(target);
               connection.start();
               LOGGER.info("Sending");
               for(;;) {
                    // some uniq id generation was here                    TextMessage message = session.createTextMessage(id + "~" + new Date() + "~" + GarbageGenerator.getGarbage());
                    message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
                    producer.send(message);
                    if(LOGGER.isTraceEnabled()) {
                         LOGGER.trace("Sent message no: " + id + " id: " + message.getJMSMessageID() + " : " + message.getText());
                    }
                    else {
                         LOGGER.info("Sent message no: " + id + " id: " + message.getJMSMessageID());
                    }
                    Thread.sleep(500);
                    if(Thread.interrupted()) {
                         LOGGER.info("sender interrupted");
                         throw new InterruptedException();
                    }
               }
          }
          finally {
               if(connection != null) {
                    connection.close();
               }
          }
     }

 
The "receiver" and "sender" threads are using two separate ConnectionFactories and Destinations. Those are taken from two separate JNDI lookups. That's because I needed a tool that can send&receive messages from different servers. This is the initialization code:
               Properties senderProps = new Properties();
               senderProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
               senderProps.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
               senderProps.put(Context.PROVIDER_URL, senderJNP);
               Properties receiverProps = new Properties();
               receiverProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
               receiverProps.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
               receiverProps.put(Context.PROVIDER_URL, receiverJNP);
 
               // Step 1. Create an initial context to perform the JNDI lookup.
               senderInitialContext = new InitialContext(senderProps);
               receiverInitialContext = new InitialContext(receiverProps);
               // Step 3. Perform a lookup on the Connection Factory
               final ConnectionFactory senderConnectionFactory = (ConnectionFactory)senderInitialContext.lookup(senderCF);
               final ConnectionFactory receiverConnectionFactory = (ConnectionFactory)senderInitialContext.lookup(receiverCF);
               // Step 2. Perfom a lookup on the queue
               final Destination senderTarget = (Destination)senderInitialContext.lookup(senderDest);
               final Destination receiverTarget = (Destination)senderInitialContext.lookup(receiverDest);
 

 
Same situation takes place when I'm using HA-JNDI for the lookup (port 1100).
 
Krystian.

--------------------------------------------------------------

To reply to this message visit the message page: http://community.jboss.org/message/518899#518899




More information about the jboss-user mailing list