[ 
https://issues.apache.org/activemq/browse/AMQNET-94?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jim Gomes resolved AMQNET-94.
-----------------------------

    Resolution: Won't Fix

It is possible to change the {{IConnection}} interface to use the following 
generic types to allow passing in a generic enumeration:
{code:borderStyle=solid}
interface IConnection
{
    //...
    ISession CreateSession(System.Enum acknowledgementMode);
    System.Enum AcknowledgementMode { get; set; }
    //...
}
{code}

However, I think that it will force more code to be written using explicit 
casting in order to deal with the {{AcknowledgementMode}} property in the most 
general cases.

Since using provider specific acknowledgment modes is the outlyer case, I think 
using casting to show specific intent to deviate from standard modes is 
preferred.  The C# enum type system is robust enough to support the following 
using the existing interface definition without reverting to generic 
{{System.Enum}}:

{code:borderStyle=solid|title=Sample of Extant Flexibility}
public interface IConnection : IDisposable, IStartable, IStoppable
{
    //...
    ISession CreateSession(AcknowledgementMode acknowledgementMode);
    AcknowledgementMode AcknowledgementMode { get; set; }
    //...
}

enum MyAckModes
{
    IgnoreDups,
    Transactional,
    Explicit
}

IConnection connection = GetConnection();
// Set the default ack mode
connection.AcknowledgementMode = (AcknowledgementMode) MyAckModes.IgnoreDups;
// Set session-specific ack mode
ISession session = connection.CreateSession((AcknowledgementMode) 
MyAckModes.Explicit);
{code}

As can be seen from this snippet of code, the existing code base allows the use 
of provider specific enumerations while providing type-safety and non-casting 
for the general case.  When a user of NMS wants to have low-level access to a 
provider's unique acknowledgment modes, then they can do so and the C# enum 
system will carry their values through, even if that acknowledgment mode value 
is outside the range of the original {{AcknowledgmentMode}} enumeration.  I 
have created a sample C# app that demonstrates basic casting of enumerations to 
show that provider specific enumeration values can be "carried" inside the 
existing {{AcknowledgementMode}} enumeration.  Since these values only make 
sense to the individual providers, they will be the ones who will cast when 
setting/getting the {{AcknowledgementMode}} property.

{code:borderStyle=solid|title=EnumTest.cs}
using System;

public class EnumTest
{
    enum MyEnum        { First, Second, Third }
    enum ProviderEnum  { Fourth, Fifth }

    static void ShowEnum(System.Enum baseEnum)
    {
        Console.WriteLine("base = {0}", baseEnum);
        ProviderEnum derived = (ProviderEnum) baseEnum;
        Console.WriteLine("derived = {0}", derived);
    }

    static void Main()
    {
        ShowEnum(MyEnum.Second);
        ShowEnum(MyEnum.Third);
    }
}
{code}

When this sample application is run, the following is output:

{panel:title=EnumTest output|borderStyle=solid|bgColor=#FFFFCE}
base = Second
derived = Fifth
base = Third
derived = 2
{panel}

I hope that this addresses the concerns about using provider specific 
extensions to the acknowledgment mode enumeration.  


> Use of AcknowledgmentMode enum and boolean for priority limit use of NMS API 
> for vendor extensions
> --------------------------------------------------------------------------------------------------
>
>                 Key: AMQNET-94
>                 URL: https://issues.apache.org/activemq/browse/AMQNET-94
>             Project: ActiveMQ .Net
>          Issue Type: Improvement
>          Components: ActiveMQ Client
>            Reporter: Mark Pollack
>            Assignee: Jim Gomes
>            Priority: Minor
>             Fix For: 1.0
>
>
> This came up on the dev mailing list.  The AcknowledgmentMode enumeration 
> lists the standard JMS ack modes.  However, vendors extend that, in 
> particular TIBCO EMS.  This should change to either an Enum, int, or string 
> type so that the API will be more portable.
> The same issue exists in the IMessageProducer interface with the boolean 
> value for persistent delivery instead of and int for "DeliveryMode".  TIBCO 
> EMS offers another value for delivery mode.  

-- 
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