public synchronized void start() { if (!started) { HornetQJMSLogger.LOGGER.debug("Starting RecoveryDiscovery on " + config); started = true; locator = config.createServerLocator(); locator.disableFinalizeCheck(); locator.addClusterTopologyListener(new InternalListener(config)); try { sessionFactory = (ClientSessionFactoryInternal) locator.createSessionFactory(); // We are using the SessionFactoryInternal here directly as we don't have information to // connect with an user and password // on the session as all we want here is to get the topology // in case of failure we will retry sessionFactory.addFailureListener(this); HornetQJMSLogger.LOGGER.debug("RecoveryDiscovery started fine on " + config); } catch (Exception startupError) { HornetQJMSLogger.LOGGER.warn( "Couldn't start recovery discovery on " + config + ", we will retry this on the next recovery scan"); stop(); HornetQRecoveryRegistry.getInstance().failedDiscovery(this); } } }
public void setLiveID(String liveID) { targetServerID = liveID; nodeManager.setNodeID(liveID); // now we are replicating we can start waiting for disconnect notifications so we can fail over sessionFactory.addFailureListener(this); }
@Test public void testServerShutdownAndReconnect() throws Exception { HornetQResourceAdapter qResourceAdapter = newResourceAdapter(); qResourceAdapter.setReconnectAttempts(-1); qResourceAdapter.setCallTimeout(500L); qResourceAdapter.setTransactionManagerLocatorClass(""); qResourceAdapter.setTransactionManagerLocatorMethod(""); qResourceAdapter.setRetryInterval(500L); MyBootstrapContext ctx = new MyBootstrapContext(); qResourceAdapter.start(ctx); // This is just to register a listener final CountDownLatch failedLatch = new CountDownLatch(1); ClientSessionFactoryInternal factoryListener = (ClientSessionFactoryInternal) qResourceAdapter .getDefaultHornetQConnectionFactory() .getServerLocator() .createSessionFactory(); factoryListener.addFailureListener( new SessionFailureListener() { @Override public void connectionFailed(HornetQException exception, boolean failedOver) {} @Override public void connectionFailed( HornetQException exception, boolean failedOver, String scaleDownTargetNodeID) { connectionFailed(exception, failedOver); } @Override public void beforeReconnect(HornetQException exception) { failedLatch.countDown(); } }); HornetQActivationSpec spec = new HornetQActivationSpec(); spec.setResourceAdapter(qResourceAdapter); spec.setUseJNDI(false); spec.setDestinationType("javax.jms.Queue"); spec.setDestination(MDBQUEUE); CountDownLatch latch = new CountDownLatch(1); DummyMessageEndpoint endpoint = new DummyMessageEndpoint(latch); DummyMessageEndpointFactory endpointFactory = new DummyMessageEndpointFactory(endpoint, false); qResourceAdapter.endpointActivation(endpointFactory, spec); ClientSession session = locator.createSessionFactory().createSession(); ClientProducer clientProducer = session.createProducer(MDBQUEUEPREFIXED); ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeString("teststring"); clientProducer.send(message); session.close(); latch.await(5, TimeUnit.SECONDS); assertNotNull(endpoint.lastMessage); assertEquals(endpoint.lastMessage.getCoreMessage().getBodyBuffer().readString(), "teststring"); server.stop(); assertTrue(failedLatch.await(5, TimeUnit.SECONDS)); qResourceAdapter.endpointDeactivation(endpointFactory, spec); qResourceAdapter.stop(); }