Author: gregw
Date: Tue Jun 20 15:26:49 2006
New Revision: 415827
URL: http://svn.apache.org/viewvc?rev=415827&view=rev
Log:
changed parameter handling to impose a strict ordering to avoid reordering of
messages by client libraries
Modified:
incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java
incubator/activemq/trunk/activemq-web/src/main/resources/org/apache/activemq/web/_amq.js
Modified:
incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java?rev=415827&r1=415826&r2=415827&view=diff
==============================================================================
---
incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java
(original)
+++
incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java
Tue Jun 20 15:26:49 2006
@@ -90,7 +90,16 @@
}
/**
- * Sends a message to a destination
+ * Sends a message to a destination or manage subscriptions.
+ *
+ * If the the content type of the POST is
<code>application/x-www-form-urlencoded</code>, then the form parameters
+ * "destination", "message" and "type" are used to pass a message or a
subscription. If multiple messages
+ * or subscriptions are passed in a single post, then additional
parameters are shortened to "dN", "mN" and "tN"
+ * where N is an index starting from 1. The type is either "send",
"listen" or "unlisten". For send types,
+ * the message is the text of the TextMessage, otherwise it is the ID to
be used for the subscription.
+ *
+ * If the content type is not
<code>application/x-www-form-urlencoded</code>, then the body of the post is
+ * sent as the message to a destination that is derived from a query
parameter, the URL or the default destination.
*
* @param request
* @param response
@@ -110,30 +119,30 @@
log.debug("POST client="+client+"
session="+request.getSession().getId()+" info="+request.getPathInfo()+"
contentType="+request.getContentType());
// dump(request.getParameterMap());
}
- String[] destinations = request.getParameterValues("destination");
- String[] messages = request.getParameterValues("message");
- String[] types = request.getParameterValues("type");
- if (destinations.length!=messages.length ||
messages.length!=types.length)
- {
- if (log.isDebugEnabled()) {
- log.debug("ERROR destination="+destinations.length+"
message="+messages.length+" type="+types.length);
- }
-
response.sendError(HttpServletResponse.SC_BAD_REQUEST,"missmatched destination,
message or type");
- return;
- }
+ int messages=0;
- for (int i=0;i<types.length;i++)
+ // loop until no more messages
+ while (true)
{
+ // Get the message parameters. Multiple messages are encoded
with more compact parameter names.
+ String destination_name =
request.getParameter(messages==0?"destination":("d"+messages));
+ String message =
request.getParameter(messages==0?"message":("m"+messages));
+ String type =
request.getParameter(messages==0?"type":("t"+messages));
+
+ if (destination_name==null || message==null || type==null)
+ break;
+
try {
- String type=types[i];
- Destination
destination=getDestination(client,request,destinations[i]);
+ Destination
destination=getDestination(client,request,destination_name);
if (log.isDebugEnabled()) {
- log.debug(i+" destination="+destinations[i]+"
message="+messages[i]+" type="+types[i]);
+ log.debug(messages+" destination="+destination_name+"
message="+message+" type="+type);
log.debug(destination+" is a
"+destination.getClass().getName());
}
+ messages++;
+
if ("listen".equals(type))
{
Listener listener = getListener(request);
@@ -142,9 +151,9 @@
MessageAvailableConsumer consumer =
(MessageAvailableConsumer) client.getConsumer(destination);
consumer.setAvailableListener(listener);
- consumerIdMap.put(consumer, messages[i]);
+ consumerIdMap.put(consumer, message);
if (log.isDebugEnabled()) {
- log.debug("Subscribed: "+consumer+" to
"+destination+" id="+messages[i]);
+ log.debug("Subscribed: "+consumer+" to
"+destination+" id="+message);
}
}
else if ("unlisten".equals(type))
@@ -161,13 +170,13 @@
}
else if ("send".equals(type))
{
- TextMessage message =
client.getSession().createTextMessage(messages[i]);
- appendParametersToMessage(request, message);
+ TextMessage text =
client.getSession().createTextMessage(message);
+ appendParametersToMessage(request, text);
- client.send(destination, message);
- message_ids+=message.getJMSMessageID()+"\n";
+ client.send(destination, text);
+ message_ids+=text.getJMSMessageID()+"\n";
if (log.isDebugEnabled()) {
- log.debug("Sent "+messages[i]+" to "+destination);
+ log.debug("Sent "+message+" to "+destination);
}
}
else
Modified:
incubator/activemq/trunk/activemq-web/src/main/resources/org/apache/activemq/web/_amq.js
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-web/src/main/resources/org/apache/activemq/web/_amq.js?rev=415827&r1=415826&r2=415827&view=diff
==============================================================================
---
incubator/activemq/trunk/activemq-web/src/main/resources/org/apache/activemq/web/_amq.js
(original)
+++
incubator/activemq/trunk/activemq-web/src/main/resources/org/apache/activemq/web/_amq.js
Tue Jun 20 15:26:49 2006
@@ -147,7 +147,14 @@
{
if (amq._queueMessages>0)
{
-
amq._messageQueue+=(amq._messages==0?'destination=':'&destination=')+destination+'&message='+message+'&type='+type;
+ if (amq._messages==0)
+ {
+
amq._messageQueue='destination='+destination+'&message='+message+'&type='+type;
+ }
+ else
+ {
+
amq._messageQueue='d'+amq._messages+'='+destination+'&m'+amq._messages+'='+message+'&t'+amq._messages+'='+type;
+ }
amq._messages++;
}
else