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