You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Gary Tully (JIRA)" <ji...@apache.org> on 2010/07/12 18:50:53 UTC

[jira] Commented: (AMQ-2823) ActiveMQ URI: parsing errors for failover URI (composite URI)

    [ https://issues.apache.org/activemq/browse/AMQ-2823?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60611#action_60611 ] 

Gary Tully commented on AMQ-2823:
---------------------------------

could you validate against trunk or add your variants to http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/FailoverUriTest.java?view=markup
there have been some improvements in this area for 5.4

> ActiveMQ URI: parsing errors for failover URI (composite URI)
> -------------------------------------------------------------
>
>                 Key: AMQ-2823
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2823
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.2.0
>            Reporter: Javier Michelson
>
> Symptoms
> the following URI "patterns" cause unexpected behaviour:
> 1) failover://(tcp://host:port)?connectionParameter=value
> 2) failover://(tcp://host:port?tcpParameter=value1)?failoverParameter=value3
> 3) failover://(tcp://host:port?tcpParameter=value1)?connectionParamater=value2&failoverParameter=value3
> 1) A failover URL is not parsed correctly in ActiveMQ version 5.2.0. When there are parameters for the connection (e.g.: prefetch policy parameters -"jms.prefetchSize.all", etc-) This issue has to do with the invalid parsing of the URI.
> The issue was found when trying to append connection parameters to a failover URI. The problem with this is basically that the failover URI is not a "generic URI" (see RFC 2396 for more details), that is, it is not of the form:
> <scheme>://<authority><path>?<query>
> Although the URI is composed of
> <scheme>:<scheme-specific-part>
> and is thus a valid URI according to the RFC.
> The method 
> URISupport.createURIWithQuery(URI, String)
> return and incorrect URI for a failover URI, because of the scheme of this URI. This is the content of the method:
> <<< CODE
> URISupport.createURIWithQuery(URI, String){
> 	return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), query, uri.getFragment());
> }
> <<< /CODE
> When parsing the URI in ActiveMQConnectionFactory.createURI(String) with:
> new java.util.URI(String)
> The resulting URI has some missing or "invalid" values. For instance, with the following URL:
> "failover://(tcp://host:port)?jms.prefetchSize.all=30"
> the resulting URI has the following values set:
> host=null
> port=-1
> authority="(tcp:"
> path="//host:port)"
> query="connectionParameter=value"
> the path gets its value because of the "/" after "(tcp:".
> The result is that when 
> ActiveMQConnectionFacotry.setBrokerURL(String) Line 343:
> <<< CODE
> this.brokerURL = URISupport.createRemainingURI(this.brokerURL, map);
> <<< /CODE
> is excecuted, an exeption is thrown (message="Illegal character in port number"), because of the invalid por number.
> This is silently ignored in the ActiveMQConnectionFactory.setBroker(Strin) method and the values of the brokerURL are not updated without the connection parameters.
> Consecuently, when the connection is created, the following exception is thrown:
> java.lang.IllegalArgumentException "Invalid connect parameters: ..."
> Because of the connectionParameter that was not removed from the brokerURL.
> 2) The second URI pattern causes failover paramters to be ignored but the tcp transport gets the correct parameters.
> The resulting URI in ActiveMQConnectionFactory contains the following invalid values:
> host=null
> port=-1
> authority="(tcp:"
> path="//host:port"
> query="tcpParameter=value)?failoverParamater=value"
> this is because of the extra ? in the "nested" URI.
> This URI works correctly, but if a connection parameter is the first parameter in the composite URI as in (3):
> 	failover://(tcp://host:port?tcpParameter=value1)?connectionParamater=value2&failoverParameter=value3
> that parameter would be omited, and the failover transport would fail when connecting because of an invalid connection parameter being set for the failover transport.
> Conclusion:
> A modification of the parsing in 
> ActiveMQConnectionFactory.setBrokerURL(String)
> should solve the query parameter problems.
> The parameter parsing should consider the nested URIs, and the call to 
> URISupport.createRemainingURI(URI, Map);
> should create a "nested" URI (composite) if required.
> Some other modification could also be required.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.