<!DOCTYPE html>
<!--
 -
 - 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.
 -
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>4.2.&#160;Publish/subscribe example - Apache Qpid&#8482;</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="/site.css" type="text/css" async="async"/>
    <link rel="stylesheet" href="/deferred.css" type="text/css" defer="defer"/>
    <script type="text/javascript">var _deferredFunctions = [];</script>
    <script type="text/javascript" src="/deferred.js" defer="defer"></script>
    <!--[if lte IE 8]>
      <link rel="stylesheet" href="/ie.css" type="text/css"/>
      <script type="text/javascript" src="/html5shiv.js"></script>
    <![endif]-->

    <!-- Redirects for `go get` and godoc.org -->
    <meta name="go-import"
          content="qpid.apache.org git https://gitbox.apache.org/repos/asf/qpid-proton.git"/>
    <meta name="go-source"
          content="qpid.apache.org
https://github.com/apache/qpid-proton/blob/go1/README.md
https://github.com/apache/qpid-proton/tree/go1{/dir}
https://github.com/apache/qpid-proton/blob/go1{/dir}/{file}#L{line}"/>
  </head>
  <body>
    <div id="-content">
      <div id="-top" class="panel">
        <a id="-menu-link"><img width="16" height="16" src="" alt="Menu"/></a>

        <a id="-search-link"><img width="22" height="16" src="" alt="Search"/></a>

        <ul id="-global-navigation">
          <li><a id="-logotype" href="/index.html">Apache Qpid<sup>&#8482;</sup></a></li>
          <li><a href="/documentation.html">Documentation</a></li>
          <li><a href="/download.html">Download</a></li>
          <li><a href="/discussion.html">Discussion</a></li>
        </ul>
      </div>

      <div id="-menu" class="panel" style="display: none;">
        <div class="flex">
          <section>
            <h3>Project</h3>

            <ul>
              <li><a href="/overview.html">Overview</a></li>
              <li><a href="/components/index.html">Components</a></li>
              <li><a href="/releases/index.html">Releases</a></li>
            </ul>
          </section>

          <section>
            <h3>Messaging APIs</h3>

            <ul>
              <li><a href="/proton/index.html">Qpid Proton</a></li>
              <li><a href="/components/jms/index.html">Qpid JMS</a></li>
              <li><a href="/components/messaging-api/index.html">Qpid Messaging API</a></li>
            </ul>
          </section>

          <section>
            <h3>Servers and tools</h3>

            <ul>
              <li><a href="/components/broker-j/index.html">Broker-J</a></li>
              <li><a href="/components/cpp-broker/index.html">C++ broker</a></li>
              <li><a href="/components/dispatch-router/index.html">Dispatch router</a></li>
            </ul>
          </section>

          <section>
            <h3>Resources</h3>

            <ul>
              <li><a href="/dashboard.html">Dashboard</a></li>
              <li><a href="https://cwiki.apache.org/confluence/display/qpid/Index">Wiki</a></li>
              <li><a href="/resources.html">More resources</a></li>
            </ul>
          </section>
        </div>
      </div>

      <div id="-search" class="panel" style="display: none;">
        <form action="http://www.google.com/search" method="get">
          <input type="hidden" name="sitesearch" value="qpid.apache.org"/>
          <input type="text" name="q" maxlength="255" autofocus="autofocus" tabindex="1"/>
          <button type="submit">Search</button>
          <a href="/search.html">More ways to search</a>
        </form>
      </div>

      <div id="-middle" class="panel">
        <ul id="-path-navigation"><li><a href="/index.html">Home</a></li><li><a href="/releases/index.html">Releases</a></li><li><a href="/releases/qpid-java-6.1.7/index.html">Qpid for Java 6.1.7</a></li><li><a href="/releases/qpid-java-6.1.7/jms-client-0-8/book/index.html">Apache Qpid JMS Client for AMQP protocols 0-8, 0-9 and 0-9-1</a></li><li>4.2.&#160;Publish/subscribe example</li></ul>

        <div id="-middle-content">
          <div class="docbook"><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">4.2.&#160;Publish/subscribe example</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="JMS-Client-0-8-Examples.html">Prev</a>&#160;</td><th align="center" width="60%">Chapter&#160;4.&#160;Examples</th><td align="right" width="20%">&#160;<a accesskey="n" href="JMS-Client-0-8-Client-Understanding.html">Next</a></td></tr></table><hr /></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="JMS-Client-0-8-Examples-PubSub"></a>4.2.&#160;Publish/subscribe example</h2></div></div></div><p>In this second example, we illustrate publish/subscribe messaging. Again, we create a
			JNDI context using a properties file, use the context to lookup a connection factory,
			create and start a connection, create a session, and lookup a destination (a topic) from
			the JNDI context. Then we create a producer and two durable subscribers , send a message
			with the producer. Both subscribers receive the same message.</p><div class="example"><a id="JMS-Client-0-8-Examples-PubSub-Java"></a><p class="title"><strong>Example&#160;4.3.&#160;JMS Example - Publish/subscribe Messaging</strong></p><div class="example-contents"><pre class="programlisting">
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;

