From 5ea0a3055dd38e781f172e5247ab3c136cae876d Mon Sep 17 00:00:00 2001 From: Howard Gao Date: Mon, 16 Mar 2015 22:39:00 +0800 Subject: [PATCH 1/2] Fix proton-cpp pom missing version Fix proton-ruby script (update according to proton 0.8) Fix core example doc --- examples/core/embedded-remote/readme.html | 2 +- examples/core/embedded/readme.html | 2 +- examples/jms/proton-cpp/pom.xml | 1 + examples/jms/proton-ruby/src/main/scripts/receive.rb | 9 +++++---- examples/jms/proton-ruby/src/main/scripts/send.rb | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) mode change 100644 => 100755 examples/jms/proton-ruby/src/main/scripts/receive.rb mode change 100644 => 100755 examples/jms/proton-ruby/src/main/scripts/send.rb diff --git a/examples/core/embedded-remote/readme.html b/examples/core/embedded-remote/readme.html index 9e8d338080..a5cc882460 100644 --- a/examples/core/embedded-remote/readme.html +++ b/examples/core/embedded-remote/readme.html @@ -33,7 +33,7 @@ under the License.

Example step-by-step

-

To run the example, simply type mvn -Pserver from this directory to start the server and mvn -Pclient to run the client example

+

To run the example, simply type mvn verify -Pserver from this directory to start the server and mvn verify -Pclient to run the client example

