<?xml version="1.0" encoding="utf-8"?>
<!--
 
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at
 
   http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 
-->

<section id="Message-Groups-Guide">
  <title>Using Message Groups</title>
  <para>
    This section describes how messaging applications can use the Message Group feature
    provided by the Broker.
  </para>
  <note>
    The content of this section assumes the reader is familiar with the Message Group
    feature as described in the AMQP Messaging Broker user's guide.  Please read the
    message grouping section in the Broker user's guide before using the
    examples given in this section.
  </note>
  <section role="h2" id="messagegroups-setup">
    <title>Creating Message Group Queues</title>
    <para>
      The following examples show how to create a message group queue that enforces
      ordered group consumption across multiple consumers.
    </para>
    <example>
      <title>Message Group Queue Creation - Python</title>
      <programlisting lang="python">
sender = connection.session().sender("msg-group-q;" +
                                     " {create:always, delete:receiver," +
                                     " node: {x-declare: {arguments:" +
                                     " {'qpid.group_header_key':'THE-GROUP'," +
                                     " 'qpid.shared_msg_group':1}}}}")
      </programlisting>
    </example>
    <example>
      <title>Message Group Queue Creation - C++</title>
      <programlisting lang="c++">
std::string addr("msg-group-q; "
                 " {create:always, delete:receiver,"
                 " node: {x-declare: {arguments:"
                 " {qpid.group_header_key:'THE-GROUP',"
                 " qpid.shared_msg_group:1}}}}");
Sender sender = session.createSender(addr);
      </programlisting>
    </example>
    <example>
      <title>Message Group Queue Creation - Java</title>
      <programlisting lang="java">
Session s = c.createSession(false, Session.CLIENT_ACKNOWLEDGE);
String addr = "msg-group-q; {create:always, delete:receiver," +
                             " node: {x-declare: {arguments:" +
                             " {'qpid.group_header_key':'THE-GROUP'," +
                             " 'qpid.shared_msg_group':1}}}}";
Destination d = (Destination) new AMQAnyDestination(addr);
MessageProducer sender = s.createProducer(d);
      </programlisting>
    </example>
    <para>
      The example code uses the x-declare map to specify the message group configuration
      that should be used for the queue.  See the AMQP Messaging Broker user's guide
      for a detailed description of these arguments.  Note that the
      qpid.group_header_key's value MUST be a string type if using the C++ broker.
    </para>
  </section>
  <section role="h2" id="messagegroups-sending">
    <title>Sending Grouped Messages</title>
    <para>
      When sending grouped messages, the client must add a message property containing the
      group identifier to the outgoing message.  If using the C++ broker, the group identifier
      must be a string type.  The key used for the property must exactly match the value passed in the
      'qpid.group_header_key' configuration argument.
    </para>
    <example>
      <title>Sending Grouped Messages - Python</title>
      <programlisting lang="python">
group = "A"
m = Message(content="some data", properties={"THE-GROUP": group})
sender.send(m)

group = "B"
m = Message(content="some other group's data", properties={"THE-GROUP": group})
sender.send(m)

group = "A"
m = Message(content="more data for group 'A'", properties={"THE-GROUP": group})
sender.send(m)
      </programlisting>
    </example>
    <example>
      <title>Sending Grouped Messages - C++</title>
      <programlisting lang="C++">

const std::string groupKey("THE-GROUP");
{
    Message msg("some data");
    msg.getProperties()[groupKey] = std::string("A");
    sender.send(msg);
}
{
    Message msg("some other group's data");
    msg.getProperties()[groupKey] = std::string("B");
    sender.send(msg);
}
{
    Message msg("more data for group 'A'");
    msg.getProperties()[groupKey] = std::string("A");
    sender.send(msg);
}
      </programlisting>
    </example>
    <example>
      <title>Sending Grouped Messages - Java</title>
      <programlisting lang="java">
String groupKey = "THE-GROUP";

TextMessage tmsg1 = s.createTextMessage("some data");
tmsg1.setStringProperty(groupKey, "A");
sender.send(tmsg1);

TextMessage tmsg2 = s.createTextMessage("some other group's data");
tmsg2.setStringProperty(groupKey, "B");
sender.send(tmsg2);

TextMessage tmsg3 = s.createTextMessage("more data for group 'A'");
tmsg3.setStringProperty(groupKey, "A");
sender.send(tmsg3);
      </programlisting>
    </example>
    <para>
      The examples above send two groups worth of messages to the queue created in the
      previous example.  Two messages belong to group "A", and one belongs to group
      "B". Note that it is not necessary to complete sending one group's messages before
      starting another.  Also note that there is no need to indicate to the broker when a
      new group is created or an existing group retired - the broker tracks group state
      automatically.
    </para>
  </section>
  <section role="h2" id="messagegroups-receiving">
    <title>Receiving Grouped Messages</title>
    <para>
      Since the broker enforces group policy when delivering messages, no special actions
      are necessary for receiving grouped messages from the broker.  However, applications
      must adhere to the rules for message group consumption as described in the AMQP
      Messaging Broker user's guide.
    </para>
  </section>
</section>
