qpid-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Filip Nguyen <fngu...@redhat.com>
Subject Re: Qpid QMF with qpid-jms-client 0.10.0
Date Wed, 21 Dec 2016 08:15:35 GMT
Thank you so much Chris!

To sum up what changes I had to do to my code:

  * Supply routing key (using the trick with typecast to
    AmqpJmsMessageFacade). I was in fact specifically grepping the
    jms-client sources to find how it handles "subject", but I missed
    the fact that there is the qpid proton library for Java
  * for some strange reason remove request.setJMSType("amqp/map");
  * Change the response handling as QMF now responds with
    JmsObjectMessage instead of MapMessage and it also uses
    org.apache.qpid.proton.amqp.Binary in the inner parts of the message
  * request.setValidatePropertyNames(false); - this one was also quite
    tricky, thanks

I hope that migrating other parts of the code won't be as tricky as this 
:-)

On 12/19/2016 05:40 PM, Chris Richardson wrote:
> Hi Filip,
>
> I think I might have had the same problem as you in the past because 
> the methods (I think) are required are not available on the JMS 
> interface. My solution was a rather hacky approach of casting the JMS 
> instance to the actual Qpid type, as in the following examples:
>
>    private  void  method(String  method,  Map  arguments,  String  address)  throws 
JMSException  {
>          Destination  reply_to  =  session.createTemporaryQueue();
>          MessageConsumer  receiver  =  session.createConsumer(reply_to);
>
>          JmsMapMessage  request  =  (JmsMapMessage)  session.createMapMessage();
>          request.setValidatePropertyNames(false);
>          request.setStringProperty("x-amqp-0-10.app-id",  "qmf2");
>          request.setStringProperty("qmf.opcode",  "_method_request");
>          request.setStringProperty("method",  "request");
>
>          Map  object_id_map  =  new  HashMap();
>          object_id_map.put("_object_name",  address);
>
>          request.setString("_method_name",  method);
>
>          // Can't set map directly on object, so we'll hack it here
>          JmsMapMessageFacade  facade  =  (JmsMapMessageFacade)request.getFacade();
>          facade.put("_object_id",  object_id_map);
>          facade.put("_arguments",  arguments);
>
>          int  correlation_id  =  sendMessage(request,  reply_to);
>
>          List<Message>  response  =  awaitResponse(receiver,  correlation_id, 
10  *  1000);
>          if  (response  !=  null  &&  response.size()  >  0)  {
>              new  ResponseDecoder().decodeResponse(response);
>          }  else  {
>              throw  new  JMSException("No response received");
>          }
>      }
>
>      private  int  sendRequest(String  opcode,  Map<String,  ?>  query,  Destination
 replyAddress)  throws  JMSException  {
>          JmsMapMessage  request  =  (JmsMapMessage)  session.createMapMessage();
>          request.setValidatePropertyNames(false);
>          request.setStringProperty("x-amqp-0-10.app-id",  "qmf2");
>          request.setStringProperty("qmf.opcode",  opcode);
>
>          // Can't set map directly on object, so we'll hack it here
>          JmsMapMessageFacade  facade  =  (JmsMapMessageFacade)request.getFacade();
>          for  (Map.Entry<String,  ?>  entry  :  query.entrySet())  {
>              facade.put(entry.getKey(),  entry.getValue());
>          }
>
>          return  sendMessage(request,  replyAddress);
>      }
>
> Unfortunately I haven't structured our Java implementation of the QMF2 
> interface as well as I could have done and it's rather entrenched in 
> another of our libraries but I'm sure no one will mind if I share the 
> attached implementation (based on the Qpid Python implementation) for 
> reference.
>
> /Chris
>
>
> On 19 December 2016 at 14:14, Filip Nguyen <fnguyen@redhat.com 
> <mailto:fnguyen@redhat.com>> wrote:
>
>     We currently use Java JMS qpid-client 0.32. It is quite easy to
>     use QMF [1] just by using MapMessage etc.
>
>     With new Java Qpid JMS client
>     org.apache.qpid:qpid-jms-client:jar:0.10.0 I couldn't find a way
>     how to use Qpid QMF. Is there any existing usage or example how to
>     do that?
>
>     [1]
>
>                 MapMessage request = session.createMapMessage();
>                 request.setJMSReplyTo(responseQueue);
>                 request.setStringProperty("x-amqp-0-10.app-id", "qmf2");
>                 request.setStringProperty("qmf.opcode", "_query_request");
>
>
>
>
>     ---------------------------------------------------------------------
>     To unsubscribe, e-mail: users-unsubscribe@qpid.apache.org
>     <mailto:users-unsubscribe@qpid.apache.org>
>     For additional commands, e-mail: users-help@qpid.apache.org
>     <mailto:users-help@qpid.apache.org>
>
>
>
>
> -- 
>
> *Chris Richardson*, System Architect
> cr@fourc.eu <mailto:cr@fourc.eu>
>
> /FourC AS, Vestre Rosten 81, Trekanten, NO-7075 Tiller, Norway
> www.fourc.eu <http://www.fourc.eu/>/
>
> *Follow us on LinkedIn <http://bit.ly/fourcli>, Facebook 
> <http://bit.ly/fourcfb>, Google+ <http://bit.ly/fourcgp> and Twitter 
> <http://bit.ly/fourctw>!*
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@qpid.apache.org
> For additional commands, e-mail: users-help@qpid.apache.org


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message