User: hiram
Date: 00/11/28 16:19:34
Added: examples/client TestClient.java TestListener.java
Log:
Chanaged the spyderMQ standalone server so that it is a stripped down jBoss app
server with
the spyderMQ service running. This will allow us to work on integrating with jBoss
better and
in spyderMQ can now use many of the base features of the app server such as Logging,
Naming,
JMX, Configuration, etc.
Revision Changes Path
1.1 spyderMQ/examples/client/TestClient.java
Index: TestClient.java
===================================================================
/*
* spyderMQ, the OpenSource JMS implementation
*
* Distributable under GPL license.
* See terms of license at gnu.org.
*/
package client;
import javax.jms.TopicPublisher;
import javax.jms.QueueSender;
import javax.jms.TopicSession;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.jms.MessageConsumer;
import javax.jms.TopicSubscriber;
import javax.jms.QueueReceiver;
import javax.jms.TopicConnectionFactory;
import javax.jms.BytesMessage;
import javax.jms.QueueConnectionFactory;
import javax.jms.TopicConnection;
import javax.jms.QueueConnection;
import javax.jms.DeliveryMode;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.Queue;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Vector;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
//This is a very simple parser which uses the JMS server : it can dynamically use
JMS objects
//
//Commands:
//- object.method(param[,...])
// where param is an object, a string, a boolean or an integer
// invoke the selected method on the object
// ex: session.createTopic("myTopic")
// connection.createTopicSession(false,1);
//
//- result=object.method(param[,...])
// store the result of the method in the variable 'result'
// ex: ID=connection.getClientID()
//
//- Some macros exist :
// pub(name of the topic,text of the msg) //send a TextMessage to a topic
// newSubscriber=sub(name of the topic) //create a new TopicSubscriber for this
topic
// subscriber.listen() //create a listener for this MessageConsumer
//
//- When TestClient starts, it creates one connection (c), and one session (s)
public class TestClient
{
static Properties prop;
static boolean assign;
static String where;
static int val;
static Object obj;
static TopicPublisher publisherTopic;
static TopicSession sessionTopic;
static QueueSender publisherQueue;
static QueueSession sessionQueue;
static InitialContext initialContext;
//if the command is a macro ( obj.macro() or macro() ), expand it
static boolean macro(String str,Object[] objects,Object[] names) throws
Exception
{
if (str.equals("pubq")) {
Queue dest =
(Queue)initialContext.lookup("queue/"+(String)objects[0]);
TextMessage content=sessionQueue.createTextMessage();
content.setText((String)objects[1]);
publisherQueue.send(dest,content);
return true;
}
if (str.equals("pub")) {
Topic dest =
(Topic)initialContext.lookup("topic/"+(String)objects[0]);
TextMessage content=sessionTopic.createTextMessage();
content.setText((String)objects[1]);
publisherTopic.publish(dest,content);
return true;
}
if (str.equals("pub2")) {
Topic dest =
(Topic)initialContext.lookup("topic/"+(String)objects[0]);
BytesMessage bytesmsg1 = sessionTopic.createBytesMessage();
byte[] data = new byte[100*1024];
bytesmsg1.writeBytes (data, 0 , 10*1024);
publisherTopic.publish(dest,bytesmsg1);
return true;
}
if (str.equals("listen")) {
TestListener listener=new TestListener(val++);
((MessageConsumer)obj).setMessageListener(listener);
return true;
}
if (str.equals("unlisten")) {
((MessageConsumer)obj).setMessageListener(null);
return true;
}
if (str.equals("subq")) {
Queue dest =
(Queue)initialContext.lookup("queue/"+(String)objects[0]);
QueueReceiver sub=sessionQueue.createReceiver(dest);
prop.put(where,sub);
return true;
}
if (str.equals("sub")) {
Topic dest =
(Topic)initialContext.lookup("topic/"+(String)objects[0]);
TopicSubscriber sub=sessionTopic.createSubscriber(dest);
prop.put(where,sub);
return true;
}
return false;
}
static Method searchForMethod(Object obj,String methodName,Class[] classArray)
throws NoSuchMethodException
{
Method method[]=obj.getClass().getMethods();
for(int i=0;i<method.length;i++) {
if (!method[i].getName().equals(methodName)) continue;
Class[] act=method[i].getParameterTypes();
if (act.length!=classArray.length) continue;
for(int j=0;j<act.length;j++)
if (!act[j].isAssignableFrom(classArray[j])) continue;
return method[i];
}
throw new NoSuchMethodException();
}
static void execute(String s) throws Exception
{
assign=false;
where="";
obj=null;
String methodName=null;
if (s.equals("q")) {
System.exit(0);
}
StringTokenizer st = new StringTokenizer(s," (),.\"=",true);
String cmd=st.nextToken();
String next=st.nextToken(); // . or = or (
if (next.equals("="))
{
assign=true;
where=cmd;
cmd=st.nextToken();
next=st.nextToken();
if (!next.equals(".")) {
if (next.equals("(")) {
//this is a=Macro(...)
methodName=cmd;
} else throw new RuntimeException("Syntax error (.)");
}
}
if (methodName==null)
if (!next.equals("(")) {
obj=prop.get(cmd);
if (obj==null) throw new RuntimeException("Unknown
object '"+cmd+"'");
methodName=st.nextToken(); // this is the method name
cmd=st.nextToken(); // (
if (!cmd.equals("(")) throw new RuntimeException("Bad
syntax");
} else {
//this is a macro call : Macro(...)
methodName=cmd;
}
Vector objects=new Vector();
Vector names=new Vector();
Vector classes=new Vector();
while (true) {
cmd=st.nextToken();
if (cmd.equals(" ")) continue;
if (cmd.equals(",")) continue;
if (cmd.equals(")")) break;
if (cmd.equals("\"")) {
String str="";
cmd=st.nextToken();
while (!cmd.equals("\"")) {
str+=cmd;
cmd=st.nextToken();
}
names.add(str);
objects.add(str);
classes.add(String.class);
continue;
}
names.add(cmd);
if (Character.isDigit(cmd.charAt(0))) {
//an integer
objects.add(new Integer(Integer.parseInt(cmd)));
classes.add(Integer.TYPE);
} else if (cmd.equals("true")) {
//true
objects.add(Boolean.TRUE);
classes.add(Boolean.TYPE);
} else if (cmd.equals("false")) {
//false
objects.add(Boolean.FALSE);
classes.add(Boolean.TYPE);
} else {
//This is an object
Object argument=prop.get(cmd);
if (argument==null) throw new
RuntimeException("Unknown object '"+cmd+"'");
objects.add(argument);
classes.add(argument.getClass());
}
}
if (macro(methodName,objects.toArray(),names.toArray())) return;
if (obj==null) throw new RuntimeException("You must provide an object
name");
Class[] classArray=(Class[])classes.toArray(new
Class[classes.size()]);
Method method=searchForMethod(obj,methodName,classArray);
Object res=method.invoke(obj,objects.toArray());
if (assign) {
if (res==null) System.out.println("The return type is (void)
!");
else {
System.out.println(s+" : "+where+" :=
"+res.toString());
prop.put(where,res);
}
} else if (res!=null) {
System.out.println(s+" : "+res.toString());
} else {
System.out.println(s+" : (void)");
}
}
public static void main(String[] args) throws Exception
{
BufferedReader d = new BufferedReader(new
InputStreamReader(System.in));
prop=new Properties();
initialContext = new InitialContext();
TopicConnectionFactory factoryTopic =
(TopicConnectionFactory)initialContext.lookup("TopicConnectionFactory");
TopicConnection connectionTopic =
factoryTopic.createTopicConnection("sahra","spot");
sessionTopic =
connectionTopic.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
publisherTopic = sessionTopic.createPublisher(null);
publisherTopic.setDeliveryMode(DeliveryMode.PERSISTENT);
prop.put("ct",connectionTopic);
prop.put("st",sessionTopic);
QueueConnectionFactory factoryQueue =
(QueueConnectionFactory)initialContext.lookup("QueueConnectionFactory");
QueueConnection connectionQueue =
factoryQueue.createQueueConnection("sahra","spot");
sessionQueue =
connectionQueue.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
publisherQueue = sessionQueue.createSender(null);
prop.put("cq",connectionQueue);
prop.put("sq",sessionQueue);
while (true) {
try {
execute(d.readLine());
System.out.println("---");
} catch (NoSuchElementException e) {
System.out.println("Bad syntax...");
} catch (NoSuchMethodException e) {
System.out.println("This method does not exist !");
} catch (InvocationTargetException e) {
//This is not our fault !
e.printStackTrace();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
}
1.1 spyderMQ/examples/client/TestListener.java
Index: TestListener.java
===================================================================
/*
* spyderMQ, the OpenSource JMS implementation
*
* Distributable under GPL license.
* See terms of license at gnu.org.
*/
package client;
import javax.jms.MessageListener;
import javax.jms.Message;
/**
* A very simple MessageListener for the TestClient object
*
* @author Norbert Lataille ([EMAIL PROTECTED])
*
* @version $Revision: 1.1 $
*/
public class TestListener
implements MessageListener
{
int num;
TestListener(int n)
{
num=n;
}
public void onMessage(Message message)
{
System.out.println("MessageListener "+num+" :
OnMessage("+message.toString()+")");
}
}