In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, ActiveMQServer, start it and operate on JMS regularly


    diff --git a/examples/core/embedded/readme.html b/examples/core/embedded/readme.html index dcec9b69b2..441a68be15 100644 --- a/examples/core/embedded/readme.html +++ b/examples/core/embedded/readme.html @@ -38,7 +38,7 @@ under the License.

    ActiveMQ Embedded could be used from very simple use cases with only InVM support to very complex cases with clustering, persistence and fail over.

    Example step-by-step

    -

    To run the example, simply type mvn -Pexample from this directory

    +

    To run the example, simply type mvn verify -Pexample from this directory

    In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, ActiveMQServer, start it and operate on JMS regularly

      diff --git a/examples/jms/proton-cpp/pom.xml b/examples/jms/proton-cpp/pom.xml index 6b3defe7fd..a7888b4774 100644 --- a/examples/jms/proton-cpp/pom.xml +++ b/examples/jms/proton-cpp/pom.xml @@ -50,6 +50,7 @@ under the License. org.apache.geronimo.specs geronimo-jms_2.0_spec + ${geronimo.jms.2.spec.version} org.apache.activemq diff --git a/examples/jms/proton-ruby/src/main/scripts/receive.rb b/examples/jms/proton-ruby/src/main/scripts/receive.rb old mode 100644 new mode 100755 index 4019bd2f95..93228ff4b8 --- a/examples/jms/proton-ruby/src/main/scripts/receive.rb +++ b/examples/jms/proton-ruby/src/main/scripts/receive.rb @@ -20,6 +20,7 @@ require 'qpid_proton' messenger = Qpid::Proton::Messenger.new() messenger.incoming_window = 10 +messenger.timeout = 10000 begin messenger.start @@ -39,7 +40,7 @@ end msg = Qpid::Proton::Message.new begin - messenger.receive(10) + messenger.receive(1) rescue Qpid::Proton::ProtonError => error puts "ERROR: #{error.message}" exit @@ -49,14 +50,14 @@ msg = Qpid::Proton::Message.new begin messenger.get(msg) # for 0.5: - messenger.accept() + # messenger.accept() # for 0.4: #messenger.accept(messenger.incoming_tracker, 0)#1 would mean cumulative # optional and the same in both versions (messenger will # settle itself when tracker passes out the window) - messenger.settle(messenger.incoming_tracker, 0) + # messenger.settle(messenger.incoming_tracker) rescue Qpid::Proton::Error => error @@ -66,7 +67,7 @@ msg = Qpid::Proton::Message.new puts "Address: #{msg.address}" puts "Subject: #{msg.subject}" - puts "Content: #{msg.content}" + puts "Content: #{msg.body}" puts "Message ID: #{msg.id}" end diff --git a/examples/jms/proton-ruby/src/main/scripts/send.rb b/examples/jms/proton-ruby/src/main/scripts/send.rb old mode 100644 new mode 100755 index ab4a2a4457..1287280c71 --- a/examples/jms/proton-ruby/src/main/scripts/send.rb +++ b/examples/jms/proton-ruby/src/main/scripts/send.rb @@ -26,7 +26,7 @@ messenger.start msg = Qpid::Proton::Message.new msg.address = address msg.subject = "The time is #{Time.new}" -msg.content = "Hello world!" +msg.body = "Hello world!" msg.correlation_id = "554545" begin @@ -44,6 +44,6 @@ rescue Qpid::Proton::ProtonError => error exit end -puts "SENT: " + msg.content +puts "SENT: " + msg.body messenger.stop From 6a45d9476945baa83b0782612b26550720756a9e Mon Sep 17 00:00:00 2001 From: Clebert Suconic Date: Mon, 16 Mar 2015 11:34:01 -0400 Subject: [PATCH 2/2] Fixing Proton CPP example For some reason the ProtonCPP is missing a Java class to send and receive messages also fixing the pom properly accordingly to other examples This closes #187 as I did some rebasing in top of Howard's --- examples/jms/proton-cpp/pom.xml | 58 +++---- .../jms/example/ProtonCPPExample.java | 141 ++++++++++++++++++ .../src/main/resources/jndi.properties | 20 +++ 3 files changed, 191 insertions(+), 28 deletions(-) create mode 100644 examples/jms/proton-cpp/src/main/java/org/apache/activemq/jms/example/ProtonCPPExample.java create mode 100644 examples/jms/proton-cpp/src/main/resources/jndi.properties diff --git a/examples/jms/proton-cpp/pom.xml b/examples/jms/proton-cpp/pom.xml index a7888b4774..f502319e99 100644 --- a/examples/jms/proton-cpp/pom.xml +++ b/examples/jms/proton-cpp/pom.xml @@ -33,31 +33,14 @@ under the License. - org.apache.activemq - activemq-core-client + org.apache.activemq.examples.jms + activemq-jms-examples-common ${project.version} - - org.apache.activemq - activemq-commons - ${project.version} - - - io.netty - netty-all - ${netty.version} - org.apache.geronimo.specs geronimo-jms_2.0_spec - ${geronimo.jms.2.spec.version} - - org.apache.activemq - activemq-amqp-protocol - ${project.version} - - @@ -68,6 +51,7 @@ under the License. org.apache.activemq activemq-maven-plugin + ${project.version} start @@ -75,8 +59,6 @@ under the License. start - true - ${basedir}/target/classes/activemq/server0 data.dir @@ -85,12 +67,28 @@ under the License. + + runClient + + runClient + + + org.apache.activemq.jms.example.ProtonCPPExample + + + + stop + + stop + + - - false - ${basedir}/target/classes/activemq/server0 - + + org.apache.activemq.examples.jms + activemq-jms-protoncpp + ${project.version} + org.apache.activemq activemq-core-client @@ -122,15 +120,19 @@ under the License. ${netty.version} - org.apache.geronimo.specs - geronimo-jms_2.0_spec + org.apache.geronimo.specs + geronimo-jms_2.0_spec + ${geronimo.jms.2.spec.version} + + false + ${basedir}/target/classes/activemq/server0 + - diff --git a/examples/jms/proton-cpp/src/main/java/org/apache/activemq/jms/example/ProtonCPPExample.java b/examples/jms/proton-cpp/src/main/java/org/apache/activemq/jms/example/ProtonCPPExample.java new file mode 100644 index 0000000000..564d827e63 --- /dev/null +++ b/examples/jms/proton-cpp/src/main/java/org/apache/activemq/jms/example/ProtonCPPExample.java @@ -0,0 +1,141 @@ +/** + * 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.jms.example; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.Message; +import javax.jms.MessageConsumer; +import javax.jms.MessageProducer; +import javax.jms.Queue; +import javax.jms.QueueConnection; +import javax.jms.QueueRequestor; +import javax.jms.QueueSession; +import javax.jms.Session; +import javax.jms.TextMessage; +import javax.naming.InitialContext; + +import org.apache.activemq.api.jms.ActiveMQJMSClient; +import org.apache.activemq.api.jms.ActiveMQJMSConstants; +import org.apache.activemq.api.jms.management.JMSManagementHelper; + +import org.apache.activemq.common.example.ActiveMQExample; + +/** + * This example demonstrates the use of ActiveMQ "pre-acknowledge" functionality where + * messages are acknowledged before they are delivered to the consumer. + * + * Please see the readme.html for more details. + */ +public class ProtonCPPExample extends ActiveMQExample +{ + public static void main(final String[] args) + { + new ProtonCPPExample().run(args); + } + + @Override + public boolean runExample() throws Exception + { + Connection connection = null; + + InitialContext initialContext = null; + try + { + // Step 1. Create an initial context to perform the JNDI lookup. + initialContext = new InitialContext(); + + // Step 2. Perform the look-ups + Queue queue = (Queue)initialContext.lookup("queue/exampleQueue"); + + ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("ConnectionFactory"); + + // Step 3. Create a the JMS objects + connection = cf.createConnection(); + + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + MessageConsumer messageConsumer = session.createConsumer(queue); + + MessageProducer producerAnswer = session.createProducer(queue); + + // Step 4. Start the connection + connection.start(); + + System.out.println("On a shell script, execute the following:"); + + System.out.println("./compile.sh"); + + System.out.println("./hello"); + + // Step 5. Finally, receive the message + Message messageReceived = messageConsumer.receive(5000); + + if (messageReceived == null) + { + // We are not going to issue this as an error because + // we also use this example as part of our tests on activemq6 + // this is not considered an error, just that no messages arrived (i.e. hello wasn't called) + } + else + { + System.out.println("message received: " + messageReceived); + + // Sending message back to client + producerAnswer.send(session.createTextMessage("HELLO from Apache ActiveMQ")); + } + + return true; + } + finally + { + // Step 9. Be sure to close our resources! + if (initialContext != null) + { + initialContext.close(); + } + if (connection != null) + { + connection.close(); + } + } + } + + // To do this we send a management message to get the message count. + // In real life you wouldn't create a new session every time you send a management message + private int getMessageCount(final Connection connection) throws Exception + { + QueueSession session = ((QueueConnection)connection).createQueueSession(false, Session.AUTO_ACKNOWLEDGE); + + Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management"); + + QueueRequestor requestor = new QueueRequestor(session, managementQueue); + + connection.start(); + + Message m = session.createMessage(); + + JMSManagementHelper.putAttribute(m, "jms.queue.exampleQueue", "messageCount"); + + Message response = requestor.request(m); + + int messageCount = (Integer)JMSManagementHelper.getResult(response); + + return messageCount; + } + +} diff --git a/examples/jms/proton-cpp/src/main/resources/jndi.properties b/examples/jms/proton-cpp/src/main/resources/jndi.properties new file mode 100644 index 0000000000..1cb3686d6f --- /dev/null +++ b/examples/jms/proton-cpp/src/main/resources/jndi.properties @@ -0,0 +1,20 @@ +# 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.jndi.ActiveMQInitialContextFactory +connectionFactory.ConnectionFactory=tcp://localhost:61616 +queue.queue/exampleQueue=exampleQueue