import java.util.Properties;

public class StocksExample {

    public StocksExample() {
    }

    public static void main(String[] args) throws Exception {
      StocksExample stocks = new StocksExample();
      stocks.runTest();
    }

    private void runTest() throws Exception {
      Properties properties = new Properties();
      properties.load(this.getClass().getResourceAsStream("stocks.properties"));
      Context context = new InitialContext(properties);

      ConnectionFactory connectionFactory
          = (ConnectionFactory) context.lookup("qpidConnectionFactory");
      Connection connection = connectionFactory.createConnection();
      connection.start();

      Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
      Topic priceTopic = (Topic) context.lookup("myprices");                             <a class="co" href="JMS-Client-0-8-Examples-PubSub.html#callout-pubsub-destination" id="pubsub-java-destination"><span><img alt="1" border="0" src="images/callouts/1.png" /></span></a>

      MessageConsumer subscriber1 = session.createDurableSubscriber(priceTopic, "sub1"); <a class="co" href="JMS-Client-0-8-Examples-PubSub.html#callout-pubsub-subscribers" id="pubsub-java-subscribers"><span><img alt="2" border="0" src="images/callouts/2.png" /></span></a>
      MessageConsumer subscriber2 = session.createDurableSubscriber(priceTopic, "sub2" /*, "price &gt; 150", false*/ );
      MessageProducer messageProducer = session.createProducer(priceTopic);

      Message message = session.createMessage();
      message.setStringProperty("instrument", "IBM");
      message.setIntProperty("price", 100);
      messageProducer.send(message);
      session.commit();

      message = subscriber1.receive(1000);
      session.commit();
      System.out.println("Subscriber 1 received : " + message);

      message = subscriber2.receive(1000);
      session.commit();
      System.out.println("Subscriber 2 received : " + message);

      session.unsubscribe("sub1");                                                       <a class="co" href="JMS-Client-0-8-Examples-PubSub.html#callout-pubsub-unsubscribe" id="pubsub-java-unsubscribe"><span><img alt="3" border="0" src="images/callouts/3.png" /></span></a>
      session.unsubscribe("sub2");
      connection.close();
      context.close();
    }
}
	</pre></div></div><br class="example-break" /><div class="calloutlist"><table border="0" summary="Callout list"><tr><td align="left" valign="top" width="5%"><p><a id="callout-pubsub-destination"></a><a href="#pubsub-java-destination"><span><img alt="1" border="0" src="images/callouts/1.png" /></span></a> </p></td><td align="left" valign="top"><p>Looks up a destination for the topic with JNDI name myprices.</p></td></tr><tr><td align="left" valign="top" width="5%"><p><a id="callout-pubsub-subscribers"></a><a href="#pubsub-java-subscribers"><span><img alt="2" border="0" src="images/callouts/2.png" /></span></a> </p></td><td align="left" valign="top"><p>Creates two durable subscribers, <code class="literal">sub1</code> and
						<code class="literal">sub2</code>. Durable subscriptions retain messages for the
					client even when the client is disconnected, until the subscription is
					unsubscribed. Subscription 2 has a (commented out) message selector argument so
					you can conveniently experiement with the effect of those. <a class="footnote" href="#ftn.d0e277" id="d0e277"><sup class="footnote">[2]</sup></a></p></td></tr><tr><td align="left" valign="top" width="5%"><p><a id="callout-pubsub-unsubscribe"></a><a href="#pubsub-java-unsubscribe"><span><img alt="3" border="0" src="images/callouts/3.png" /></span></a> </p></td><td align="left" valign="top"><p>Unsubscribes the two durable subscribers, permanently removing the knowledge
					of the subscriptions from the system. An application would normally
						<span class="emphasis"><em>NOT</em></span> do this. The typical use-case for durable
					subsciption is one where the subscription exists over an extended period of
					time.</p></td></tr></table></div><p>The contents of the <code class="literal">stocks.properties</code> file are shown below.</p><div class="example"><a id="JMS-Client-0-8-Examples-PubSub-PropertiesFile"></a><p class="title"><strong>Example&#160;4.4.&#160;JMS Example - Publish/subscribe Messaging - JNDI Properties</strong></p><div class="example-contents"><pre class="programlisting">
