Quantcast

Pure JMS management

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Pure JMS management

gnodet
I'm trying do perform management operation with pure JMS api.
To retrieve the list of queues, I'm currently using the following code:

QueueSession session = ((QueueConnection)
connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue managementQueue = session.createQueue("activemq.management");
QueueRequestor requestor = new QueueRequestor(session, managementQueue);
connection.start();
TextMessage m = session.createTextMessage();
m.setStringProperty("_AMQ_ResourceName", "broker");
m.setStringProperty("_AMQ_OperationName", "getQueueNames");
m.setText("[\"" + routing + "\"]");
Message reply = requestor.request(m);
Class<?> mgmtHelperClass =
connection.getClass().getClassLoader().loadClass("org.apache.activemq.artemis.api.jms.management.JMSManagementHelper");
Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
Message.class);
Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
List<String> names = new ArrayList<>();
for (Object o : (Object[]) (results[0])) {
    names.add(o.toString());
}
return names;


It works, but I think I should not have to use reflection to access the
result message, hence the use of reflection to access the
JMSManagementHelper methods.
It seems to me the reply should be of type TextMessage, but it's currently
untyped, so I can't use TextMessage#getText to retrieve the json result,
and I can't find a way to retrieve it another way.
Do I miss anything ?

--
------------------------
Guillaume Nodet
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Pure JMS management

Tim Bain
This is in Artemis?

On May 18, 2017 4:23 PM, "Guillaume Nodet" <[hidden email]> wrote:

