[ 
https://issues.apache.org/activemq/browse/AMQNET-26?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=46413#action_46413
 ] 

Allan Schrum commented on AMQNET-26:
------------------------------------

I wish to contribute towards the resolution of this issue. As such, I have been 
examining the Java implementation with hopes to understand it sufficiently so 
that I can replicate the functions in C#. Below are my comments as to the steps 
or actions required to fix this problem. If others can comment or correct my 
comments, then we can get started on this. If others are willing to help with 
the coding or testing, that would be great.

All that I state below is what I have gleaned from the Java code. There is some 
interpretation of the code that may be in error. If so, then those with 
sufficient knowledge should correct my interpretation.

A quick jump through the stack: We start with a connection factory derived from 
ActiveMQConnectionFactory() (C# ConnectionFactory()). This connection factory 
returns an IConnection which, as part of the process, creates an ITransport 
using a TransportFactory(). In Java, the resource information allows for 
various implementations of ITransport which includes FailoverTransport(). 
Different from C#, the Java implementation breaks out the logic for creating a 
transport so that it can be overridden by subclasses if desired. Not sure if we 
need that or not.

In the TransportFactory, it all starts with the URI associated with the 
connection. The "failover:(URI1, URI2, ..., URIn)" syntax is passed to the 
TransportFactory.connect() to create the associated ITransport object. Looking 
at TransportFactory.connect() it uses findTransportFactory() to determine which 
class to load based upon the location passed. The URI.getScheme() method 
returns "failover" which is used to load the failover transport factory 
(org.apache.activemq.transport.failover.FailoverTransportFactory.java). This is 
based upon the META-INF information which redirects "failover" to that class.

At this point we have a choice. We can allow for dynamic loading of classes 
(which can be done - not too hard) allowing for a similar run-time loading of 
appropriate classes to support various ITransport interface classes, or we can 
punt and do something easy for a compile-time loading of classes. My simple 
vote is to do a compile-time reference to the class which we can move to 
run-time loading at a future date. I have done run-time loading of classes, so 
if desired I can explain how I did it, but do we want that level of complexity 
at this point?

Tabling that issue, the fundamental questions now reside around the differences 
between TransportFactory() and FailoverTransportFactory(), followed by the 
differences between Transport() and FailoverTransport().

The Java version of TransportFactory includes support for composite 
connections. This is used to support reliable and HA connections. Basically, 
composite connections represent a list of URIs associated with a connection.

Most of the extended functionality of the transports is handled through 
subclassing. Want a ITransport that does X, then create a new subclass of 
Transport() or something that implements ITransport() and now you have a new 
feature X. However, there is a client-side and server-side for feature X (e.g. 
SSL). For SSL support, the client must understand how to connect properly, and 
the server needs to understand how to accept the connection properly. Thus  
some of the classes that support ITransport() also support TransportServer() 
which handles the server-side of things (I think this is correct). Not all 
features require this to work properly. For instance, the failover: capability 
is a client-only feature that does not require server-side coding.

If we are to round-out all the neat features of the Java-based interfaces to be 
supported here with .NET, then we need to carefully support this dual concept 
of client- and server-side coding for the features.

I think that is the level of complexity that is implied by all the features in 
the Java-based code. Essentially it breaks down into two sets of supported 
interfaces (Transport and TransportServer) which are required depending upon 
the specific feature. The rest of the feature code seems to be dependent upon 
the features being implemented.

OK - so what does this mean for our implementation? I would suggest the 
following:

1.      We create a Failover directory for our files with an implied "Failover" 
namespace extension.
2.      Create a FailoverTransportFactory.cs and FailoverTransport.cs classes 
that will implement our new features (details to follow soon).
3.      Explicitly reference this new namespace and based upon the schema 
passed either call TcpTransportFactory() or FailoverTransportFactory(). Using 
this ITransportFactory create the appropriate ITransport class.
4.      As we add new features, we can then decide to continue with this 
explicit compile-time structure of referencing the classes, or we can think 
about a run-time loading of classes. But that is for the future.

The key feature of FailoverTransportFactory() and FailoverTransport() is the 
ability to parse and handle multiple URIs. There is logic to randomly (or 
sequentially) try to connect to each URI until success. If successful, then 
life is good. If there is a failure, then a try to reconnect is possible as 
well as tries to connect to the other URIs specified. Of course, each URI can 
have it own connection qualifiers so each needs to be handled independently.

At this point I will stop for comments. The details of how FailoverTransport() 
should be implemented are mostly in the Java code, but of course, details vary 
for C#.

> Add failover:// to NMS client
> -----------------------------
>
>                 Key: AMQNET-26
>                 URL: https://issues.apache.org/activemq/browse/AMQNET-26
>             Project: ActiveMQ .Net
>          Issue Type: New Feature
>          Components: ActiveMQ Client
>            Reporter: Denis Abramov
>            Assignee: Jim Gomes
>            Priority: Critical
>             Fix For: 1.1
>
>
> Please add failover:// to C# NMS Client. I would add it but I don't know how 
> to resume a stream once it is broken.

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

Reply via email to