[
https://issues.apache.org/activemq/browse/AMQ-2472?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stirling Chow updated AMQ-2472:
-------------------------------
Attachment: patch.txt
Patch with changes required to address this issue. Unused imports have also
been removed.
> NullPointerException during startup of DiscoveryNetworkConnector when using
> an HTTP URL for an inactive remote broker.
> ----------------------------------------------------------------------------------------------------------------------
>
> Key: AMQ-2472
> URL: https://issues.apache.org/activemq/browse/AMQ-2472
> Project: ActiveMQ
> Issue Type: Bug
> Components: Connector
> Affects Versions: 5.3.0
> Environment: ActiveMQ 5.3.0 release (08/10/2009), Windows XP
> Reporter: Stirling Chow
>
> Symptom
> ========
> When starting a statically-configured network of two AMQ brokers, each of
> which uses HTTP as their transport, if one of the brokers is not running when
> the other starts up, the following NPE appears in the logs:
> 2009-11-01 11:05:53,626 [AlarmPoint Node-main] INFO - - Using Persistence
> Adapter: MemoryPersistenceAdapter
> 2009-11-01 11:05:53,626 [AlarmPoint Node-main] INFO - - ActiveMQ 5.3.0
> JMS Message Broker (localhost) is starting
> 2009-11-01 11:05:53,626 [AlarmPoint Node-main] INFO - - For help or more
> information please see: http://activemq.apache.org/
> 2009-11-01 11:05:53,829 [AlarmPoint Node-main] WARN - - 2009-11-01
> 11:05:53.445::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
> 2009-11-01 11:05:53,876 [AlarmPoint Node-main] WARN - - 2009-11-01
> 11:05:53.492::INFO: jetty-6.1.9
> 2009-11-01 11:05:53,922 [AlarmPoint Node-main] WARN - - 2009-11-01
> 11:05:53.538::INFO: Started socketconnec...@localhost:50000
> 2009-11-01 11:05:53,922 [AlarmPoint Node-main] INFO - - Connector
> http://localhost:50000 Started
> 2009-11-01 11:05:53,922 [AlarmPoint Node-main] INFO - - Establishing
> network connection from vm://localhost to http://192.168.168.44:50001
> 2009-11-01 11:05:53,938 [AlarmPoint Node-main] DEBUG - - binding to
> broker: localhost
> 2009-11-01 11:05:53,938 [AlarmPoint Node-main] INFO - - Connector
> vm://localhost Started
> 2009-11-01 11:05:57,954 [AlarmPoint Node-main] DEBUG - - Shutting down VM
> connectors for broker: localhost
> 2009-11-01 11:05:57,954 [ActiveMQ Transport Stopper: vm://localhost#0] DEBUG
> - - Stopping connection: vm://localhost#0
> 2009-11-01 11:05:57,954 [ActiveMQ Transport Stopper: vm://localhost#0] DEBUG
> - - Stopped transport: vm://localhost#0
> 2009-11-01 11:05:57,954 [ActiveMQ Transport Stopper: vm://localhost#0] DEBUG
> - - Connection Stopped: vm://localhost#0
> 2009-11-01 11:05:57,954 [AlarmPoint Node-main] INFO - - Connector
> vm://localhost Stopped
> 2009-11-01 11:05:57,954 [AlarmPoint Node-main] ERROR - - Could not stop
> service: HTTP Reader http://192.168.168.44:50001. Reason:
> java.lang.NullPointerException
> java.lang.NullPointerException
> at
> org.apache.activemq.transport.http.HttpClientTransport.doStop(HttpClientTransport.java:202)
> at org.apache.activemq.util.ServiceSupport.stop(ServiceSupport.java:69)
> at
> org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:64)
> at
> org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:64)
> at
> org.apache.activemq.transport.ResponseCorrelator.stop(ResponseCorrelator.java:125)
> at
> org.apache.activemq.util.ServiceSupport.dispose(ServiceSupport.java:43)
> at
> org.apache.activemq.network.DiscoveryNetworkConnector.onServiceAdd(DiscoveryNetworkConnector.java:134)
> at
> org.apache.activemq.transport.discovery.simple.SimpleDiscoveryAgent.start(SimpleDiscoveryAgent.java:77)
> at
> org.apache.activemq.network.DiscoveryNetworkConnector.handleStart(DiscoveryNetworkConnector.java:182)
> at
> org.apache.activemq.network.NetworkConnector$1.doStart(NetworkConnector.java:56)
> at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:53)
> at
> org.apache.activemq.network.NetworkConnector.start(NetworkConnector.java:199)
> at
> org.apache.activemq.broker.BrokerService.startAllConnectors(BrokerService.java:1933)
> at
> org.apache.activemq.broker.BrokerService.start(BrokerService.java:471)
> at
> com.invoqsystems.foundation.component.communication.MessageBusImpl.startJmsBroker(MessageBusImpl.java:602)
> at
> com.invoqsystems.foundation.component.communication.MessageBusImpl.start(MessageBusImpl.java:364)
> at
> com.invoqsystems.apex.component.communication.NodeMessageBusImpl.start(NodeMessageBusImpl.java:207)
> at
> com.invoqsystems.apex.component.node.manager.NodeManager.startMessagingServer(NodeManager.java:975)
> at
> com.invoqsystems.apex.component.node.manager.NodeManager.start(NodeManager.java:199)
> at
> com.invoqsystems.apex.AlarmPointNode.startNodeManager(AlarmPointNode.vaja:162)
> at com.invoqsystems.apex.AlarmPointNode.run(AlarmPointNode.java:62)
> at java.lang.Thread.run(Thread.java:595)
> Reproduction
> ===========
> Configure one broker to listen to http://localhost:50000 and the other broker
> to list to http://localhost:50001. Network the brokers together using the
> SimpleDiscoveryAgent (static) configuration:
> <broker brokerName="broker1" persistent="false" useJmx="false">
> <networkConnectors>
> <networkConnector uri="static:(http://localhost:50001)"/>
> </networkConnectors>
> <persistenceAdapter>
> <memoryPersistenceAdapter/>
> </persistenceAdapter>
> <transportConnectors>
> <transportConnector uri="http://localhost:50000"/>
> </transportConnectors>
> </broker>
> and the other broker as:
> <broker brokerName="broker2" persistent="false" useJmx="false">
> <networkConnectors>
> <networkConnector uri="static:(http://localhost:50000)"/>
> </networkConnectors>
> <persistenceAdapter>
> <memoryPersistenceAdapter/>
> </persistenceAdapter>
> <transportConnectors>
> <transportConnector uri="http://localhost:50001"/>
> </transportConnectors>
> </broker>
> Start broker1, but do not start broker2. Observe the stacktrace in broker1's
> logs.
> Cause
> ======
> During startup, the following code executes in
> DiscoveryNetworkConnector#onServiceAdd(DiscoveryEvent event):
> NetworkBridge bridge = createBridge(localTransport,
> remoteTransport, event);
> try {
> bridge.start();
> bridges.put(uri, bridge);
> } catch (Exception e) {
> ServiceSupport.dispose(localTransport);
> ServiceSupport.dispose(remoteTransport);
> LOG.warn("Could not start network bridge between: " +
> localURIName + " and: " + uri + " due to: " + e);
> A bridge is created to connect broker1 to broker2 (http://localhost:50000 to
> http://localhost:50001), but since broker2 is not started, bridge.start()
> will throw a "Connection refused" exception. In handling this exception,
> ServiceSupport.dispose(remoteTransport) is called, which eventually calls
> through to HttpClientTransport#doStop(ServiceStopper stopper):
> protected void doStop(ServiceStopper stopper) throws Exception {
> httpMethod.abort();
> }
> The NPE is caused becuase httpMethod is null.
> When bridge.start() is called, it will pass through to
> HttpClientTransport#doStart():
> LOG.trace("HTTP GET consumer thread starting: " + this);
> HttpClient httpClient = getReceiveHttpClient();
> URI remoteUrl = getRemoteUrl();
> HeadMethod httpMethod = new HeadMethod(remoteUrl.toString());
> configureMethod(httpMethod);
> int answer = httpClient.executeMethod(httpMethod);
> The httpClient.executeMethod(httpMethod) throws the "connection refused"
> exception because the HEAD command cannot connect. The httpMethod in
> doStart() is a local var, while the object-scope httpMethod is only set once
> the transport starts running, which never occurs due to the HEAD failure.
> Solution
> =======
> Check that httpMethod is not null before disposing in HttpClientTransport:
> protected void doStop(ServiceStopper stopper) throws Exception {
> if(httpMethod != null)
> {
> httpMethod.abort();
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.