> I'm trying do perform management operation with pure JMS api.
> To retrieve the list of queues, I'm currently using the following code:
>
> QueueSession session = ((QueueConnection)
> connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
> Queue managementQueue = session.createQueue("activemq.management");
> QueueRequestor requestor = new QueueRequestor(session, managementQueue);
> connection.start();
> TextMessage m = session.createTextMessage();
> m.setStringProperty("_AMQ_ResourceName", "broker");
> m.setStringProperty("_AMQ_OperationName", "getQueueNames");
> m.setText("[\"" + routing + "\"]");
> Message reply = requestor.request(m);
> Class<?> mgmtHelperClass =
> connection.getClass().getClassLoader().loadClass("
> org.apache.activemq.artemis.api.jms.management.JMSManagementHelper");
> Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
> Message.class);
> Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
> List<String> names = new ArrayList<>();
> for (Object o : (Object[]) (results[0])) {
>     names.add(o.toString());
> }
> return names;
>
>
> It works, but I think I should not have to use reflection to access the
> result message, hence the use of reflection to access the
> JMSManagementHelper methods.
> It seems to me the reply should be of type TextMessage, but it's currently
> untyped, so I can't use TextMessage#getText to retrieve the json result,
> and I can't find a way to retrieve it another way.
> Do I miss anything ?
>
> --
> ------------------------
> Guillaume Nodet
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Pure JMS management

clebertsuconic
In reply to this post by gnodet
@Tim Bain: yes.. Artemis from what I see on the class Names (I also
spoke to him gnodet on the IRC channel earlier today).

@gnodet: I am not understanding why you would need to use reflection.
You can just simply use JMSManagementHelper directly. they are all
static methods...


This example here, part of distribution under
examples/features/standard/management shows how it was intended to be
used:


https://github.com/apache/activemq-artemis/blob/master/examples/features/standard/management/src/main/java/org/apache/activemq/artemis/jms/example/ManagementExample.java



Maybe I"m misunderstanding your question?

On Thu, May 18, 2017 at 6:23 PM, Guillaume Nodet <[hidden email]> wrote:

> I'm trying do perform management operation with pure JMS api.
> To retrieve the list of queues, I'm currently using the following code:
>
> QueueSession session = ((QueueConnection)
> connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
> Queue managementQueue = session.createQueue("activemq.management");
> QueueRequestor requestor = new QueueRequestor(session, managementQueue);
> connection.start();
> TextMessage m = session.createTextMessage();
> m.setStringProperty("_AMQ_ResourceName", "broker");
> m.setStringProperty("_AMQ_OperationName", "getQueueNames");
> m.setText("[\"" + routing + "\"]");
> Message reply = requestor.request(m);
> Class<?> mgmtHelperClass =
> connection.getClass().getClassLoader().loadClass("org.apache.activemq.artemis.api.jms.management.JMSManagementHelper");
> Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
> Message.class);
> Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
> List<String> names = new ArrayList<>();
> for (Object o : (Object[]) (results[0])) {
>     names.add(o.toString());
> }
> return names;
>
>
> It works, but I think I should not have to use reflection to access the
> result message, hence the use of reflection to access the
> JMSManagementHelper methods.
> It seems to me the reply should be of type TextMessage, but it's currently
> untyped, so I can't use TextMessage#getText to retrieve the json result,
> and I can't find a way to retrieve it another way.
> Do I miss anything ?
>
> --
> ------------------------
> Guillaume Nodet



--
Clebert Suconic
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Pure JMS management

gnodet
I'm enhancing a layer in OSGi to support Artemis, and I'd like to avoid
adding package dependencies.
That's why I'm using the connection's classloader to load the needed class,
as it's not available from the class which defines this code.

To refine my question further: could the reply be typed as a text message
rather than not typed ? This would allow retrieving the json body as a
string.
Basically, I'm proposing the following patch:

*---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*

*+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*

@@ -370,6 +370,7 @@ public class ManagementServiceImpl implements
ManagementService {

       message = message.toCore();

       // a reply message is sent with the result stored in the message
body.

       CoreMessage reply = new CoreMessage(storageManager.generateID(),
512);

+      reply.setType(Message.TEXT_TYPE);

       reply.setReplyTo(message.getReplyTo());



       String resourceName =
message.getStringProperty(ManagementHelper.HDR_RESOURCE_NAME);


2017-05-19 3:10 GMT+02:00 Clebert Suconic <[hidden email]>:

> @Tim Bain: yes.. Artemis from what I see on the class Names (I also
> spoke to him gnodet on the IRC channel earlier today).
>
> @gnodet: I am not understanding why you would need to use reflection.
> You can just simply use JMSManagementHelper directly. they are all
> static methods...
>
>
> This example here, part of distribution under
> examples/features/standard/management shows how it was intended to be
> used:
>
>
> https://github.com/apache/activemq-artemis/blob/master/examp
> les/features/standard/management/src/main/java/org/apache/
> activemq/artemis/jms/example/ManagementExample.java
>
>
>
> Maybe I"m misunderstanding your question?
>
> On Thu, May 18, 2017 at 6:23 PM, Guillaume Nodet <[hidden email]>
> wrote:
> > I'm trying do perform management operation with pure JMS api.
> > To retrieve the list of queues, I'm currently using the following code:
> >
> > QueueSession session = ((QueueConnection)
> > connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
> > Queue managementQueue = session.createQueue("activemq.management");
> > QueueRequestor requestor = new QueueRequestor(session, managementQueue);
> > connection.start();
> > TextMessage m = session.createTextMessage();
> > m.setStringProperty("_AMQ_ResourceName", "broker");
> > m.setStringProperty("_AMQ_OperationName", "getQueueNames");
> > m.setText("[\"" + routing + "\"]");
> > Message reply = requestor.request(m);
> > Class<?> mgmtHelperClass =
> > connection.getClass().getClassLoader().loadClass("org.
> apache.activemq.artemis.api.jms.management.JMSManagementHelper");
> > Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
> > Message.class);
> > Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
> > List<String> names = new ArrayList<>();
> > for (Object o : (Object[]) (results[0])) {
> >     names.add(o.toString());
> > }
> > return names;
> >
> >
> > It works, but I think I should not have to use reflection to access the
> > result message, hence the use of reflection to access the
> > JMSManagementHelper methods.
> > It seems to me the reply should be of type TextMessage, but it's
> currently
> > untyped, so I can't use TextMessage#getText to retrieve the json result,
> > and I can't find a way to retrieve it another way.
> > Do I miss anything ?
> >
> > --
> > ------------------------
> > Guillaume Nodet
>
>
>
> --
> Clebert Suconic
>



--
------------------------
Guillaume Nodet
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Pure JMS management

gnodet
It seems to work well for me.
I'll run a full build and will create a PR.

2017-05-19 8:03 GMT+02:00 Guillaume Nodet <[hidden email]>:

> I'm enhancing a layer in OSGi to support Artemis, and I'd like to avoid
> adding package dependencies.
> That's why I'm using the connection's classloader to load the needed
> class, as it's not available from the class which defines this code.
>
> To refine my question further: could the reply be typed as a text message
> rather than not typed ? This would allow retrieving the json body as a
> string.
> Basically, I'm proposing the following patch:
>
> *---
> a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*
>
> *+++
> b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*
>
> @@ -370,6 +370,7 @@ public class ManagementServiceImpl implements
> ManagementService {
>
>        message = message.toCore();
>
>        // a reply message is sent with the result stored in the message
> body.
>
>        CoreMessage reply = new CoreMessage(storageManager.generateID(),
> 512);
>
> +      reply.setType(Message.TEXT_TYPE);
>
>        reply.setReplyTo(message.getReplyTo());
>
>
>
>        String resourceName = message.getStringProperty(
> ManagementHelper.HDR_RESOURCE_NAME);
>
>
> 2017-05-19 3:10 GMT+02:00 Clebert Suconic <[hidden email]>:
>
>> @Tim Bain: yes.. Artemis from what I see on the class Names (I also
>> spoke to him gnodet on the IRC channel earlier today).
>>
>> @gnodet: I am not understanding why you would need to use reflection.
>> You can just simply use JMSManagementHelper directly. they are all
>> static methods...
>>
>>
>> This example here, part of distribution under
>> examples/features/standard/management shows how it was intended to be
>> used:
>>
>>
>> https://github.com/apache/activemq-artemis/blob/master/examp
>> les/features/standard/management/src/main/java/org/apache/ac
>> tivemq/artemis/jms/example/ManagementExample.java
>>
>>
>>
>> Maybe I"m misunderstanding your question?
>>
>> On Thu, May 18, 2017 at 6:23 PM, Guillaume Nodet <[hidden email]>
>> wrote:
>> > I'm trying do perform management operation with pure JMS api.
>> > To retrieve the list of queues, I'm currently using the following code:
>> >
>> > QueueSession session = ((QueueConnection)
>> > connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
>> > Queue managementQueue = session.createQueue("activemq.management");
>> > QueueRequestor requestor = new QueueRequestor(session, managementQueue);
>> > connection.start();
>> > TextMessage m = session.createTextMessage();
>> > m.setStringProperty("_AMQ_ResourceName", "broker");
>> > m.setStringProperty("_AMQ_OperationName", "getQueueNames");
>> > m.setText("[\"" + routing + "\"]");
>> > Message reply = requestor.request(m);
>> > Class<?> mgmtHelperClass =
>> > connection.getClass().getClassLoader().loadClass("org.apache
>> .activemq.artemis.api.jms.management.JMSManagementHelper");
>> > Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
>> > Message.class);
>> > Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
>> > List<String> names = new ArrayList<>();
>> > for (Object o : (Object[]) (results[0])) {
>> >     names.add(o.toString());
>> > }
>> > return names;
>> >
>> >
>> > It works, but I think I should not have to use reflection to access the
>> > result message, hence the use of reflection to access the
>> > JMSManagementHelper methods.
>> > It seems to me the reply should be of type TextMessage, but it's
>> currently
>> > untyped, so I can't use TextMessage#getText to retrieve the json result,
>> > and I can't find a way to retrieve it another way.
>> > Do I miss anything ?
>> >
>> > --
>> > ------------------------
>> > Guillaume Nodet
>>
>>
>>
>> --
>> Clebert Suconic
>>
>
>
>
> --
> ------------------------
> Guillaume Nodet
>
>


--
------------------------
Guillaume Nodet
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Pure JMS management

clebertsuconic
Create a JIRA as well.  Thanks.
On Fri, May 19, 2017 at 2:21 AM Guillaume Nodet <[hidden email]> wrote:

> It seems to work well for me.
> I'll run a full build and will create a PR.
>
> 2017-05-19 8:03 GMT+02:00 Guillaume Nodet <[hidden email]>:
>
> > I'm enhancing a layer in OSGi to support Artemis, and I'd like to avoid
> > adding package dependencies.
> > That's why I'm using the connection's classloader to load the needed
> > class, as it's not available from the class which defines this code.
> >
> > To refine my question further: could the reply be typed as a text message
> > rather than not typed ? This would allow retrieving the json body as a
> > string.
> > Basically, I'm proposing the following patch:
> >
> > *---
> >
> a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*
> >
> > *+++
> >
> b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java*
> >
> > @@ -370,6 +370,7 @@ public class ManagementServiceImpl implements
> > ManagementService {
> >
> >        message = message.toCore();
> >
> >        // a reply message is sent with the result stored in the message
> > body.
> >
> >        CoreMessage reply = new CoreMessage(storageManager.generateID(),
> > 512);
> >
> > +      reply.setType(Message.TEXT_TYPE);
> >
> >        reply.setReplyTo(message.getReplyTo());
> >
> >
> >
> >        String resourceName = message.getStringProperty(
> > ManagementHelper.HDR_RESOURCE_NAME);
> >
> >
> > 2017-05-19 3:10 GMT+02:00 Clebert Suconic <[hidden email]>:
> >
> >> @Tim Bain: yes.. Artemis from what I see on the class Names (I also
> >> spoke to him gnodet on the IRC channel earlier today).
> >>
> >> @gnodet: I am not understanding why you would need to use reflection.
> >> You can just simply use JMSManagementHelper directly. they are all
> >> static methods...
> >>
> >>
> >> This example here, part of distribution under
> >> examples/features/standard/management shows how it was intended to be
> >> used:
> >>
> >>
> >> https://github.com/apache/activemq-artemis/blob/master/examp
> >> les/features/standard/management/src/main/java/org/apache/ac
> >> tivemq/artemis/jms/example/ManagementExample.java
> >>
> >>
> >>
> >> Maybe I"m misunderstanding your question?
> >>
> >> On Thu, May 18, 2017 at 6:23 PM, Guillaume Nodet <[hidden email]>
> >> wrote:
> >> > I'm trying do perform management operation with pure JMS api.
> >> > To retrieve the list of queues, I'm currently using the following
> code:
> >> >
> >> > QueueSession session = ((QueueConnection)
> >> > connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
> >> > Queue managementQueue = session.createQueue("activemq.management");
> >> > QueueRequestor requestor = new QueueRequestor(session,
> managementQueue);
> >> > connection.start();
> >> > TextMessage m = session.createTextMessage();
> >> > m.setStringProperty("_AMQ_ResourceName", "broker");
> >> > m.setStringProperty("_AMQ_OperationName", "getQueueNames");
> >> > m.setText("[\"" + routing + "\"]");
> >> > Message reply = requestor.request(m);
> >> > Class<?> mgmtHelperClass =
> >> > connection.getClass().getClassLoader().loadClass("org.apache
> >> .activemq.artemis.api.jms.management.JMSManagementHelper");
> >> > Method getResultsMethod = mgmtHelperClass.getMethod("getResults",
> >> > Message.class);
> >> > Object[] results = (Object[]) getResultsMethod.invoke(null, reply);
> >> > List<String> names = new ArrayList<>();
> >> > for (Object o : (Object[]) (results[0])) {
> >> >     names.add(o.toString());
> >> > }
> >> > return names;
> >> >
> >> >
> >> > It works, but I think I should not have to use reflection to access
> the
> >> > result message, hence the use of reflection to access the
> >> > JMSManagementHelper methods.
> >> > It seems to me the reply should be of type TextMessage, but it's
> >> currently
> >> > untyped, so I can't use TextMessage#getText to retrieve the json
> result,
> >> > and I can't find a way to retrieve it another way.
> >> > Do I miss anything ?
> >> >
> >> > --
> >> > ------------------------
> >> > Guillaume Nodet
> >>
> >>
> >>
> >> --
> >> Clebert Suconic
> >>
> >
> >
> >
> > --
> > ------------------------
> > Guillaume Nodet
> >
> >
>
>
> --
> ------------------------
> Guillaume Nodet
>
--
Clebert Suconic
Loading...