1717package org .apache .activemq .network ;
1818
1919import java .io .IOException ;
20+ import java .net .URI ;
2021import java .util .concurrent .atomic .AtomicInteger ;
2122
2223import jakarta .jms .Connection ;
2526import jakarta .jms .JMSException ;
2627import jakarta .jms .Message ;
2728import jakarta .jms .MessageConsumer ;
28- import jakarta .jms .MessageListener ;
2929import jakarta .jms .MessageProducer ;
3030import jakarta .jms .Queue ;
3131import jakarta .jms .Session ;
3939import org .apache .activemq .broker .BrokerService ;
4040import org .apache .activemq .broker .region .policy .SharedDeadLetterStrategy ;
4141import org .apache .activemq .command .ActiveMQQueue ;
42+ import org .apache .activemq .command .ActiveMQTopic ;
4243import org .apache .activemq .transport .TransportFilter ;
4344import org .apache .activemq .transport .failover .FailoverTransport ;
4445import org .apache .activemq .xbean .BrokerFactoryBean ;
@@ -68,32 +69,28 @@ public class NetworkFailoverTest extends TestCase {
6869 public void testRequestReply () throws Exception {
6970 final MessageProducer remoteProducer = remoteSession .createProducer (null );
7071 MessageConsumer remoteConsumer = remoteSession .createConsumer (included );
71- remoteConsumer .setMessageListener (new MessageListener () {
72- @ Override
73- public void onMessage (Message msg ) {
74- final TextMessage textMsg = (TextMessage )msg ;
72+ remoteConsumer .setMessageListener (msg -> {
73+ final TextMessage textMsg = (TextMessage ) msg ;
74+ try {
75+ final String payload = "REPLY: " + textMsg .getText () + ", " + textMsg .getJMSMessageID ();
76+ final Destination replyTo = msg .getJMSReplyTo ();
77+ textMsg .clearBody ();
78+ textMsg .setText (payload );
79+ LOG .info ("*** Sending response: {}" , textMsg .getText ());
80+ remoteProducer .send (replyTo , textMsg );
81+ LOG .info ("replied with: " + textMsg .getJMSMessageID ());
82+
83+ } catch (DestinationDoesNotExistException expected ) {
84+ // been removed but not yet recreated
85+ replyToNonExistDest .incrementAndGet ();
7586 try {
76- String payload = "REPLY: " + textMsg .getText () + ", " + textMsg .getJMSMessageID ();
77- Destination replyTo ;
78- replyTo = msg .getJMSReplyTo ();
79- textMsg .clearBody ();
80- textMsg .setText (payload );
81- LOG .info ("*** Sending response: {}" , textMsg .getText ());
82- remoteProducer .send (replyTo , textMsg );
83- LOG .info ("replied with: " + textMsg .getJMSMessageID ());
84-
85- } catch (DestinationDoesNotExistException expected ) {
86- // been removed but not yet recreated
87- replyToNonExistDest .incrementAndGet ();
88- try {
89- LOG .info ("NED: " + textMsg .getJMSMessageID ());
90- } catch (JMSException e ) {
91- e .printStackTrace ();
92- };
93- } catch (Exception e ) {
94- LOG .warn ("*** Responder listener caught exception: " , e );
87+ LOG .info ("NED: " + textMsg .getJMSMessageID ());
88+ } catch (JMSException e ) {
9589 e .printStackTrace ();
9690 }
91+ } catch (Exception e ) {
92+ LOG .warn ("*** Responder listener caught exception: " , e );
93+ e .printStackTrace ();
9794 }
9895 });
9996
@@ -104,16 +101,13 @@ public void onMessage(Message msg) {
104101
105102 // track remote dlq for forward failures
106103 MessageConsumer dlqconsumer = remoteSession .createConsumer (new ActiveMQQueue (SharedDeadLetterStrategy .DEFAULT_DEAD_LETTER_QUEUE_NAME ));
107- dlqconsumer .setMessageListener (new MessageListener () {
108- @ Override
109- public void onMessage (Message message ) {
110- try {
111- LOG .info ("dlq " + message .getJMSMessageID ());
112- } catch (JMSException e ) {
113- e .printStackTrace ();
114- }
115- remoteDLQCount .incrementAndGet ();
104+ dlqconsumer .setMessageListener (message -> {
105+ try {
106+ LOG .info ("dlq " + message .getJMSMessageID ());
107+ } catch (JMSException e ) {
108+ e .printStackTrace ();
116109 }
110+ remoteDLQCount .incrementAndGet ();
117111 });
118112
119113 // allow for consumer infos to perculate arround
@@ -176,25 +170,51 @@ protected void doTearDown() throws Exception {
176170 } catch (Exception ex ) {}
177171 }
178172
179- protected void doSetUp (boolean deleteAllMessages ) throws Exception {
173+ protected void doSetUp (final boolean deleteAllMessages ) throws Exception {
180174
181175 remoteBroker = createRemoteBroker ();
182176 remoteBroker .setDeleteAllMessagesOnStartup (deleteAllMessages );
183177 remoteBroker .setCacheTempDestinations (true );
184178 remoteBroker .start ();
179+ remoteBroker .waitUntilStarted ();
185180
186181 localBroker = createLocalBroker ();
187182 localBroker .setDeleteAllMessagesOnStartup (deleteAllMessages );
188183 localBroker .setCacheTempDestinations (true );
189184 localBroker .start ();
190-
191- String localURI = "tcp://localhost:61616" ;
192- String remoteURI = "tcp://localhost:61617" ;
193- ActiveMQConnectionFactory fac = new ActiveMQConnectionFactory ("failover:(" +localURI +"," +remoteURI +")?randomize=false&backup=false&trackMessages=true" );
185+ localBroker .waitUntilStarted ();
186+
187+ // Get actual assigned ephemeral ports
188+ final URI localConnectURI = localBroker .getTransportConnectors ().get (0 ).getConnectUri ();
189+ final URI remoteConnectURI = remoteBroker .getTransportConnectors ().get (0 ).getConnectUri ();
190+ final String localURI = localConnectURI .toString ();
191+ final String remoteURI = remoteConnectURI .toString ();
192+
193+ // Add network connectors programmatically using actual ports
194+ final DiscoveryNetworkConnector localToRemote = new DiscoveryNetworkConnector (
195+ new URI ("static://(" + remoteURI + ")" ));
196+ localToRemote .setName ("networkConnector" );
197+ localToRemote .setDynamicOnly (false );
198+ localToRemote .setConduitSubscriptions (true );
199+ localToRemote .setDecreaseNetworkConsumerPriority (false );
200+ localToRemote .setDynamicallyIncludedDestinations (
201+ java .util .List .of (new ActiveMQQueue ("include.test.foo" ), new ActiveMQTopic ("include.test.bar" )));
202+ localToRemote .setExcludedDestinations (
203+ java .util .List .of (new ActiveMQQueue ("exclude.test.foo" ), new ActiveMQTopic ("exclude.test.bar" )));
204+ localBroker .addNetworkConnector (localToRemote );
205+ localBroker .startNetworkConnector (localToRemote , null );
206+
207+ final DiscoveryNetworkConnector remoteToLocal = new DiscoveryNetworkConnector (
208+ new URI ("static://(" + localURI + ")" ));
209+ remoteToLocal .setName ("networkConnector" );
210+ remoteBroker .addNetworkConnector (remoteToLocal );
211+ remoteBroker .startNetworkConnector (remoteToLocal , null );
212+
213+ ActiveMQConnectionFactory fac = new ActiveMQConnectionFactory ("failover:(" + localURI + "," + remoteURI + ")?randomize=false&backup=false&trackMessages=true" );
194214 localConnection = fac .createConnection ();
195215 localConnection .setClientID ("local" );
196216 localConnection .start ();
197- fac = new ActiveMQConnectionFactory ("failover:(" + remoteURI + "," + localURI + ")?randomize=false&backup=false&trackMessages=true" );
217+ fac = new ActiveMQConnectionFactory ("failover:(" + remoteURI + "," + localURI + ")?randomize=false&backup=false&trackMessages=true" );
198218 fac .setWatchTopicAdvisories (false );
199219 remoteConnection = fac .createConnection ();
200220 remoteConnection .setClientID ("remote" );
@@ -205,11 +225,11 @@ protected void doSetUp(boolean deleteAllMessages) throws Exception {
205225 }
206226
207227 protected String getRemoteBrokerURI () {
208- return "org/apache/activemq/network/remoteBroker.xml" ;
228+ return "org/apache/activemq/network/remoteBroker-ephemeral .xml" ;
209229 }
210230
211231 protected String getLocalBrokerURI () {
212- return "org/apache/activemq/network/localBroker.xml" ;
232+ return "org/apache/activemq/network/localBroker-ephemeral .xml" ;
213233 }
214234
215235 protected BrokerService createBroker (String uri ) throws Exception {
0 commit comments