基于Weblogic8的JMS队列实例配置

来源:互联网 发布:php datezone 编辑:程序博客网 时间:2024/05/29 09:57

基于Weblogic8的JMS队列实例配置

    博客分类: 
  • JMS
jmsweblogicquartzjava 

预计达成目标:Weblogic8下实现消息的异步传输与监听

 

为了实现不间断发送与监听,使用了Quartz自动调度,这个不是这篇文章重点,不做讲解,也可以将quartz去掉

quartz引用的jar包比较多,这里就不作为附件了,只上传jms需要依赖的jar包 ,其中还有weblogic.jar,太大了就没有上传,可以在weblogic的安装bin目录下找到. 

 

配置步骤

一、建立 Weblogic Domain:建立步骤不再累述

二、在Console控制台配置连接工厂与消息队列

      1、配置连接工厂 

        

  按如下路径点击:Service—>JMS—> Connection Factories,在右侧弹出的页面,点击链接“Configure a new JMS Connection Factory...”,在新页面中输入Name及JNDI Name,此处两处均输入连接工厂名为:jms/connFactory,点击“Create”则生成JMS连接工厂

    如下图:

     

 

 

 

       2、配置消息队列

      如下图位置配置队列,这个jmsServer是自己建立的

 

         

 

 

到此位置就配置了一个 名称为 jms/connFactory   连接工厂以及名为 queueasd 的队列

 

 

三、消息发送测试类

 

Java代码  收藏代码
  1. package com.javasd.jms;  
  2.   
  3. import java.util.Properties;  
  4.   
  5. import javax.jms.BytesMessage;  
  6. import javax.jms.Queue;  
  7. import javax.jms.QueueConnection;  
  8. import javax.jms.QueueConnectionFactory;  
  9. import javax.jms.QueueSender;  
  10. import javax.jms.QueueSession;  
  11. import javax.jms.Session;  
  12. import javax.naming.Context;  
  13. import javax.naming.InitialContext;  
  14.   
  15. import org.quartz.CronTrigger;  
  16. import org.quartz.Job;  
  17. import org.quartz.JobDetail;  
  18. import org.quartz.JobExecutionContext;  
  19. import org.quartz.JobExecutionException;  
  20. import org.quartz.Scheduler;  
  21. import org.quartz.SchedulerFactory;  
  22. import org.quartz.impl.StdSchedulerFactory;  
  23.   
  24. public class TestJmsConnection implements Job {  
  25.       
  26.     public static void main(String args[]) throws Exception {  
  27.           
  28.         //quartz调度,不做讲解  
  29.         SchedulerFactory schedFact=new StdSchedulerFactory();  
  30.         Scheduler sched=schedFact.getScheduler();  
  31.         sched.start();  
  32.           
  33.           
  34.         JobDetail jobDetail=new JobDetail("a","b",TestJmsConnection.class);  
  35.         jobDetail.getJobDataMap().put("name","lucy");  
  36.          
  37.         CronTrigger trigger=new  CronTrigger("c","d");  
  38.         trigger.setCronExpression("0/100 * * * * ? " ); // 启动之后立即执行 每一秒继续重复。  
  39.         sched.scheduleJob(jobDetail, trigger);  
  40.               
  41.           
  42.     }  
  43.   
  44.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  45.           
  46.         try{  
  47.               
  48.               
  49.             //这里才是jms发送端的逻辑  
  50.             Properties properties = new Properties();  
  51.             //设置连接属性  
  52.             //这个设置是固定的  
  53.             properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");  
  54.             //设置端口及IP 我的domain在本地,端口为9001  
  55.             properties.put(Context.PROVIDER_URL, "t3://localhost:9001");  
  56.             //与weblogic的console用户名密码一致  
  57.             properties.put(Context.SECURITY_PRINCIPAL, "weblogic");  
  58.             properties.put(Context.SECURITY_CREDENTIALS, "weblogic");  
  59.             //实例化上下文  
  60.             Context ctx = new InitialContext(properties);  
  61.                   
  62.                 //获取连接工厂  
  63.                 QueueConnectionFactory queueFactory = (QueueConnectionFactory)ctx.lookup("jms/connFactory");  
  64.                 //根据连接工厂获取连接  
  65.                 QueueConnection queueConn = queueFactory.createQueueConnection();  
  66.                 //根据连接获取操作的session实例  
  67.                 QueueSession qSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);  
  68.                 //通过上下文jndi查找配置的队列,我配置的队列名称及jndi名称均为 queueasd  
  69.                 Queue queue = (Queue)ctx.lookup("queueasd");  
  70.                 //通过session以及指定的队列实例化消息发送器  
  71.                 QueueSender queueSender = qSession.createSender(queue);  
  72.                 //打开连接  
  73.                 queueConn.start();  
  74.                   
  75.                 //测试用要发送的字符串  
  76.                 String s = "just test sending of jms under weblogic8!";  
  77.                 //转换为byte数组  
  78.                 byte[] bytes = s.getBytes();  
  79.                 int byteLength = bytes.length;  
  80.                 //通过session的createBytesMessage方法实例化一个jms识别的消息实体对象  
  81.                 BytesMessage bytesMessage = qSession.createBytesMessage();   
  82.                 //为这个message对象设置值  
  83.                 //设置消息的长度  
  84.                 bytesMessage.writeInt(byteLength);  
  85.                 //设置消息的内容  
  86.                 bytesMessage.writeBytes(bytes);  
  87.                 //发送消息  
  88.                 queueSender.send(bytesMessage);  
  89.         } catch(Exception e ){  
  90.             e.printStackTrace();  
  91.         }  
  92.           
  93.           
  94.     }  
  95.       
  96.       
  97.       
  98. }  

 

        

 四、消息接收类

