首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

小弟我的JMS第一个程序

2012-11-14 
我的JMS第一个程序今天无事看了看JMS,遵循网上的一些相关代码,修改修改,终于完成了我的JMS处女作。JMS理论

我的JMS第一个程序
今天无事看了看JMS,遵循网上的一些相关代码,修改修改,终于完成了我的JMS处女作。
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,你的编辑器一如继往的难用,吐血啊,刚刚的。。。







不错 ,不过呢提点个人建议第一:建一个managerserver(anyway 一个部署应用或者queue的server, 端口自设),adminserver是用来监控和管理其他server的;第二:queue名和jndi名最好一样(这个在你以后queue对了或者做成集群的时候会发现编程方便很多),子部署名字Cluster最好别和queue名一样!个人建议而已!

热点排行