NO-JIRA removing example added by accident
This commit is contained in:
parent
de7251d546
commit
fe537fa257
|
@ -1,94 +0,0 @@
|
||||||
<?xml version='1.0'?>
|
|
||||||
<!--
|
|
||||||
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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>org.apache.activemq.examples.broker</groupId>
|
|
||||||
<artifactId>jms-examples</artifactId>
|
|
||||||
<version>2.5.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>send-acknowledgements-fail</artifactId>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
<name>ActiveMQ Artemis JMS Send Acknowledgements Example</name>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<activemq.basedir>${project.basedir}/../../../..</activemq.basedir>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.activemq</groupId>
|
|
||||||
<artifactId>artemis-jms-client-all</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.activemq</groupId>
|
|
||||||
<artifactId>artemis-cli</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.activemq</groupId>
|
|
||||||
<artifactId>artemis-maven-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>create</id>
|
|
||||||
<goals>
|
|
||||||
<goal>create</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<instance>${basedir}/target/server0</instance>
|
|
||||||
<args>
|
|
||||||
<arg>--global-max-size</arg>
|
|
||||||
<arg>10M</arg>
|
|
||||||
</args>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>runClient</id>
|
|
||||||
<goals>
|
|
||||||
<goal>runClient</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<clientClass>org.apache.activemq.artemis.jms.example.SendAcknowledgementsExample</clientClass>
|
|
||||||
<args>
|
|
||||||
<param>${basedir}/target/server0</param>
|
|
||||||
</args>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.activemq.examples.broker</groupId>
|
|
||||||
<artifactId>send-acknowledgements-fail</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,140 +0,0 @@
|
||||||
<!--
|
|
||||||
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>
|
|
||||||
<head>
|
|
||||||
<title>ActiveMQ Artemis Asynchronous Send Acknowledgements Example</title>
|
|
||||||
<link rel="stylesheet" type="text/css" href="../../../common/common.css" />
|
|
||||||
<link rel="stylesheet" type="text/css" href="../../../common/prettify.css" />
|
|
||||||
<script type="text/javascript" src="../../../common/prettify.js"></script>
|
|
||||||
</head>
|
|
||||||
<body onload="prettyPrint()">
|
|
||||||
<h1>Asynchronous Send Acknowledgements Example</h1>
|
|
||||||
|
|
||||||
<pre>To run the example, simply type <b>mvn verify</b> from this directory, <br>or <b>mvn -PnoServer verify</b> if you want to start and create the server manually.</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<p>Asynchronous Send Acknowledgements are an advanced feature of ActiveMQ Artemis which allow you to
|
|
||||||
receive acknowledgements that messages were successfully received at the server in a separate thread to the sending thread<p/>
|
|
||||||
<p>In this example we create a normal JMS session, then set a SendAcknowledgementHandler on the JMS
|
|
||||||
session's underlying core session. We send many messages to the server without blocking and asynchronously
|
|
||||||
receive send acknowledgements via the SendAcknowledgementHandler.
|
|
||||||
|
|
||||||
<p>For more information on Asynchronous Send Acknowledgements please see the user manual</p>
|
|
||||||
<h2>Example step-by-step</h2>
|
|
||||||
<p><i>To run the example, simply type <code>mvn verify -Pexample</code> from this directory</i></p>
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>First we need to get an initial context so we can look-up the JMS connection factory and destination objects from JNDI. This initial context will get it's properties from the <code>client-jndi.properties</code> file in the directory <code>../common/config</code></li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>InitialContext initialContext = getContext();</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>We look-up the JMS queue object from JNDI</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue");</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>We look-up the JMS connection factory object from JNDI</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("/ConnectionFactory");</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>We create a JMS connection</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>connection = cf.createConnection();</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>Define a SendAcknowledgementHandler which will receive asynchronous acknowledgements</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>
|
|
||||||
class MySendAcknowledgementsHandler implements SendAcknowledgementHandler
|
|
||||||
{
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
public void sendAcknowledged(final Message message)
|
|
||||||
{
|
|
||||||
System.out.println("Received send acknowledgement for message " + count++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>Create a JMS session</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>Set the handler on the underlying core session</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>
|
|
||||||
ClientSession coreSession = ((ActiveMQSession)session).getCoreSession();
|
|
||||||
|
|
||||||
coreSession.setSendAcknowledgementHandler(new MySendAcknowledgementsHandler());
|
|
||||||
|
|
||||||
</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>Create a JMS Message Producer</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>
|
|
||||||
MessageProducer producer = session.createProducer(queue);
|
|
||||||
|
|
||||||
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
|
|
||||||
</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<li>Send 5000 messages, the handler will get called asynchronously some time later after the messages are sent.</li>
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>
|
|
||||||
final int numMessages = 5000;
|
|
||||||
|
|
||||||
for (int i = 0; i < numMessages; i++)
|
|
||||||
{
|
|
||||||
javax.jms.Message jmsMessage = session.createMessage();
|
|
||||||
|
|
||||||
producer.send(jmsMessage);
|
|
||||||
|
|
||||||
System.out.println("Sent message " + i);
|
|
||||||
}
|
|
||||||
</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<li>And finally, <b>always</b> remember to close your JMS connections and resources after use, in a <code>finally</code> block. Closing a JMS connection will automatically close all of its sessions, consumers, producer and browser objects</li>
|
|
||||||
|
|
||||||
<pre class="prettyprint">
|
|
||||||
<code>finally
|
|
||||||
{
|
|
||||||
if (initialContext != null)
|
|
||||||
{
|
|
||||||
initialContext.close();
|
|
||||||
}
|
|
||||||
if (connection != null)
|
|
||||||
{
|
|
||||||
connection.close();
|
|
||||||
}
|
|
||||||
}</code>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</ol>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package org.apache.activemq.artemis.jms.example;
|
|
||||||
|
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import org.apache.activemq.artemis.api.core.Message;
|
|
||||||
import org.apache.activemq.artemis.api.core.RoutingType;
|
|
||||||
import org.apache.activemq.artemis.api.core.SimpleString;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ClientMessage;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ClientProducer;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ClientSession;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.SendAcknowledgementHandler;
|
|
||||||
import org.apache.activemq.artemis.api.core.client.ServerLocator;
|
|
||||||
import org.apache.activemq.artemis.util.ServerUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronous Send Acknowledgements are an advanced feature of ActiveMQ Artemis which allow you to
|
|
||||||
* receive acknowledgements that messages were successfully received at the server in a separate stream
|
|
||||||
* to the stream of messages being sent to the server.
|
|
||||||
* For more information please see the readme.html file
|
|
||||||
*/
|
|
||||||
public class SendAcknowledgementsExample {
|
|
||||||
|
|
||||||
private static Process server0;
|
|
||||||
private static final int numMessages = 30_000;
|
|
||||||
private static final SimpleString queueName = SimpleString.toSimpleString("testQueue");
|
|
||||||
|
|
||||||
public static void main(final String[] args) throws Exception {
|
|
||||||
|
|
||||||
for (int i = 0; i < 500; i++) {
|
|
||||||
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Running test " + i);
|
|
||||||
server0 = ServerUtil.startServer(args[0], SendAcknowledgementsExample.class.getSimpleName() + "0", 0, 10000);
|
|
||||||
sendMessages();
|
|
||||||
|
|
||||||
server0 = ServerUtil.startServer(args[0], SendAcknowledgementsExample.class.getSimpleName() + "0", 0, 10000);
|
|
||||||
consumeMessages();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendMessages() throws Exception {
|
|
||||||
try {
|
|
||||||
|
|
||||||
ServerLocator locator = ActiveMQClient.createServerLocator("tcp://localhost:61616").setBlockOnDurableSend(false).setConfirmationWindowSize(1024 * 1024);
|
|
||||||
|
|
||||||
ClientSessionFactory factory = locator.createSessionFactory();
|
|
||||||
|
|
||||||
ClientSession session = factory.createSession(null, null, false, true, true, false, ActiveMQClient.DEFAULT_ACK_BATCH_SIZE);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Tried with and without the createAddress
|
|
||||||
session.createAddress(queueName, RoutingType.MULTICAST, false);
|
|
||||||
session.createQueue(queueName.toString(), RoutingType.MULTICAST, queueName.toString(), true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientProducer producer = session.createProducer(queueName);
|
|
||||||
|
|
||||||
CountDownLatch latch = new CountDownLatch(numMessages);
|
|
||||||
|
|
||||||
for (int i = 0; i < numMessages; i++) {
|
|
||||||
|
|
||||||
if (i % 10000 == 0) {
|
|
||||||
System.out.println("Send " + i);
|
|
||||||
}
|
|
||||||
ClientMessage message = session.createMessage(true);
|
|
||||||
message.getBodyBuffer().writeBytes("hello world".getBytes());
|
|
||||||
|
|
||||||
// tried with producer.send(queueName, message, ...);; // didn't make a difference
|
|
||||||
|
|
||||||
producer.send(message, new SendAcknowledgementHandler() {
|
|
||||||
@Override
|
|
||||||
public void sendAcknowledged(Message message) {
|
|
||||||
latch.countDown();
|
|
||||||
if (latch.getCount() % 10_000 == 0) {
|
|
||||||
System.out.println(latch.getCount() + " to go");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
latch.await(10, TimeUnit.MINUTES);
|
|
||||||
} finally {
|
|
||||||
server0.destroy();
|
|
||||||
server0.waitFor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void consumeMessages() throws Exception {
|
|
||||||
try {
|
|
||||||
|
|
||||||
ServerLocator locator = ActiveMQClient.createServerLocator("tcp://localhost:61616").setBlockOnDurableSend(false).setConfirmationWindowSize(-1);
|
|
||||||
|
|
||||||
ClientSessionFactory factory = locator.createSessionFactory();
|
|
||||||
|
|
||||||
ClientSession session = factory.createSession(null, null, false, false, false, false, ActiveMQClient.DEFAULT_ACK_BATCH_SIZE);
|
|
||||||
|
|
||||||
ClientConsumer consumer = session.createConsumer(queueName);
|
|
||||||
|
|
||||||
session.start();
|
|
||||||
|
|
||||||
for (int i = 0; i < numMessages; i++) {
|
|
||||||
|
|
||||||
if (i % 10000 == 0) {
|
|
||||||
System.out.println("Received " + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientMessage message = consumer.receive(5000);
|
|
||||||
message.acknowledge();
|
|
||||||
|
|
||||||
if (message == null) {
|
|
||||||
System.err.println("Expected message at " + i);
|
|
||||||
System.exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
session.commit();
|
|
||||||
|
|
||||||
ClientMessage message = consumer.receiveImmediate();
|
|
||||||
if (message != null) {
|
|
||||||
System.err.println("Received too many messages");
|
|
||||||
System.exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
session.close();
|
|
||||||
locator.close();
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
server0.destroy();
|
|
||||||
server0.waitFor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
# 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.
|
|
||||||
|
|
||||||
java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
|
|
||||||
connectionFactory.ConnectionFactory=tcp://localhost:61616?confirmationWindowSize=1048576
|
|
||||||
queue.queue/exampleQueue=exampleQueue
|
|
Loading…
Reference in New Issue