You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Alex Dean <ad...@meteostar.com> on 2010/07/07 21:24:16 UTC

help with ajax

Hello.  I'm trying out the ActiveMQ ajax messaging described at http://activemq.apache.org/ajax.html 
.

I am able to send messages to a topic using this code:
  <script type="text/javascript" src="/amq/amq.js"></script>
  <script>
    amq.uri='/amq';
    amq.sendMessage('topic://MY.DEMO', "<message item='hello again x'/ 
 >");
  </script>

When I run that snippet, I see (in the ActiveMQ admin application)  
that the topic gets created and that the 'Messages Enqueued' value  
goes to '1'.

Next, I try to subscribe to the topic using the following Javascript  
(in a separate web page):
  <script type="text/javascript" src="/amq/amq.js"></script>
  <script>
    amq.uri='/amq';

    myHandler = {
      rcvMessage: function(message) {
        console.log( 'got message' );
      }
    };
    amq.addListener('test_subscriber','topic://MY.DEMO',  
myHandler.rcvMessage );
  </script>

When I run this, I see the 'Number of Consumers' go to '1' in the  
admin application.  Using Firebug, I see amq.js performing a POST like  
'destination=topic://MY.DEMO&message=test_subscriber&type=listen'.   
This seems to be as expected based on the tutorial.  I then see amq.js  
perform a series of GET requests.  The first is 'https://localhost:7998/amq?timeout=10&_=' 
, and successive GETs are 'https://localhost:7998/amq'.

All of these GETs are returned with empty responses, like '<ajax- 
response></ajax-response>'.  The first one appears to return  
immediately, and the subsequent GETs time out after maybe 20-30 seconds.

When I next publish a new message to the topic, the 'Number of  
Consumers' immediately goes to '0'.  The consumer's current GET  
request doesn't appear to return at this time, rather it seems to time  
out just like the others.  (I expected that ActiveMQ would return the  
message to the consumer as soon as it was available, and then close  
the connection.)

I noticed the following snippet from the logs from around the time a  
message was published (while the consumer was active):
jvm 1    | DEBUG | Sent <message item='hello again x'/> to topic:// 
MY.DEMO
jvm 1    | DEBUG | RESPONSE /demo/amq  200
jvm 1    | DEBUG | message for ActiveMQMessageConsumer  
{ value=ID:rutabaga.local-63558-1278527484508-2:1:1:1,  
started=true }continuation=null
jvm 1    | DEBUG | localhost removing consumer:  
ID:rutabaga.local-63558-1278527484508-2:1:1:1 for destination: topic:// 
MY.DEMO

I have 2 questions at the moment:
1. Why does my consumer not receive the messages published to the topic?
2. Why is my consumer unsubscribed when a message is sent?

Any help is appreciated.

regards,
alex

My environment:
Mac OSX 10.5.6
ActiveMQ 5.3.2

java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22- 
b03-333-9M3125)
Java HotSpot(TM) Client VM (build 1.5.0_22-147, mixed mode, sharing)

Apache is listening on port 7998.
Apache is proxying requests to ActiveMQ using the directive  
'ProxyPass /amq http://localhost:8161/demo/amq'

Re: help with ajax

Posted by Dejan Bosanac <de...@nighttale.net>.
Hi Alex,

glad to hear that and thanks for sharing your findings back.

Cheers
--
Dejan Bosanac - http://twitter.com/dejanb

Open Source Integration - http://fusesource.com/
ActiveMQ in Action - http://www.manning.com/snyder/
Blog - http://www.nighttale.net