java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
connectionfactory.qpidConnectionFactory = amqp://guest:guest@clientid/?brokerlist='tcp://localhost:5672'
topic.myprices = prices <a class="co" href="JMS-Client-0-8-Examples-PubSub.html#callout-pubsub-properties-destination" id="pubsub-properties-destination"><span><img alt="1" border="0" src="images/callouts/1.png" /></span></a>
	</pre></div></div><br class="example-break" /><div class="calloutlist"><table border="0" summary="Callout list"><tr><td align="left" valign="top" width="5%"><p><a id="callout-pubsub-properties-destination"></a><a href="#pubsub-properties-destination"><span><img alt="1" border="0" src="images/callouts/1.png" /></span></a> </p></td><td align="left" valign="top"><p>Defines a topic for which MessageProducers and/or MessageConsumers send and
					receive messages. The format of this entry is described in <a class="xref" href="JMS-Client-0-8-JNDI-Properties-Format-Topic.html" title="6.3.&#160;Topic">Section&#160;6.3, &#8220;Topic&#8221;</a>.</p></td></tr></table></div><div class="footnotes"><br /><hr style="width:100; text-align:left;margin-left: 0" /><div class="footnote" id="ftn.d0e277"><p><a class="para" href="#d0e277"><sup class="para">[2] </sup></a>Each durable subscription is implemented as a queue on the Broker. See
								<a class="xref" href="JMS-Client-0-8-Client-Understanding-MessageConsumer.html#JMS-Client-0-8-Client-Understanding-MessageConsumer-TopicSubscriptions" title="5.6.2.&#160;Topic Subscriptions">Section&#160;5.6.2, &#8220;Topic Subscriptions&#8221;</a> for details.</p></div></div></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="JMS-Client-0-8-Examples.html">Prev</a>&#160;</td><td align="center" width="20%"><a accesskey="u" href="JMS-Client-0-8-Examples.html">Up</a></td><td align="right" width="40%">&#160;<a accesskey="n" href="JMS-Client-0-8-Client-Understanding.html">Next</a></td></tr><tr><td align="left" valign="top" width="40%">Chapter&#160;4.&#160;Examples&#160;</td><td align="center" width="20%"><a accesskey="h" href="JMS-Client-Book.html">Home</a></td><td align="right" valign="top" width="40%">&#160;Chapter&#160;5.&#160;Understanding the Client</td></tr></table></div></div>

          <hr/>

          <ul id="-apache-navigation">
            <li><a href="http://www.apache.org/">Apache</a></li>
            <li><a href="http://www.apache.org/licenses/">License</a></li>
            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks!</a></li>
            <li><a href="/security.html">Security</a></li>
            <li><a href="http://www.apache.org/"><img id="-apache-feather" width="48" height="14" src="" alt="Apache"/></a></li>
          </ul>

          <p id="-legal">
            Apache Qpid, Messaging built on AMQP; Copyright &#169; 2015
            The Apache Software Foundation; Licensed under
            the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache
            License, Version 2.0</a>; Apache Qpid, Qpid, Qpid Proton,
            Proton, Apache, the Apache feather logo, and the Apache Qpid
            project logo are trademarks of The Apache Software
            Foundation; All other marks mentioned may be trademarks or
            registered trademarks of their respective owners
          </p>
        </div>
      </div>
    </div>
  </body>
</html>
