Re: how to delete queue from jms client
Dear Gordon, I appreciate all your support. Your advice on the creation of the queue worked well. thank you very much. Gastón, 2011/12/7 Gordon Sim g...@redhat.com On 12/07/2011 08:06 PM, Gaston Quezada wrote: Dear Gordon, how to configure the auto-delete-timeout tag in the format BURL I don't think you can do that with the BURL syntax. this is my code: String address = BURL:direct://exchange-**output/ + this.replyTo + / + this.replyTo + ?routingkey='+this.replyTo; AMQDestination dest1 = new AMQAnyDestination(address); if the option is ADRR format, how to defined by the exchange, queue, routingkey a single URL? I'm not entirely sure what it is you want to do (and I don't know enough about how the BURL syntax above is supposed to work to deduce this reliably from your string above). However, assuming that what you want is to create a named queue on-demand with the delayed auto-deletion function enabled, and also ensure that the queue is bound to a given exchange, you could use the following (with the ADDR style syntax and an exchange called my-exchange, a queue called my-queue and a routing key with value my-key): my-queue; {create: always, node:{x-declare:{queue:'my-**queue',auto-delete:True, arguments:{'qpid.auto_delete_**timeout':30}}, x-bindings:[{exchange:'my-**exchange', key:'my-key'}]}} Note however that when you create a producer for that address it will publish straight to the queue, not go through the exchange. If it's the latter you want you could instead use: my-exchange/my-key; {link:{name:'my-queue', x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_**timeout':30 Hope this helps, but if not perhaps you can give some more context for what you are trying to do. --**--**- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscribe@qpid.**apache.orgusers-subscr...@qpid.apache.org -- Gastón Quezada
Re: how to delete queue from jms client
Hi Gordon, These examples are great, however I have to admit that I find the cwiki.apache.org/confluence/ hard to find. It's only because I bookmarked a link you previously sent on https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP that I ever made it there at all. I think that my preference would be for these examples and the info on the x-declare to be included in the Programming in Apache Qpid book, which seems to be becoming somewhat of the canonical reference book. What do you think? If you're not keen on that then perhaps hyperlinks to the wiki pages? if https://cwiki.apache.org/confluence/display/qpid/Index represents the real Wiki root it might be better if that was what was linked off the Qpid home page Wiki link rather than https://cwiki.apache.org/qpid/ if I'm honest I find it a bit confusing and it's not obvious which is canonical. Finally Re (from the addressing examples page) Another use case for more complex addresses is where shared queues are to be created on demand, conforming to a specific configuration. My own advice is to think carefully about whether this is needed in any given situation or whether a static configuration might be more appropriate. However for those who feel they require it, I've noticed you're views on this in some of your other posts on the mailing list and I'm really curious as to your reasoning behind it. My personal view is that I really like the idea of self service subscription. In my particular scenario I've got producers delivering to a headers exchange and acting kind of like a data mart, where consumers can come along and pick up subsets of data that they want. I'm personally not especially anti administratively created queues either (indeed I do this for setting up queue routes) however I think it's a bit inconvenient for general subscribers. Also there are currently general inconveniences with administratively created queues/etc. (which would be nice to get sorted IMHO) in particular the configuration doesn't persist broker restart. In other words if one actually wants a non-durable queue (as in the messages aren't persisted) you have to put up with it getting blatted when the broker restarts. This is pretty annoying - especially for queue routes!!! you'll recall some conversations we've had with respect to that. Adding bindings administratively for lots of clients is fiddly too, especially headers clients. In my scenario I've got dozens of consumers with quite sophisticated headers bindings and when I need to restart the broker the clients automatically reconnect and the queues bindings get recreated and the data just starts flowing. If I had to use administratively created stuff yeah I could script it, but why is that better than on-demand queues? Also I'd need to add some way to detect the broker restart to cause my script to run - IMHO that all gets just a bit messy. I'm already grumbling under my breath about the cron job I've had to introduce to periodically attempt to re-create queues and links from my source brokers in case they've restarted. So I'm curious why you seem anti on demand creation and how you'd go about managing a fairly large and complex environment via administratively created queues/bindings given the sort of broker restart scenario I describe above. I look forward to your thoughts. Cheers, Frase Gordon Sim wrote: On 12/06/2011 07:46 PM, Fraser Adams wrote: There's some useful docs for x-declare here https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP but it's quite hard to find and doesn't really illustrate that you still need the auto-delete:True bit, which is possibly something you've missed? BTW I added a page on the wiki to collect some common example addresses for different cases. Comments, suggestions improvements always welcome! https://cwiki.apache.org/confluence/display/qpid/Addressing+Examples - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
On 12/09/2011 05:15 PM, Fraser Adams wrote: These examples are great, however I have to admit that I find the cwiki.apache.org/confluence/ hard to find. It's only because I bookmarked a link you previously sent on https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP that I ever made it there at all. I think that my preference would be for these examples and the info on the x-declare to be included in the Programming in Apache Qpid book, which seems to be becoming somewhat of the canonical reference book. What do you think? I wouldn't consider these addressing examples as canonical reference material! The Programming in Apache Qpid book is a bit of a mixture of things. I'm not yet sure if or how these would fit in with that. In the meantime I wanted to at least have somewhere where we could start collecting 'recipes'. [...] Finally Re (from the addressing examples page) Another use case for more complex addresses is where shared queues are to be created on demand, conforming to a specific configuration. My own advice is to think carefully about whether this is needed in any given situation or whether a static configuration might be more appropriate. However for those who feel they require it, I've noticed you're views on this in some of your other posts on the mailing list and I'm really curious as to your reasoning behind it. I distinguish between on-demand creation of *shared* queues and/or exchanges as addressable entities in their own right and the very necessary on-demand (and hopefully increasingly transparent) creation of 'subscription' queues as required by the AMQP 0-10 model. With regard to the former, my opinion is simply that it is worth considering carefully whether it is required. If it is not, keeping the configuration entirely separate from the clients has advantages and static creation avoids any race conditions. I certainly accept that having no durable record of queue configuration (as distinct from having the messages on them persisted) is an unfortunate limitation. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
Gordon Sim wrote: I wouldn't consider these addressing examples as canonical reference material! The Programming in Apache Qpid book is a bit of a mixture of things. I'm not yet sure if or how these would fit in with that. In the meantime I wanted to at least have somewhere where we could start collecting 'recipes'. I guess, though that book does contain a few address examples, but they're a bit basic compared to your ones. What's your thinking on how easy (or otherwise) the confluence wiki stuff is to find from the main web site? As I said earlier I only found these pages after you posted the link, it's not easy to find from the main site. I distinguish between on-demand creation of *shared* queues and/or exchanges as addressable entities in their own right and the very necessary on-demand (and hopefully increasingly transparent) creation of 'subscription' queues as required by the AMQP 0-10 model. I think I see what you're getting at here. I think that there are subtleties though. In my case I have subscribers that may be considered single logical entities, however in practice they may comprise several physical instances each consuming messages from a given queue - in effect the shared queue enables a fairly simple approach to scaling out across multiple servers. With regard to the former, my opinion is simply that it is worth considering carefully whether it is required. If it is not, keeping the configuration entirely separate from the clients has advantages and static creation avoids any race conditions. What sort of race conditions would you expect to crop up? I'm not aware of seeing any issues with out I certainly accept that having no durable record of queue configuration (as distinct from having the messages on them persisted) is an unfortunate limitation. Are there any plans to introduce such a feature? From what I've gathered the Java broker has something like this, though I'm not familiar with that and it may just be hearsay. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
On 12/06/2011 07:46 PM, Fraser Adams wrote: There's some useful docs for x-declare here https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP but it's quite hard to find and doesn't really illustrate that you still need the auto-delete:True bit, which is possibly something you've missed? BTW I added a page on the wiki to collect some common example addresses for different cases. Comments, suggestions improvements always welcome! https://cwiki.apache.org/confluence/display/qpid/Addressing+Examples - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
Dear Gordon, how to configure the auto-delete-timeout tag in the format BURL this is my code: String address = BURL:direct://exchange-output/ + this.replyTo + / + this.replyTo + ?routingkey='+this.replyTo; AMQDestination dest1 = new AMQAnyDestination(address); if the option is ADRR format, how to defined by the exchange, queue, routingkey a single URL? thanks a lot... 2011/12/7 Gordon Sim g...@redhat.com On 12/06/2011 07:46 PM, Fraser Adams wrote: There's some useful docs for x-declare here https://cwiki.apache.org/**confluence/display/qpid/Qpid+** extensions+to+AMQPhttps://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP but it's quite hard to find and doesn't really illustrate that you still need the auto-delete:True bit, which is possibly something you've missed? BTW I added a page on the wiki to collect some common example addresses for different cases. Comments, suggestions improvements always welcome! https://cwiki.apache.org/**confluence/display/qpid/**Addressing+Exampleshttps://cwiki.apache.org/confluence/display/qpid/Addressing+Examples --**--**- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscribe@qpid.**apache.orgusers-subscr...@qpid.apache.org -- Gastón Quezada
Re: how to delete queue from jms client
On 12/07/2011 08:06 PM, Gaston Quezada wrote: Dear Gordon, how to configure the auto-delete-timeout tag in the format BURL I don't think you can do that with the BURL syntax. this is my code: String address = BURL:direct://exchange-output/ + this.replyTo + / + this.replyTo + ?routingkey='+this.replyTo; AMQDestination dest1 = new AMQAnyDestination(address); if the option is ADRR format, how to defined by the exchange, queue, routingkey a single URL? I'm not entirely sure what it is you want to do (and I don't know enough about how the BURL syntax above is supposed to work to deduce this reliably from your string above). However, assuming that what you want is to create a named queue on-demand with the delayed auto-deletion function enabled, and also ensure that the queue is bound to a given exchange, you could use the following (with the ADDR style syntax and an exchange called my-exchange, a queue called my-queue and a routing key with value my-key): my-queue; {create: always, node:{x-declare:{queue:'my-queue',auto-delete:True, arguments:{'qpid.auto_delete_timeout':30}}, x-bindings:[{exchange:'my-exchange', key:'my-key'}]}} Note however that when you create a producer for that address it will publish straight to the queue, not go through the exchange. If it's the latter you want you could instead use: my-exchange/my-key; {link:{name:'my-queue', x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':30 Hope this helps, but if not perhaps you can give some more context for what you are trying to do. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
Hi Gastón, you can use QMF method delete with parameters type (queue in our case) and name (name of the queue). Here is the code snippet from C++ program I use: Connection connection(url/*, connectionOptions*/); try { connection.open(); Session session = connection.createSession(); Sender sender = session.createSender(qmf.default.direct/broker); Address responseQueue(#reply-queue; {create:always, node:{x-declare:{auto-delete:true}}}); Receiver receiver = session.createReceiver(responseQueue); Message message; Variant::Map content; Variant::Map OID; Variant::Map arguments; OID[_object_name] = org.apache.qpid.broker:broker:amqp-broker; arguments[type] = queue; arguments[name] = queue_name; // a string of the queue name content[_object_id] = OID; content[_method_name] = delete; content[_arguments] = arguments; encode(content, message); message.setReplyTo(responseQueue); message.setProperty(x-amqp-0-10.app-id, qmf2); message.setProperty(qmf.opcode, _method_request); sender.send(message, true); /* check response if the queue was properly deleted */ Message response; if (receiver.fetch(response,qpid::messaging::Duration(3)) == true) { qpid::types::Variant::Map recv_props = response.getProperties(); if (recv_props[x-amqp-0-10.app-id] == qmf2) if (recv_props[qmf.opcode] == _method_response) std::cout Response: OK std::endl; else if (recv_props[qmf.opcode] == _exception) std::cerr Error: response.getContent() std::endl; else std::cerr Invalid response received! std::endl; else std::cerr Invalid response not of qmf2 type received! std::endl; } else std::cout Timeout: No response received within 30 seconds! std::endl; connection.close(); return 0; } catch(const std::exception error) { std::cout error.what() std::endl; connection.close(); } Kind regards, Pavel - Original Message - From: Gaston Quezada quezada.gas...@gmail.com To: users@qpid.apache.org Sent: Monday, December 5, 2011 9:14:10 PM Subject: how to delete queue from jms client Hi, Im using qpid-client 0.12, and need delete queue from JMS client. the queue is not auto delete regards -- Gastón Quezada - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:users-subscr...@qpid.apache.org
Re: how to delete queue from jms client
Here's some Java code for method invocation. This largely follows a similar pattern to Pavel's C++ example. Note that this method is taken from a much larger QMF2 API that I've written ,so there's some dependencies on other classes (you won't be able to use it directly, but hopefully you'll get the idea especially with Pavel's code - you shouldn't need to tweak much MethodResult really just wraps a Map - see the QMF2 API specification). My QMF2 API stuff is actually finished, I've been promising to release it for weeks, but I've been writing a number of tools and utilities to demo it so I thought it'd be best to hold off until those are done. /** * Invoke the named method on the named Agent. * * @param agent the Agent to invoke the method on. * @param content an unordered set of key/value pairs comprising the method arguments. * @param replyHandle the correlation handle used to tie asynchronous method requests with responses * @param timeout the time to wait for a reply from the Agent, a value of -1 means use the default timeout * @return the method response Arguments in Map form */ public MethodResult invokeMethod(final Agent agent, final MapString, Object content, final String replyHandle, int timeout) throws QmfException { if (!agent.isActive()) { throw new QmfException(Called invokeMethod() with inactive agent); } String agentName = agent.getName(); timeout = (timeout 1) ? _replyTimeout : timeout; try { Destination destination = (replyHandle == null) ? _replyAddress : _asyncReplyAddress; MapMessage request = _syncSession.createMapMessage(); request.setJMSReplyTo(destination); request.setJMSCorrelationID(replyHandle); request.setStringProperty(x-amqp-0-10.app-id, qmf2); request.setStringProperty(method, request); request.setStringProperty(qmf.opcode, _method_request); request.setStringProperty(qpid.subject, agentName); for (Map.EntryString, Object entry : content.entrySet()) { request.setObject(entry.getKey(), entry.getValue()); } // Wrap request response in synchronized block in case any other threads invoke a request // it would be somewhat unfortunate if their response got interleaved with ours!! synchronized(this) { _requester.send(request); if (replyHandle == null) { // If this is a synchronous request get the response Message response = _responder.receive(timeout*1000); if (response == null) { log.info(No response received in invokeMethod()); throw new QmfException(No response received for Console.invokeMethod()); } MethodResult result = new MethodResult(AMQPMessage.getMap(response)); QmfException exception = result.getQmfException(); if (exception != null) { throw exception; } return result; } } // If this is an asynchronous request return without waiting for a response return null; } catch (JMSException jmse) { log.info(JMSException {} caught in invokeMethod(), jmse.getMessage()); throw new QmfException(jmse.getMessage()); } } Pavel Moravec wrote: Hi Gastón, you can use QMF method delete with parameters type (queue in our case) and name (name of the queue). Here is the code snippet from C++ program I use: Connection connection(url/*, connectionOptions*/); try { connection.open(); Session session = connection.createSession(); Sender sender = session.createSender(qmf.default.direct/broker); Address responseQueue(#reply-queue; {create:always, node:{x-declare:{auto-delete:true}}}); Receiver receiver = session.createReceiver(responseQueue); Message message; Variant::Map content; Variant::Map OID; Variant::Map arguments; OID[_object_name] = org.apache.qpid.broker:broker:amqp-broker; arguments[type] = queue; arguments[name] = queue_name; // a string of the queue name content[_object_id] = OID; content[_method_name] = delete; content[_arguments] = arguments; encode(content, message); message.setReplyTo(responseQueue); message.setProperty(x-amqp-0-10.app-id, qmf2); message.setProperty(qmf.opcode, _method_request); sender.send(message, true); /* check response if the queue was properly deleted */ Message response; if
Re: how to delete queue from jms client
Dear Fraser, I need to configure the auto-delete arguments, with this parameter: arguments:{'qpid.auto_delete_timeout':120} When I create the queue, the logs show a empty field argument. Log: main 2011-12-06 15:45:54,562 DEBUG [apache.qpid.transport.Connection] SEND: [conn:db23f1] ch=0 id=2 QueueDeclare(queue=10.2.60.69-1671711, alternateExchange=, autoDelete=true, arguments={}) Thanks you for your help, 2011/12/6 Fraser Adams fraser.ad...@blueyonder.co.uk Here's some Java code for method invocation. This largely follows a similar pattern to Pavel's C++ example. Note that this method is taken from a much larger QMF2 API that I've written ,so there's some dependencies on other classes (you won't be able to use it directly, but hopefully you'll get the idea especially with Pavel's code - you shouldn't need to tweak much MethodResult really just wraps a Map - see the QMF2 API specification). My QMF2 API stuff is actually finished, I've been promising to release it for weeks, but I've been writing a number of tools and utilities to demo it so I thought it'd be best to hold off until those are done. /** * Invoke the named method on the named Agent. * * @param agent the Agent to invoke the method on. * @param content an unordered set of key/value pairs comprising the method arguments. * @param replyHandle the correlation handle used to tie asynchronous method requests with responses * @param timeout the time to wait for a reply from the Agent, a value of -1 means use the default timeout * @return the method response Arguments in Map form */ public MethodResult invokeMethod(final Agent agent, final MapString, Object content, final String replyHandle, int timeout) throws QmfException { if (!agent.isActive()) { throw new QmfException(Called invokeMethod() with inactive agent); } String agentName = agent.getName(); timeout = (timeout 1) ? _replyTimeout : timeout; try { Destination destination = (replyHandle == null) ? _replyAddress : _asyncReplyAddress; MapMessage request = _syncSession.createMapMessage(**); request.setJMSReplyTo(**destination); request.setJMSCorrelationID(**replyHandle); request.setStringProperty(x-**amqp-0-10.app-id, qmf2); request.setStringProperty(**method, request); request.setStringProperty(**qmf.opcode, _method_request); request.setStringProperty(**qpid.subject, agentName); for (Map.EntryString, Object entry : content.entrySet()) { request.setObject(entry.**getKey(), entry.getValue()); } // Wrap request response in synchronized block in case any other threads invoke a request // it would be somewhat unfortunate if their response got interleaved with ours!! synchronized(this) { _requester.send(request); if (replyHandle == null) { // If this is a synchronous request get the response Message response = _responder.receive(timeout***1000); if (response == null) { log.info(No response received in invokeMethod()); throw new QmfException(No response received for Console.invokeMethod()); } MethodResult result = new MethodResult(AMQPMessage.** getMap(response)); QmfException exception = result.getQmfException(); if (exception != null) { throw exception; } return result; } } // If this is an asynchronous request return without waiting for a response return null; } catch (JMSException jmse) { log.info(JMSException {} caught in invokeMethod(), jmse.getMessage()); throw new QmfException(jmse.getMessage()**); } } Pavel Moravec wrote: Hi Gastón, you can use QMF method delete with parameters type (queue in our case) and name (name of the queue). Here is the code snippet from C++ program I use: Connection connection(url/*, connectionOptions*/); try { connection.open(); Session session = connection.createSession(); Sender sender = session.createSender(qmf.** default.direct/broker); Address responseQueue(#reply-queue; {create:always, node:{x-declare:{auto-delete:**true}}}); Receiver receiver = session.createReceiver(**responseQueue); Message message; Variant::Map content; Variant::Map OID; Variant::Map arguments; OID[_object_name] = org.apache.qpid.broker:** broker:amqp-broker; arguments[type] = queue; arguments[name] = queue_name; // a string of the
Re: how to delete queue from jms client
Hi Gaston, Try the following syntax (BTW IIRC you need at least Qpid 0.10 for timed auto deletes to work): Also I can't claim credit for the following, this was a response from uber-guru Gordon Sim when I asked a similar question back in July To create a 'shared' queue on-demand: my-queue; {create: always, node:{x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':120 To create a subscription queue with the same properties: my-exchange; {link:{name:my-subscription, x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':120 Unfortunately the x-declare stuff isn't well documented. I'm not aware of the above being documented anywhere, perhaps Gordon knows of a location? There's some useful docs for x-declare here https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP but it's quite hard to find and doesn't really illustrate that you still need the auto-delete:True bit, which is possibly something you've missed? That's about the limit of my knowledge.. HTH, Frase Gaston Quezada wrote: Dear Fraser, I need to configure the auto-delete arguments, with this parameter: arguments:{'qpid.auto_delete_timeout':120} When I create the queue, the logs show a empty field argument. Log: main 2011-12-06 tel:2011-12-06 15:45:54,562 DEBUG [apache.qpid.transport.Connection] SEND: [conn:db23f1] ch=0 id=2 QueueDeclare(queue=10.2.60.69-1671711, alternateExchange=, autoDelete=true, arguments={}) Thanks you for your help, 2011/12/6 Fraser Adams fraser.ad...@blueyonder.co.uk mailto:fraser.ad...@blueyonder.co.uk Here's some Java code for method invocation. This largely follows a similar pattern to Pavel's C++ example. Note that this method is taken from a much larger QMF2 API that I've written ,so there's some dependencies on other classes (you won't be able to use it directly, but hopefully you'll get the idea especially with Pavel's code - you shouldn't need to tweak much MethodResult really just wraps a Map - see the QMF2 API specification). My QMF2 API stuff is actually finished, I've been promising to release it for weeks, but I've been writing a number of tools and utilities to demo it so I thought it'd be best to hold off until those are done. /** * Invoke the named method on the named Agent. * * @param agent the Agent to invoke the method on. * @param content an unordered set of key/value pairs comprising the method arguments. * @param replyHandle the correlation handle used to tie asynchronous method requests with responses * @param timeout the time to wait for a reply from the Agent, a value of -1 means use the default timeout * @return the method response Arguments in Map form */ public MethodResult invokeMethod(final Agent agent, final MapString, Object content, final String replyHandle, int timeout) throws QmfException { if (!agent.isActive()) { throw new QmfException(Called invokeMethod() with inactive agent); } String agentName = agent.getName(); timeout = (timeout 1) ? _replyTimeout : timeout; try { Destination destination = (replyHandle == null) ? _replyAddress : _asyncReplyAddress; MapMessage request = _syncSession.createMapMessage(); request.setJMSReplyTo(destination); request.setJMSCorrelationID(replyHandle); request.setStringProperty(x-amqp-0-10.app-id, qmf2); request.setStringProperty(method, request); request.setStringProperty(qmf.opcode, _method_request); request.setStringProperty(qpid.subject, agentName); for (Map.EntryString, Object entry : content.entrySet()) { request.setObject(entry.getKey(), entry.getValue()); } // Wrap request response in synchronized block in case any other threads invoke a request // it would be somewhat unfortunate if their response got interleaved with ours!! synchronized(this) { _requester.send(request); if (replyHandle == null) { // If this is a synchronous request get the response Message response = _responder.receive(timeout*1000); if (response == null) { log.info http://log.info(No response received in invokeMethod()); throw new QmfException(No response received for Console.invokeMethod()); } MethodResult result = new MethodResult(AMQPMessage.getMap(response)); QmfException exception = result.getQmfException(); if
Re: how to delete queue from jms client
Gaston, I forgot to ask, but you are using the C++ broker aren't you? I'm pretty sure that the Java broker doesn't support timed auto delete, and as I mentioned before the C++ broker supports this from version 0.10 Frase Fraser Adams wrote: Hi Gaston, Try the following syntax (BTW IIRC you need at least Qpid 0.10 for timed auto deletes to work): Also I can't claim credit for the following, this was a response from uber-guru Gordon Sim when I asked a similar question back in July To create a 'shared' queue on-demand: my-queue; {create: always, node:{x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':120 To create a subscription queue with the same properties: my-exchange; {link:{name:my-subscription, x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':120 Unfortunately the x-declare stuff isn't well documented. I'm not aware of the above being documented anywhere, perhaps Gordon knows of a location? There's some useful docs for x-declare here https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP but it's quite hard to find and doesn't really illustrate that you still need the auto-delete:True bit, which is possibly something you've missed? That's about the limit of my knowledge.. HTH, Frase Gaston Quezada wrote: Dear Fraser, I need to configure the auto-delete arguments, with this parameter: arguments:{'qpid.auto_delete_timeout':120} When I create the queue, the logs show a empty field argument. Log: main 2011-12-06 tel:2011-12-06 15:45:54,562 DEBUG [apache.qpid.transport.Connection] SEND: [conn:db23f1] ch=0 id=2 QueueDeclare(queue=10.2.60.69-1671711, alternateExchange=, autoDelete=true, arguments={}) Thanks you for your help, 2011/12/6 Fraser Adams fraser.ad...@blueyonder.co.uk mailto:fraser.ad...@blueyonder.co.uk Here's some Java code for method invocation. This largely follows a similar pattern to Pavel's C++ example. Note that this method is taken from a much larger QMF2 API that I've written ,so there's some dependencies on other classes (you won't be able to use it directly, but hopefully you'll get the idea especially with Pavel's code - you shouldn't need to tweak much MethodResult really just wraps a Map - see the QMF2 API specification). My QMF2 API stuff is actually finished, I've been promising to release it for weeks, but I've been writing a number of tools and utilities to demo it so I thought it'd be best to hold off until those are done. /** * Invoke the named method on the named Agent. * * @param agent the Agent to invoke the method on. * @param content an unordered set of key/value pairs comprising the method arguments. * @param replyHandle the correlation handle used to tie asynchronous method requests with responses * @param timeout the time to wait for a reply from the Agent, a value of -1 means use the default timeout * @return the method response Arguments in Map form */ public MethodResult invokeMethod(final Agent agent, final MapString, Object content, final String replyHandle, int timeout) throws QmfException { if (!agent.isActive()) { throw new QmfException(Called invokeMethod() with inactive agent); } String agentName = agent.getName(); timeout = (timeout 1) ? _replyTimeout : timeout; try { Destination destination = (replyHandle == null) ? _replyAddress : _asyncReplyAddress; MapMessage request = _syncSession.createMapMessage(); request.setJMSReplyTo(destination); request.setJMSCorrelationID(replyHandle); request.setStringProperty(x-amqp-0-10.app-id, qmf2); request.setStringProperty(method, request); request.setStringProperty(qmf.opcode, _method_request); request.setStringProperty(qpid.subject, agentName); for (Map.EntryString, Object entry : content.entrySet()) { request.setObject(entry.getKey(), entry.getValue()); } // Wrap request response in synchronized block in case any other threads invoke a request // it would be somewhat unfortunate if their response got interleaved with ours!! synchronized(this) { _requester.send(request); if (replyHandle == null) { // If this is a synchronous request get the response Message response = _responder.receive(timeout*1000); if (response == null) { log.info http://log.info(No response received in invokeMethod()); throw new QmfException(No response received