Welcome!

Java Authors: Maureen O'Gara, Bruce Armstrong, Liz McMillan, Walter H. Pinson, III, Yakov Werde

Related Topics: .NET, Java

.NET: Article

Java & .NET: SOAP Over JMS Interoperability

Exposing a Java Web Service via JMS using Apache Axis 1.4 and consuming it from both Java and .NET clients

Next, we attach the SOAP as a byte array to a message and send it to the queue/topic.

      IBytesMessage message = session.CreateBytesMessage();
      message.Content = bytBody;
      //Give the address of our temporary queue
      // so the service knows where to send the response
      message.NMSReplyTo = queue;
      using (IMessageProducer producer = session.CreateProducer())
      { NmsDestinationAccessor destinationResolver = new NmsDestinationAccessor();
      IDestination destination = destinationResolver.ResolveDestinationName(session, _queueName);
      producer.Send(destination, message);
     }

Now we wait for a response. We set a timeout (as a TimeSpan). Here it's a fixed value of 10 seconds for illustration, but it could easily come from a config file or passed as a property in the ActiveMqWebRequestCreate.

IBytesMessage response = (IBytesMessage)
consumer.Receive(
TimeSpan.FromSeconds(10))
as IBytesMessage;
stream = new MemoryStream();
stream.Write(response.Content, 0, response.Content.Length);

    } } }
    catch (NMSException e)
    { throw (e); }
    finally
    { m_RequestStream.InternalClose(); }

    ActiveMqQueueWebResponse resp = new ActiveMqQueueWebResponse();

Here we set the stream to our own.

    resp.SetDownloadStream(stream);
    return resp;
}

Our ActiveMqWebResponse class inherits System.Net.WebResponse and does little more than provide a setter and override the getter on the response stream, since the stream in the built-in WebResponse is read-only.

public class ActiveMqQueueWebResponse : WebResponse
{
    private Stream m_ResponseStream;
    private long m_lngContentLength;
    ...
    internal void SetDownloadStream(Stream vobjResponseStream)
    { m_ResponseStream = vobjResponseStream;
       m_ResponseStream.Position = 0; // Rewind the stream
       m_lngContentLength = m_ResponseStream.Length;
    }

    public override Stream GetResponseStream()
    { return m_ResponseStream;
} }

ActiveMqWebRequestCreate
ActiveMqWebRequestCreate is a class that is used to create instances of our objects instead of the built-in ones for a particular URI prefix. We'll see how this is used in the client application.

public class ActiveMqQueueWebRequestCreate : IWebRequestCreate
{

This has the same properties that are on the ActiveMqWebRequest so it can set them when it instantiates the requests.

    ...
    public WebRequest Create(System.Uri uri)
    { ActiveMqQueueWebRequest request = new ActiveMqQueueWebRequest(
uri, _queueAddress, _queueName, _username, _password);
       return request;
} }


More Stories By Stanimir Stanev

Stanimir Stanev is a senior consultant at MomentumSI's Enterprise Architecture Solutions practice. He has many years of experience focusing on providing enterprise architecture and strategy expertise to companies looking to migrate to or maximize the advantages of SOA principles.

More Stories By Rob Bartlett

Rob Bartlett is a senior consultant at MomentumSI's Software Development Solutions practice. He has over a decade of experience in technical roles, guiding major corporations in the design, implementation, and integration of business solutions.

Comments (0)

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.