-
1. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 9, 2013 6:24 PM (in response to njay)Any help ??
-
2. Re: HornetQ support for REST API in JBoss 7 Embedded mode
jbertram Jan 9, 2013 6:42 PM (in response to njay)What is the stack trace of the NPE?
-
3. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 10, 2013 10:51 AM (in response to jbertram)This is what I did
1. Creates web.xml per documentation and deployed in JBoss 7.1.2
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>Hornetq RestEasy Webservice</display-name>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<listener>
<listener-class>org.hornetq.rest.integration.RestMessagingBootstrapListener</listener-class>
</listener>
<filter>
<filter-name>Rest-Messaging</filter-name>
<filter-class>org.jboss.resteasy.plugins.server.servlet.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>Rest-Messaging</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2. JBoss 7.1.2 Embedded HornetQ has this entry to start the queue
<jms-queue name="testQueue">
<entry name="queue/test"/>
<entry name="java:jboss/exported/jms/queue/test"/>
</jms-queue>
3. Wrote Simple JAva class to send a meesage to the "test" queue. (Please see the above code for the URI ClientRequest request = new ClientRequest("http://localhost:8080/queues/queue.test");
4. NPE stack trace is
log4j:WARN No appenders could be found for logger (org.jboss.resteasy.plugins.providers.DocumentProvider).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
java.lang.NullPointerException
Send xml...
at com.example.com.hornetq71.test.RestSend.main(RestSend.java:29)
Is My understanding/approach correct ?.
-
4. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 11, 2013 4:18 PM (in response to njay)Justin - Any help ?
Thanks
-
5. Re: HornetQ support for REST API in JBoss 7 Embedded mode
jbertram Jan 11, 2013 6:12 PM (in response to njay)It looks to me like you're simply using the wrong URL.
First of all, unless you've configured this WAR to be at the root context then the URL will have the WAR's context. For example, if the WAR was named "hornetq-rest.war" then the URL would be http://localhost:8080/hornetq-rest/queues/{name}. That's basic Java EE web application practice.
Also, the queue name you're using isn't correct. If you deploy a jms-queue with a name of "testQueue" then the name of the queue you would use is "jms.queue.testQueue". In the end your URL would look like this:
http://localhost:8080/hornetq-rest/queues/jms.queue.testQueue
I'll try to update the documentation so this is more clear.
-
6. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 15, 2013 4:44 PM (in response to jbertram)Thanks for the clarification. The code executed with no error
try {
String msgStr = "<Orders> " +
" <order_no>123</order_no> " +
" <total_amount>99.99</total_amount> " +
" </Orders>";
ClientRequest request = new ClientRequest("http://localhost:8080/hornetq_web_service/queues/jms.queue.testQueue");
request.body("application/xml", msgStr);
ClientResponse res = request.head();
Link create = res.getHeaderAsLink("msg-create");
res = create.request().body("application/xml", msgStr).post();
if (res.getStatus() != 201)
throw new RuntimeException("Failed to post");
System.out.println("Message Sent");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
But when I try to consume the message through JMS code, I did not get anything.
Also, When I tried to consume the message through below code
{
ClientRequest request = new ClientRequest("http://localhost:8080/hornetq_web_service/queues/jms.queue.testQueue");
MediaType mediaType=MediaType.APPLICATION_XML_TYPE;
request.accept(mediaType);
ClientResponse res = request.head();
Link pullConsumers = res.getHeaderAsLink("msg-pull-consumers");
res = pullConsumers.request().formParameter("autoAck", "false").post();
Link ackNext = res.getHeaderAsLink("msg-acknowledge-next");
while (true)
{
System.out.println("Waiting...");
res = ackNext.request()
.header("Accept-Wait", "10")
.header("Accept", "application/xml")
.post();
if (res.getStatus() == 503)
{
System.out.println("Timeout...");
ackNext = res.getHeaderAsLink("msg-acknowledge-next");
}
else if (res.getStatus() == 200)
{
Link ack = res.getHeaderAsLink("msg-acknowledgement");
res = ack.request().formParameter("acknowledge", "true").post();
ackNext = res.getHeaderAsLink("msg-acknowledge-next");
}
else
{
throw new RuntimeException("Failure! " + res.getStatus());
}
}
}
any idea where am I making mistake ?
-
7. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 22, 2013 1:12 PM (in response to njay)Justin - Can you please provide some insight into the issue ?
Thanks
-
8. Re: HornetQ support for REST API in JBoss 7 Embedded mode
jbertram Jan 23, 2013 5:32 PM (in response to njay)I don't know exactly why your client is failing, but this simple app works for me:
package com.example.AS7RestHornetQClient; import org.jboss.resteasy.client.ClientRequest; import org.jboss.resteasy.client.ClientResponse; import org.jboss.resteasy.spi.Link; public class SimpleRESTClient { public static final String MSG_ACKNOWLEDGE_NEXT = "msg-acknowledge-next"; public static final String MSG_PULL_CONSUMERS = "msg-pull-consumers"; public static final String MSG_ACKNOWLEDGEMENT = "msg-acknowledgement"; public static final String MSG_CREATE = "msg-create"; public static void main(String[] args) throws Exception { ClientRequest request = new ClientRequest("http://localhost:8080/queues/jms.queue.testQueue"); ClientResponse res = request.head(); res.releaseConnection(); Link msg_create = res.getHeaderAsLink(MSG_CREATE); Link msg_pull_consumers = res.getHeaderAsLink(MSG_PULL_CONSUMERS); System.out.println(MSG_CREATE + ": " + res.getStatus()); res = msg_create.request().body("application/xml", "abc").post(); res.releaseConnection(); if (res.getResponseStatus().getStatusCode() != 201) { throw new RuntimeException("Failed to post"); } Link location = null; try { res = msg_pull_consumers.request().formParameter("autoAck", "false").post(); res.releaseConnection(); System.out.println(MSG_PULL_CONSUMERS + ": " + res.getStatus()); location = res.getLocation(); Link msg_acknowledge_next = res.getHeaderAsLink(MSG_ACKNOWLEDGE_NEXT); res = msg_acknowledge_next.request().header("Accept-Wait", "30").header("Accept", "application/xml").post(); res.releaseConnection(); System.out.println(MSG_ACKNOWLEDGE_NEXT + ": " + res.getStatus()); Link ack = res.getHeaderAsLink(MSG_ACKNOWLEDGEMENT); res = ack.request().formParameter("acknowledge", "true").post(); res.releaseConnection(); System.out.println(MSG_ACKNOWLEDGEMENT + ": " + res.getStatus()); } finally { if (location != null) { res = location.request().delete(); res.releaseConnection(); System.out.println("Delete consumer: " + res.getStatus()); } } } }
I know for sure that your client isn't cleaning up its consumers which is a big no-no.
-
9. Re: HornetQ support for REST API in JBoss 7 Embedded mode
njay Jan 30, 2013 10:47 AM (in response to jbertram)Thanks Justin. This helped me a lot to clear some of misundrstanding on the concept. This worked for me. Thanks again.