[原创]JMS点对点消息模型(queue)_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
3
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3649 | 回复: 2   主题: [原创]JMS点对点消息模型(queue)        下一篇 
xiuwen.zhao
高级会员
等级:上尉
经验:668
发帖:38
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xiuwen.zhao 加好友    发送短消息息给xiuwen.zhao 发消息
发表于: IP:您无权察看 2014-9-8 21:46:48 | [全部帖] [楼主帖] 楼主

1.JMS概述

JMS是JavaEE技术规范中的一个重要组成部分,它是一种企业消息处理的规范。JMS提供了一组通用的Java应用程序接口(API),开发者可以通过这种通用的API来创建、发送、接收、读取消息,JMS是一种与具体实现厂商无关的API,不管底层采用何种消息服务器实现,应用程序总是面向通用的JMS API编程。

JMS主要支持两种消息模型:点对点消息模型(PTP)和发布/订阅消息模型(pub/sub)。点对点消息模型只能把消息传递给一个消息消费者,而发布/订阅模型可以将消息传递给多个消息消费者。

2.点对点消息模型

在点对点消息模型中,消息发送者将消息发送到一个特定的队列,而消息消费者从这个特定的队列中获取消息。

多个消息发送者和多个消息消费者可以与同一个队列相关联,但是一个单独的消息只能有一个消息消费者接收。

如果有多个消息消费者监听同一个队列中的消息时,WebLogic JMS本着先到先服务的原则,确定哪个消息消费者会收到下一条消息。如果没有消息消费者监听队列,消息保留在队列中,直到消息消费者连接到队列中。

3.编程实例

我们在WebLogic服务器中配置了一个JNDI名为“queue”的消息队列,它可以作为PTP消息模型的消息目的地来使用。WebLogic服务器中提供了默认的连接工厂,其JNDI名为“weblogic.jms.ConnectionFactory”。

向消息队列发送消息的程序如下:

public class QueueMessageSender{
      public void sendMessage() throws Exception{
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            Context ctx = getInitialContext();
            ConnectionFactory connFactory = (ConnectionFactory)ctx.lookup(CONNECTION_FACTORY_JNDI);
            Destination dest = (Destination)ctx.lookup("queue");
            Connection conn = connFactory.createConnection();
            Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer sender = session.createProducer(dest);
            sender.setDeliveryMode(DeliveryMode.PERSISTENT);
            sender.setTimeToLive(20000);
            TextMessage msg = session.createTextMessage();
            msg.setText("Hello JMS");
            sender.send(msg);
            msg.setText("The time is "+new Date().toString());
            sender.send(msg);
            session.close();
            conn.close();
      }
      private Context getInitialContext(){
            final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
            final String SERVER_URL = "t3://localhost:7001";
            Context ctx = null;
            try{
                  Properties props = new Properties();
                  props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
                  props.put(Context.PROVIDER_URL, SERVER_URL);
                  ctx = new InitialContext(props);
            }catch(NamingException ne){
            System.out.println("can't connect the WebLogic " + SERVER_URL);
            ne.printStackTrace();
      }
      return ctx;
}
public static void main(String[] args) throws Exception{
      QueueMessageSender mp = new QueueMessageSender();
      mp.sendMessage();
}
}


从消息队列中同步读取消息的程序如下:

public class SyncConsumer {
      public void receiveMessage() throws Exception {
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            Context ctx = getInitialContext();
            ConnectionFactory connFactory = (ConnectionFactory) ctx
            .lookup(CONNECTION_FACTORY_JNDI);
            Destination dest = (Destination) ctx.lookup("queue");
            Connection conn = connFactory.createConnection();
            conn.start();
            Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageConsumer receiver = session.createConsumer(dest);
            TextMessage msg = (TextMessage) receiver.receive();
            System.out.println(msg);
            System.out.println("The message: " + msg.getText());
            session.close();
            conn.close();
      }
      private Context getInitialContext() {
            final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
            final String SERVER_URL = "t3://localhost:7001";
            Context ctx = null;
            try {
                  Properties props = new Properties();
                  props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
                  props.put(Context.PROVIDER_URL, SERVER_URL);
                  ctx = new InitialContext(props);
            } catch (NamingException ne) {
                  System.out.println("can't connect the WebLogic " + SERVER_URL);
                  ne.printStackTrace();
            }
            return ctx;
      }
      public static void main(String[] args) throws Exception {
            SyncConsumer mp = new SyncConsumer();
            mp.receiveMessage();
      }
}




赞(0)    操作        顶端 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2014-10-15 17:56:37 | [全部帖] [楼主帖] 2  楼

楼主,有几个问题想请教一下
1、你的帖子 
JMS配置过程图解中配置的JMS服务器该怎么使用?“我们在WebLogic服务器中配置了一个JNDI名为“queue”的消息队列” 我可以理解为在使用该JMS 服务器吧?

2、你这里给出的代码 是直接 在java 中运行的,它该 和 webLogic 配置的JMS 服务器有关系吗?

     我直接运行报如下错误,该怎么改正?

can't connect the WebLogic t3://localhost:7001
javax.naming.NoInitialContextException: Cannot instantiate class: weblogic.jndi.WLInitialContextFactory [Root exception is java.lang.ClassNotFoundException: weblogic.jndi.WLInitialContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.init(InitialContext.java:242)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at com.ppnie.lession1015.TopicMessageSender.getInitialContext(TopicMessageSender.java:45)
at com.ppnie.lession1015.TopicMessageSender.sendMessage(TopicMessageSender.java:19)
at com.ppnie.lession1015.TopicMessageSender.main(TopicMessageSender.java:55)



赞(0)    操作        顶端 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2014-10-24 15:56:57 | [全部帖] [楼主帖] 3  楼

对于楼上的问题,你可以这么理解:

JMS服务器是配置在WebLogic 上的,你使用java 直接去访问的话就要先连接到 你启动的WebLogic 服务器上

运行报: javax.naming.NoInitialContextException: Cannot instantiate class: weblogic.jndi.WLInitialContextFactory [Root exception is java.lang.ClassNotFoundException: weblogic.jndi.WLInitialContextFactory]

错误原因:未导入相关类,你需要导入相关的WebLogic架包。修改方法:导入D:\Program Files\WebLogic\wlserver_12.1\server\lib\Weblogic.jar

在WebLogic中配置好了JMS服务器,你在代码中直接调用JMS相关的方法就可以使用了,而代码与所配置服务器就是通过消息队列的JNDI名来关联的。



赞(0)    操作        顶端 
总帖数
3
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论