On Fri, Jul 9, 2010 at 3:58 PM, Alex Dean <ad...@meteostar.com> wrote:
> I've discovered my problem stems from Apache's proxy configuration, not from
> ActiveMQ itself.
>
> When I loaded the HTML test page directly from ActiveMQ/Jetty, rather than
> from Apache, the example ajax scripts worked perfectly.  They only failed
> when I loaded the HTML from Apache, and let Apache proxy my ajax requests
> back to ActiveMQ.
>
> I think the problem was that the JSESSIONID cookie was not being modified
> correctly.  ActiveMQ set the cookie for 'path=/demo', while the URL which
> was seen by clients was /amq.  So on subsequent requests, the client would
> not send the cookie back to the server.  I'm not sure what the role of this
> cookie (and session) are inside ActiveMQ, but once I configured Apache to
> rewrite the cookie path correctly, I was able to start receiving messages
> via ajax through the proxy.
>
> This is the Apache configuration which worked for me:
>  ProxyRequests Off
>  ProxyPass /amq http://localhost:8161/demo
>  ProxyPassReverse /amq http://localhost:8161/demo
>  ProxyPassReverseCookiePath /demo /amq
> http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse
>
> My JavaScript uses "amq.uri = '/amq/amq'", so requests for
> 'http://localhost/amq/amq' are proxied back to
> 'http://localhost:8161/demo/amq'.  Cookies returned by ActiveMQ with
> 'path=/demo' are rewritten by Apache, so the client sees 'path=/amq'.
>
> alex
>
> On Jul 8, 2010, at 5:12 AM, Dejan Bosanac wrote:
>
>> Hi,
>>
>> can you test the snapshot. There are some refactoring in those areas
>> lately.
>>
>> Also, try using the modified client side API, like show here
>>
>>
>> http://fisheye6.atlassian.com/browse/activemq/trunk/activemq-web-demo/src/main/webapp/test/subscribe_send.html?r=HEAD
>>
>> BTW. messages sent to the topic before you subscribed will not be
>> received by your subscriber. That's just how topics works.
>>
>> Cheers
>> --
>> Dejan Bosanac - http://twitter.com/dejanb
>>
>> Open Source Integration - http://fusesource.com/
>> ActiveMQ in Action - http://www.manning.com/snyder/
>> Blog - http://www.nighttale.net
>>
>>
>>
>> On Wed, Jul 7, 2010 at 9:24 PM, Alex Dean <ad...@meteostar.com> wrote:
>>>
>>> Hello.  I'm trying out the ActiveMQ ajax messaging described at
>>> http://activemq.apache.org/ajax.html.
>>>
>>> I am able to send messages to a topic using this code:
>>>  <script type="text/javascript" src="/amq/amq.js"></script>
>>>  <script>
>>>  amq.uri='/amq';
>>>  amq.sendMessage('topic://MY.DEMO', "<message item='hello again x'/>");
>>>  </script>
>>>
>>> When I run that snippet, I see (in the ActiveMQ admin application) that
>>> the
>>> topic gets created and that the 'Messages Enqueued' value goes to '1'.
>>>
>>> Next, I try to subscribe to the topic using the following Javascript (in
>>> a
>>> separate web page):
>>>  <script type="text/javascript" src="/amq/amq.js"></script>
>>>  <script>
>>>  amq.uri='/amq';
>>>
>>>  myHandler = {
>>>    rcvMessage: function(message) {
>>>      console.log( 'got message' );
>>>    }
>>>  };
>>>  amq.addListener('test_subscriber','topic://MY.DEMO',
>>> myHandler.rcvMessage
>>> );
>>>  </script>
>>>
>>> When I run this, I see the 'Number of Consumers' go to '1' in the admin
>>> application.  Using Firebug, I see amq.js performing a POST like
>>> 'destination=topic://MY.DEMO&message=test_subscriber&type=listen'.  This
>>> seems to be as expected based on the tutorial.  I then see amq.js perform
>>> a
>>> series of GET requests.  The first is
>>> 'https://localhost:7998/amq?timeout=10&_=', and successive GETs are
>>> 'https://localhost:7998/amq'.
>>>
>>> All of these GETs are returned with empty responses, like
>>> '<ajax-response></ajax-response>'.  The first one appears to return
>>> immediately, and the subsequent GETs time out after maybe 20-30 seconds.
>>>
>>> When I next publish a new message to the topic, the 'Number of Consumers'
>>> immediately goes to '0'.  The consumer's current GET request doesn't
>>> appear
>>> to return at this time, rather it seems to time out just like the others.
>>>  (I expected that ActiveMQ would return the message to the consumer as
>>> soon
>>> as it was available, and then close the connection.)
>>>
>>> I noticed the following snippet from the logs from around the time a
>>> message
>>> was published (while the consumer was active):
>>> jvm 1    | DEBUG | Sent <message item='hello again x'/> to
>>> topic://MY.DEMO
>>> jvm 1    | DEBUG | RESPONSE /demo/amq  200
>>> jvm 1    | DEBUG | message for ActiveMQMessageConsumer {
>>> value=ID:rutabaga.local-63558-1278527484508-2:1:1:1, started=true
>>> }continuation=null
>>> jvm 1    | DEBUG | localhost removing consumer:
>>> ID:rutabaga.local-63558-1278527484508-2:1:1:1 for destination:
>>> topic://MY.DEMO
>>>
>>> I have 2 questions at the moment:
>>> 1. Why does my consumer not receive the messages published to the topic?
>>> 2. Why is my consumer unsubscribed when a message is sent?
>>>
>>> Any help is appreciated.
>>>
>>> regards,
>>> alex
>>>
>>> My environment:
>>> Mac OSX 10.5.6
>>> ActiveMQ 5.3.2
>>>
>>> java version "1.5.0_22"
>>> Java(TM) 2 Runtime Environment, Standard Edition (build
>>> 1.5.0_22-b03-333-9M3125)
>>> Java HotSpot(TM) Client VM (build 1.5.0_22-147, mixed mode, sharing)
>>>
>>> Apache is listening on port 7998.
>>> Apache is proxying requests to ActiveMQ using the directive 'ProxyPass
>>> /amq
>>> http://localhost:8161/demo/amq'
>>>
>
>

