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
Map<String, 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.Entry<String, 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 (receiver.fetch(response,qpid::messaging::Duration(30000)) == 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" <[email protected]>
To: [email protected]
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:[email protected]
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]