Java代码  收藏代码
  1. package com.javasd.jms;  
  2.   
  3. import java.util.Properties;  
  4.   
  5. import javax.jms.BytesMessage;  
  6. import javax.jms.JMSException;  
  7. import javax.jms.Message;  
  8. import javax.jms.MessageListener;  
  9. import javax.jms.Queue;  
  10. import javax.jms.QueueConnection;  
  11. import javax.jms.QueueConnectionFactory;  
  12. import javax.jms.QueueReceiver;  
  13. import javax.jms.QueueSession;  
  14. import javax.jms.Session;  
  15. import javax.naming.Context;  
  16. import javax.naming.InitialContext;  
  17. import javax.naming.NamingException;  
  18.   
  19. import org.quartz.CronTrigger;  
  20. import org.quartz.Job;  
  21. import org.quartz.JobDetail;  
  22. import org.quartz.JobExecutionContext;  
  23. import org.quartz.JobExecutionException;  
  24. import org.quartz.Scheduler;  
  25. import org.quartz.SchedulerFactory;  
  26. import org.quartz.impl.StdSchedulerFactory;  
  27.   
  28.   
  29. public class TestJmsReceive implements Job{  
  30.   
  31.     public static void main(String args[]) throws Exception {  
  32.           
  33.         try{  
  34.             //quartz  
  35.             SchedulerFactory schedFact=new StdSchedulerFactory();  
  36.             Scheduler sched=schedFact.getScheduler();  
  37.             sched.start();  
  38.               
  39.               
  40.             JobDetail jobDetail=new JobDetail("a","b",TestJmsReceive.class);  
  41.             jobDetail.getJobDataMap().put("name","lucy");  
  42.              
  43.             CronTrigger trigger=new  CronTrigger("c","d");  
  44.             trigger.setCronExpression("0/5 * * * * ? " ); // 启动之后立即执行 每一秒继续重复。  
  45.             sched.scheduleJob(jobDetail, trigger);  
  46.   
  47.               
  48.               
  49.         } catch(Exception e){  
  50.               
  51.         }  
  52.           
  53.          
  54.           
  55.           
  56.           
  57.           
  58.     }  
  59.   
  60.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  61.           
  62.         //与sender中的定义一样,在实际应用中可以考虑单独讲这些设置为静态变量  
  63.         Properties properties = new Properties();  
  64.         properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");  
  65.         properties.put(Context.PROVIDER_URL, "t3://localhost:9001");  
  66.         properties.put(Context.SECURITY_PRINCIPAL, "weblogic");  
  67.         properties.put(Context.SECURITY_CREDENTIALS, "weblogic");  
  68.           
  69.           
  70.         Context ctx = null;  
  71.         QueueConnection qConn = null;  
  72.         QueueConnectionFactory queueFactory = null;  
  73.         QueueSession qSession = null;  
  74.         Queue queue = null;  
  75.           
  76.         QueueReceiver qreceiver = null;  
  77.         try {  
  78.             ctx = new InitialContext(properties);  
  79.             queueFactory = (QueueConnectionFactory)ctx.lookup("jms/connFactory");  
  80.             qConn = queueFactory.createQueueConnection();  
  81.             qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);  
  82.             queue = (Queue) ctx.lookup("queueasd");  
  83.             //从这里开始与sender有差别  
  84.             //用指定的队列构造Receiver  
  85.             qreceiver = qSession.createReceiver(queue);  
  86.             //为这个receiver设置监听器MessageListener,使用的内部类  
  87.               
  88.             qreceiver.setMessageListener(new MessageListener() {  
  89.                 public void onMessage(Message msg)  {  
  90.                     //如果接收到的消息是byte类型的message,可以使text等类型,这个可以自己尝试  
  91.                     if(msg instanceof BytesMessage){  
  92.                         //转换为jms识别的消息对象  
  93.                         BytesMessage bytesMessage = (BytesMessage)msg;  
  94.                         try {  
  95.                             int length = bytesMessage.readInt();  
  96.                               
  97.                             byte[] bytes = new byte[length];  
  98.                             //获取传送过来的消息  
  99.                             bytesMessage.readBytes(bytes);  
  100.                             //将消息进行展现  
  101.                             String s = new String(bytes);  
  102.                             System.out.println(s);  
  103.                               
  104.                         } catch (JMSException e) {  
  105.                             // TODO Auto-generated catch block  
  106.                             e.printStackTrace();  
  107.                         }  
  108.                           
  109.                     }  
  110.                       
  111.                 }  
  112.         }  
  113. );  
  114.             //开启连结进行监听  
  115.             qConn.start();  
  116.   
  117.               
  118.         } catch (Exception e1) {  
  119.             // TODO Auto-generated catch block  
  120.             e1.printStackTrace();  
  121.         }  
  122.           
  123.     }  
  124. }  

 

 

这样就完成了一个最基本的JMS消息发送以及接收的测试实例,在实际项目应用中项目组用到的jms对连接池以及多线程进行了优化,但是在应对实际情况的时候还是力不从心,不知大家怎么实现这个jms规范的亦或者是有更好的技术解决方案,望不吝赐教