Re: help with ajax

Posted by Alex Dean <ad...@meteostar.com>.
I've discovered my problem stems from Apache's proxy configuration,  
not from ActiveMQ itself.

When I loaded the HTML test page directly from ActiveMQ/Jetty, rather  
than from Apache, the example ajax scripts worked perfectly.  They  
only failed when I loaded the HTML from Apache, and let Apache proxy  
my ajax requests back to ActiveMQ.

I think the problem was that the JSESSIONID cookie was not being  
modified correctly.  ActiveMQ set the cookie for 'path=/demo', while  
the URL which was seen by clients was /amq.  So on subsequent  
requests, the client would not send the cookie back to the server.   
I'm not sure what the role of this cookie (and session) are inside  
ActiveMQ, but once I configured Apache to rewrite the cookie path  
correctly, I was able to start receiving messages via ajax through the  
proxy.

This is the Apache configuration which worked for me:
   ProxyRequests Off
   ProxyPass /amq http://localhost:8161/demo
   ProxyPassReverse /amq http://localhost:8161/demo
   ProxyPassReverseCookiePath /demo /amq
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse

My JavaScript uses "amq.uri = '/amq/amq'", so requests for 'http://localhost/amq/amq' 
  are proxied back to 'http://localhost:8161/demo/amq'.  Cookies  
returned by ActiveMQ with 'path=/demo' are rewritten by Apache, so the  
client sees 'path=/amq'.

alex

On Jul 8, 2010, at 5:12 AM, Dejan Bosanac wrote:

