/**
* 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.
*/
/*
Copyright 2001-2008, Progress Software Corporation - All Rights Reserved
Sample Application
Writing a Basic JMS Application with Point-to-Point Queues,
using:
- Synchronous Request/Reply
- javax.jms.QueueRequestor class
- JMSReplyTo Header
When this program runs, it reads input from System.in
and then sends the text as a message to the queue, "Q1"
(by default).
A "Replier" class should be waiting for the request.
It will reply with a message.
NOTE: Unlike the Publish-Subscribe example, you need
not run the Replier first. However, this Requestor
will block until the Replier is started to service the queue.
Usage:
java Requestor -b <broker:port> -u <username> -p <password> -qs <queue>
-b broker:port points to your message broker
Default: tcp://localhost:61616
-u username must be unique (but is not checked)
Default: SampleRequestor
-p password password for user (not checked)
Default: password
-qs queue name of queue for sending requests
Default: SampleQ1
Suggested demonstration:
- In a console window with the environment set,
start a copy of the Replier. For example:
java Replier -u SampleQReplier
- In another console window, start a Requestor.
For example:
java Requestor -u SampleQRequestor
- Enter text in the Requestor window then press Enter.
The Replier responds with the message in all uppercase characters.
- Start other Requestors with different user names to see that
replies are not broadcast to all users. For example:
java Requestor -u SampleRequestorFoo
- Start other Repliers.
- See that only one replier is receiving messages,(as it should).
- See the Requestor only receives one response.
java Replier -u toLower -m lowercase
*/
import org.apache.activemq.*;
public class Requestor
{
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
private static final String DEFAULT_USER_NAME = "SampleRequestor";
private static final String DEFAULT_PASSWORD = "password";
private static final String DEFAULT_QUEUE = "Q1";
private javax.jms.QueueConnection connect = null;
private javax.jms.QueueSession session = null;
private javax.jms.QueueRequestor requestor = null;
/** Create JMS client for sending messages. */
private void start ( String broker, String username, String password, String sQueue)
{
// Create a connection.
try
{
javax.jms.QueueConnectionFactory factory;
factory = new ActiveMQConnectionFactory(username, password, broker);
connect = factory.createQueueConnection (username, password);
session = connect.createQueueSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
}
catch (javax.jms.JMSException jmse)
{
System.err.println("error: Cannot connect to Broker - " + broker);
jmse.printStackTrace();
System.exit(1);
}
// Create the Queue and QueueRequestor for sending requests.
javax.jms.Queue queue = null;
try
{
queue = session.createQueue (sQueue);
requestor = new javax.jms.QueueRequestor(session, queue);
// Now that all setup is complete, start the Connection.
connect.start();
}
catch (javax.jms.JMSException jmse)
{
jmse.printStackTrace();
exit();
}
try
{
// Read all standard input and send it as a message.
java.io.BufferedReader stdin =
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
System.out.println ("\nRequestor application:\n"
+ "============================\n"
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
+ "The application uses a QueueRequestor to on the " + DEFAULT_QUEUE + " queue."
+ "The Replier application gets the message, and transforms it."
+ "The Requestor application displays the result.\n\n"
+ "Type some mixed case text, and then press Enter to make a request.\n");
while ( true )
{
String s = stdin.readLine();
if ( s == null )
exit();
else if ( s.length() > 0 )
{
javax.jms.TextMessage msg = session.createTextMessage();
msg.setText( username + ": " + s );
// Instead of sending, we will use the QueueRequestor.
javax.jms.Message response = requestor.request(msg);
// The message should be a TextMessage. Just report it.
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) response;
System.out.println( "[Reply] " + textMessage.getText() );
}
}
}
catch ( java.io.IOException ioe )
{
ioe.printStackTrace();
}
catch ( javax.jms.JMSException jmse )
{
jmse.printStackTrace();
}
}
/** Cleanup resources cleanly and exit. */
private void exit()
{
try
{
requestor.close();
connect.close();
}
catch (javax.jms.JMSException jmse)
{
jmse.printStackTrace();
}
System.exit(0);
}
//
// NOTE: the remainder of this sample deals with reading arguments
// and does not utilize any JMS classes or code.
//
/** Main program entry point. */
public static void main(String argv[]) {
// Values to be read from parameters
String broker = DEFAULT_BROKER_NAME;
String username = DEFAULT_USER_NAME;
String password = DEFAULT_PASSWORD;
String queue = DEFAULT_QUEUE;
// Check parameters
for (int i = 0; i < argv.length; i++) {
String arg = argv[i];
if (arg.equals("-b")) {
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
System.err.println("error: missing broker name:port");
System.exit(1);
}
broker = argv[++i];
continue;
}
if (arg.equals("-u")) {
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
System.err.println("error: missing user name");
System.exit(1);
}
username = argv[++i];
continue;
}
if (arg.equals("-p")) {
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
System.err.println("error: missing password");
System.exit(1);
}
password = argv[++i];
continue;
}
if (arg.equals("-qs")) {
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
System.err.println("error: missing queue");
System.exit(1);
}
queue = argv[++i];
continue;
}
if (arg.equals("-h")) {
printUsage();
System.exit(1);
}
// Invalid argument
System.err.println ("error: unexpected argument: "+arg);
printUsage();
System.exit(1);
}
// Start the JMS client for sending requests.
Requestor requestor = new Requestor();
requestor.start (broker, username, password, queue);
}
/** Prints the usage. */
private static void printUsage() {
StringBuffer use = new StringBuffer();
use.append("usage: java Requestor (options) ...\n\n");
use.append("options:\n");
use.append(" -b name:port Specify name:port of broker.\n");
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
use.append(" -u name Specify unique user name.\n");
use.append(" Default broker: "+DEFAULT_USER_NAME+"\n");
use.append(" -p password Specify password for user.\n");
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
use.append(" -qs queue Specify name of queue for sending.\n");
use.append(" Default queue: "+DEFAULT_QUEUE+"\n");
use.append(" -h This help screen.\n");
System.err.println (use);
}
}