JMS理论部分太多,不能说太细,否则扯太远,看官们也不喜欢,不过下面这个可以看看
http://www.cnblogs.com/GeneralXU/archive/2010/05/11/1732852.html
程序环境 weblogic10.3.2.0(11g) eclipse Indigo
JMS程序三大步:
1. 创建JMS server
启动weblogic后,进入控制台,在左边点击Service--Messaging--JMS Servers
(如果大家的weblogic控制台是中文的,想改成英文或其他什么鸟语,请看我写的这个 http://coderanch.iteye.com/blog/1610208)
jms server的创建,没什么说的,一路next,都默认就行,不过最后一步要选target为AdminServer,
完成之后如下:
2. 创建JMS Modules
这个也没啥说的,一路默认,同样在完成前要选target为AdminServer,其他的像什么Descriptor File Name,Location In Domain,我的这程序都不用管它们,空白就行。另外,在完成前有个选择问你要不要马上添加resource,这个可选可不选,反正等下要添加。完成后是下面的样子:
3. 创建connection 和 queue,这一步在这个程序里老重要了。
在console的左边列表树中点JMS Modules,点你刚建好的那个Module,进去后:
1. 创建connectionFactory
new--> connection Factory,名字保持默认, JNDI name就取为factory,这个jndi名称随便,不过下面程序中要用到,一致就行了。
2.创建Queue new-->Queue-->next-->JNDI name "testqueue",template-->none,
next之后, 在Subdeployments那,点Create a New Subdeployment,名字就用默认的Queue-0,点击OK回来后,targes那里一定要勾选刚才新建的JMSServer,之后完成就行了。
完成之后,新建的JMS Module下面的resources下面是这样的(重要的地方着色了,新建时注意下就行了):
好了,下面用程序来测试。
我们这个程序是测试发送对象的,其他的像发送textMessage啊,StreamMessage啊,较简单,就忽略了。
类UserInfo:
package com.test.jms; import java.io.Serializable; public class UserInfo implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String name; private String address; private String gender; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
类QueueSend
package com.test.jms; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Hashtable; import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.StreamMessage; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class QueueSend { // Defines the JNDI context factory. public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; // Defines the JNDI provider url. public final static String PROVIDER_URL = "t3://localhost:7001"; //这里要同你的本地配置 // Defines the JMS connection factory for the queue. public final static String JMS_FACTORY = "javax.jms.QueueConnectionFactory"; // Defines the queue 用的是对应 QUEUE的JNDI名子 public final static String QUEUE = "testqueue"; //这里也要同你上面设置的Queue JNDI一致 private QueueConnectionFactory qconFactory; private QueueConnection qcon; private QueueSession qsession; private QueueSender qsender; private Queue queue; private TextMessage msg; private StreamMessage sm; private BytesMessage bm; private MapMessage mm; private ObjectMessage om; /** * Creates all the necessary objects for sending messages to a JMS queue. * * @param ctx * JNDI initial context * @param queueName * name of queue * @exception NamingException * if operation cannot be performed * @exception JMSException * if JMS fails to initialize due to internal error */ public void init(Context ctx, String queueName) throws NamingException, JMSException { qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); qcon = qconFactory.createQueueConnection(); qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.lookup(queueName); qsender = qsession.createSender(queue); /* msg = qsession.createTextMessage(); sm = qsession.createStreamMessage(); bm = qsession.createBytesMessage(); mm = qsession.createMapMessage(); */ om = qsession.createObjectMessage(); qcon.start(); } /** * Sends a message to a JMS queue. * * @param message * message to be sent * @exception JMSException * if JMS fails to send message due to internal error */ public void send(String message) throws JMSException { // set TextMessage //msg.setText(message); // set BytesMessage String input = message; String name = input.split(" ")[0]; String address = input.split(" ")[1]; String gender = input.split(" ")[2]; // set ObjectMessage UserInfo ui = new UserInfo(); ui.setName(name); ui.setAddress(address); ui.setGender(gender); om.setObject(ui); qsender.send(om); } /** * Closes JMS objects. * * @exception JMSException * if JMS fails to close objects due to internal error */ public void close() throws JMSException { qsender.close(); qsession.close(); qcon.close(); } public static void main(String[] args) throws Exception { InitialContext ic = getInitialContext(); QueueSend qs = new QueueSend(); qs.init(ic, QUEUE); readAndSend(qs); qs.close(); } private static void readAndSend(QueueSend qs) throws IOException, JMSException { BufferedReader msgStream = new BufferedReader(new InputStreamReader( System.in)); String line = null; boolean quitNow = false; do { System.out.print("Enter message (\"quit\" to quit): "); line = msgStream.readLine(); if (line != null && line.trim().length() != 0) { qs.send(line); System.out.println("JMS Message Sent: " + line + "\t"); quitNow = line.equalsIgnoreCase("quit"); } } while (!quitNow); } private static InitialContext getInitialContext() throws NamingException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.put(Context.PROVIDER_URL, PROVIDER_URL); return new InitialContext(env); } }
类QueueReceive
package com.test.jms; import java.util.Hashtable; import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.StreamMessage; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class QueueReceive implements MessageListener { // Defines the JNDI context factory. public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; // Defines the JNDI provider url. public final static String PROVIDER_URL = "t3://localhost:7001"; // Defines the JMS connection factory for the queue. public final static String JMS_FACTORY = "javax.jms.QueueConnectionFactory"; // Defines the queue 用的是对应 QUEUE的JNDI名子 public final static String QUEUE = "testqueue"; private QueueConnectionFactory qconFactory; private QueueConnection qcon; private QueueSession qsession; private QueueReceiver qreceiver; private Queue queue; private boolean quit = false; /** * Message listener interface. * * @param msg * message */ public void onMessage(Message msg) { try { String msgText = ""; String name; String address; String gender; if (msg instanceof TextMessage) { msgText = ((TextMessage) msg).getText(); } else if (msg instanceof ObjectMessage) { UserInfo ui = (UserInfo) ((ObjectMessage) msg).getObject(); name = ui.getName(); address = ui.getAddress(); gender = ui.getGender(); System.out.println("Message Received: " + name + "\t" + address + "\t" + gender); } if (msgText.equalsIgnoreCase("quit")) { synchronized (this) { quit = true; this.notifyAll(); // Notify main thread to quit } } } catch (JMSException jmse) { jmse.printStackTrace(); } } /** * Creates all the necessary objects for receiving messages from a JMS * queue. * * @param ctx * JNDI initial context * @param queueName * name of queue * @exception NamingException * if operation cannot be performed * @exception JMSException * if JMS fails to initialize due to internal error */ public void init(Context ctx, String queueName) throws NamingException, JMSException { qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); qcon = qconFactory.createQueueConnection(); qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.lookup(queueName); qreceiver = qsession.createReceiver(queue); qreceiver.setMessageListener(this); qcon.start(); } /** * Closes JMS objects. * * @exception JMSException * if JMS fails to close objects due to internal error */ public void close() throws JMSException { qreceiver.close(); qsession.close(); qcon.close(); } /** * main() method. * * @param args * WebLogic Server URL * @exception Exception * if execution fails */ public static void main(String[] args) throws Exception { InitialContext ic = getInitialContext(); QueueReceive qr = new QueueReceive(); qr.init(ic, QUEUE); System.out .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message)."); // Wait until a "quit" message has been received. synchronized (qr) { while (!qr.quit) { try { qr.wait(); } catch (InterruptedException ie) { ie.printStackTrace(); } } } qr.close(); } private static InitialContext getInitialContext() throws NamingException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.put(Context.PROVIDER_URL, PROVIDER_URL); return new InitialContext(env); } }
最后要注意一点是,发送消息时,我这个程序的输入格式是这样的:aa空格bb空格cc
中间要加空格,因为用空格来区分UserInfo的三个不同属性.
发送消息如下:
接收消息如下:
另外,oracle公司的这篇文章值得一读,不过太罗嗦,我没读完哈,哪天有空读完了再写:
http://docs.oracle.com/cd/E13222_01/wls/docs90/jms/implement.html
最最后要说的一句是:iteye,你的编辑器一如继往的难用,吐血啊,刚刚的。。。