> Hi,
>
> can you test the snapshot. There are some refactoring in those areas  
> lately.
>
> Also, try using the modified client side API, like show here
>
> http://fisheye6.atlassian.com/browse/activemq/trunk/activemq-web-demo/src/main/webapp/test/subscribe_send.html?r=HEAD
>
> BTW. messages sent to the topic before you subscribed will not be
> received by your subscriber. That's just how topics works.
>
> Cheers
> --
> Dejan Bosanac - http://twitter.com/dejanb
>
> Open Source Integration - http://fusesource.com/
> ActiveMQ in Action - http://www.manning.com/snyder/
> Blog - http://www.nighttale.net
>
>
>
> On Wed, Jul 7, 2010 at 9:24 PM, Alex Dean <ad...@meteostar.com> wrote:
>> Hello.  I'm trying out the ActiveMQ ajax messaging described at
>> http://activemq.apache.org/ajax.html.
>>
>> I am able to send messages to a topic using this code:
>>  <script type="text/javascript" src="/amq/amq.js"></script>
>>  <script>
>>   amq.uri='/amq';
>>   amq.sendMessage('topic://MY.DEMO', "<message item='hello again x'/ 
>> >");
>>  </script>
>>
>> When I run that snippet, I see (in the ActiveMQ admin application)  
>> that the
>> topic gets created and that the 'Messages Enqueued' value goes to  
>> '1'.
>>
>> Next, I try to subscribe to the topic using the following  
>> Javascript (in a
>> separate web page):
>>  <script type="text/javascript" src="/amq/amq.js"></script>
>>  <script>
>>   amq.uri='/amq';
>>
>>   myHandler = {
>>     rcvMessage: function(message) {
>>       console.log( 'got message' );
>>     }
>>   };
>>   amq.addListener('test_subscriber','topic://MY.DEMO',  
>> myHandler.rcvMessage
>> );
>>  </script>
>>
>> When I run this, I see the 'Number of Consumers' go to '1' in the  
>> admin
>> application.  Using Firebug, I see amq.js performing a POST like
>> 'destination=topic://MY.DEMO&message=test_subscriber&type=listen'.   
>> This
>> seems to be as expected based on the tutorial.  I then see amq.js  
>> perform a
>> series of GET requests.  The first is
>> 'https://localhost:7998/amq?timeout=10&_=', and successive GETs are
>> 'https://localhost:7998/amq'.
>>
>> All of these GETs are returned with empty responses, like
>> '<ajax-response></ajax-response>'.  The first one appears to return
>> immediately, and the subsequent GETs time out after maybe 20-30  
>> seconds.
>>
>> When I next publish a new message to the topic, the 'Number of  
>> Consumers'
>> immediately goes to '0'.  The consumer's current GET request  
>> doesn't appear
>> to return at this time, rather it seems to time out just like the  
>> others.
>>  (I expected that ActiveMQ would return the message to the consumer  
>> as soon
>> as it was available, and then close the connection.)
>>
>> I noticed the following snippet from the logs from around the time  
>> a message
>> was published (while the consumer was active):
>> jvm 1    | DEBUG | Sent <message item='hello again x'/> to topic:// 
>> MY.DEMO
>> jvm 1    | DEBUG | RESPONSE /demo/amq  200
>> jvm 1    | DEBUG | message for ActiveMQMessageConsumer {
>> value=ID:rutabaga.local-63558-1278527484508-2:1:1:1, started=true
>> }continuation=null
>> jvm 1    | DEBUG | localhost removing consumer:
>> ID:rutabaga.local-63558-1278527484508-2:1:1:1 for destination:
>> topic://MY.DEMO
>>
>> I have 2 questions at the moment:
>> 1. Why does my consumer not receive the messages published to the  
>> topic?
>> 2. Why is my consumer unsubscribed when a message is sent?
>>
>> Any help is appreciated.
>>
>> regards,
>> alex
>>
>> My environment:
>> Mac OSX 10.5.6
>> ActiveMQ 5.3.2
>>
>> java version "1.5.0_22"
>> Java(TM) 2 Runtime Environment, Standard Edition (build
>> 1.5.0_22-b03-333-9M3125)
>> Java HotSpot(TM) Client VM (build 1.5.0_22-147, mixed mode, sharing)
>>
>> Apache is listening on port 7998.
>> Apache is proxying requests to ActiveMQ using the directive  
>> 'ProxyPass /amq
>> http://localhost:8161/demo/amq'
>>


Re: help with ajax

Posted by Dejan Bosanac <de...@nighttale.net>.
Hi,

can you test the snapshot. There are some refactoring in those areas lately.

Also, try using the modified client side API, like show here

http://fisheye6.atlassian.com/browse/activemq/trunk/activemq-web-demo/src/main/webapp/test/subscribe_send.html?r=HEAD

BTW. messages sent to the topic before you subscribed will not be
received by your subscriber. That's just how topics works.

Cheers
--
Dejan Bosanac - http://twitter.com/dejanb

Open Source Integration - http://fusesource.com/
ActiveMQ in Action - http://www.manning.com/snyder/
Blog - http://www.nighttale.net



On Wed, Jul 7, 2010 at 9:24 PM, Alex Dean <ad...@meteostar.com> wrote:
> Hello.  I'm trying out the ActiveMQ ajax messaging described at
> http://activemq.apache.org/ajax.html.
>
> I am able to send messages to a topic using this code:
>  <script type="text/javascript" src="/amq/amq.js"></script>
>  <script>
>   amq.uri='/amq';
>   amq.sendMessage('topic://MY.DEMO', "<message item='hello again x'/>");
>  </script>
>
> When I run that snippet, I see (in the ActiveMQ admin application) that the
> topic gets created and that the 'Messages Enqueued' value goes to '1'.
>
> Next, I try to subscribe to the topic using the following Javascript (in a
> separate web page):
>  <script type="text/javascript" src="/amq/amq.js"></script>
>  <script>
>   amq.uri='/amq';
>
>   myHandler = {
>     rcvMessage: function(message) {
>       console.log( 'got message' );
>     }
>   };
>   amq.addListener('test_subscriber','topic://MY.DEMO', myHandler.rcvMessage
> );
>  </script>
>
> When I run this, I see the 'Number of Consumers' go to '1' in the admin
> application.  Using Firebug, I see amq.js performing a POST like
> 'destination=topic://MY.DEMO&message=test_subscriber&type=listen'.  This
> seems to be as expected based on the tutorial.  I then see amq.js perform a
> series of GET requests.  The first is
> 'https://localhost:7998/amq?timeout=10&_=', and successive GETs are
> 'https://localhost:7998/amq'.
>
> All of these GETs are returned with empty responses, like
> '<ajax-response></ajax-response>'.  The first one appears to return
> immediately, and the subsequent GETs time out after maybe 20-30 seconds.
>
> When I next publish a new message to the topic, the 'Number of Consumers'
> immediately goes to '0'.  The consumer's current GET request doesn't appear
> to return at this time, rather it seems to time out just like the others.
>  (I expected that ActiveMQ would return the message to the consumer as soon
> as it was available, and then close the connection.)
>
> I noticed the following snippet from the logs from around the time a message
> was published (while the consumer was active):
> jvm 1    | DEBUG | Sent <message item='hello again x'/> to topic://MY.DEMO
> jvm 1    | DEBUG | RESPONSE /demo/amq  200
> jvm 1    | DEBUG | message for ActiveMQMessageConsumer {
> value=ID:rutabaga.local-63558-1278527484508-2:1:1:1, started=true
> }continuation=null
> jvm 1    | DEBUG | localhost removing consumer:
> ID:rutabaga.local-63558-1278527484508-2:1:1:1 for destination:
> topic://MY.DEMO
>
> I have 2 questions at the moment:
> 1. Why does my consumer not receive the messages published to the topic?
> 2. Why is my consumer unsubscribed when a message is sent?
>
> Any help is appreciated.
>
> regards,
> alex
>
> My environment:
> Mac OSX 10.5.6
> ActiveMQ 5.3.2
>
> java version "1.5.0_22"
> Java(TM) 2 Runtime Environment, Standard Edition (build
> 1.5.0_22-b03-333-9M3125)
> Java HotSpot(TM) Client VM (build 1.5.0_22-147, mixed mode, sharing)
>
> Apache is listening on port 7998.
> Apache is proxying requests to ActiveMQ using the directive 'ProxyPass /amq
> http://localhost:8161/demo/amq'
>