JMS中的topic消息_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2429 | 回复: 1   主题: JMS中的topic消息        下一篇 
nengqiang.wang
注册用户
等级:中校
经验:1658
发帖:34
精华:0
注册:1970-1-1
状态:离线
发送短消息息给nengqiang.wang 加好友    发送短消息息给nengqiang.wang 发消息
发表于: IP:您无权察看 2015-8-14 14:01:51 | [全部帖] [楼主帖] 楼主

1 发布/订阅模式

    在发布 / 订阅式的消息发送中,一个发布者利用一个方法调用将每条消息发送给多个预订者。介于发布者和预 订者之间的是一台消息服务器。在JMS中,消息服务器被叫做“JMS提供者”。发布者发送消息到JMS提供者,预订者从JMS提供者接收消息。在JMS中,发布/订阅式的消息发送使用JMS管理的一个叫做Topic的对象来管理发布者到预订者的消息流。JMS发布者又叫做消息生产者,而 JMS预订者又叫做消息消费者。消息生产者获得服务器上一个JMS Topic的引用,并向该Topic发送消息。当消息到达时,JMS提供者负责通知所有预订了该Topic的消息消费者。JMS提供者每次发送消息后将接收到消息收据的确认。

2 在weblogic中找到JMS模块,新建主题,主题名称为“topic”,JNDI名称为“jmstopic”。


北京联动北方科技有限公司

3 消息发布者

package com.wnq.send;


import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Message;
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.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JmsTopicSend {
      public static void main(String[] args) throws NamingException, JMSException {
            String url = "t3://127.0.0.1:7001";
            Properties properties = new Properties();
            properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            properties.put(Context.PROVIDER_URL, url);
            Context context = new InitialContext(properties);
            // 获得JMS信息连接队列工厂
            TopicConnectionFactory tFactory = (TopicConnectionFactory) context.lookup("jmsfactory");
            // 获得JMS信息连接队列
            TopicConnection tConn = tFactory.createTopicConnection();
            // 产生session,设置事物模式为false,自动应答消息接收
            TopicSession tSession = tConn.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
            // 获得队列
            Topic topic = (Topic) context.lookup("jmstopic");
            // 产生JMS主题发送器
            TopicPublisher tPublisher = tSession.createPublisher(topic);
            // 产生JMS消息
            Message msg = tSession.createTextMessage("这是来自发送端的TOPIC消息,请注意接收,谢谢!");
            System.out.print("发送的消息为:" + msg.toString());
            // 发送数据到JMS
            tPublisher.publish(msg);
            System.out.println("发送成功");
            // 关闭操作
            tPublisher.close();
            tSession.close();
            tConn.close();
      }
}


4 消息订阅者

package com.wnq.receive;

import java.util.Properties;

import javax.jms.JMSException;

import javax.jms.TextMessage;

import javax.jms.Topic;

import javax.jms.TopicConnection;

import javax.jms.TopicConnectionFactory;

import javax.jms.TopicSession;

import javax.jms.TopicSubscriber;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

public class JmsTopicReceive {

public static void main(String[] args) throws NamingException, JMSException  {

            String url = "t3://127.0.0.1:7001";

            Properties properties = new Properties();

            properties.put(Context.INITIAL_CONTEXT_FACTORY,

            "weblogic.jndi.WLInitialContextFactory");

            properties.put(Context.PROVIDER_URL, url);

            Context context = new InitialContext(properties);

            //获得JMS信息连接队列工厂

            TopicConnectionFactory tFactory = (TopicConnectionFactory) context.lookup("jmsfactory");

            //获得JMS信息连接队列

            TopicConnection tConn = tFactory.createTopicConnection();

            //产生主题session,设置事物模式为false,自动应答消息接收

            TopicSession tSession =tConn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);

            //获得主题

            Topic topic=(Topic)context.lookup("jmstopic");

            TopicSubscriber tSubscriber = tSession.createSubscriber(topic);

            tConn.start();

            System.out.println("***************");

            TextMessage  msg = (TextMessage) tSubscriber.receive();

                System.out.println("############");

                System.out.println("收到的消息是:" + msg.getText());          

}

}



5 测试与结果

(1)开启weblogic应用服务器。

(2)运行接受类的代码

(3)运行发送类的代码

(4)eclipse控制台截图


北京联动北方科技有限公司

北京联动北方科技有限公司

(5)weblogic管理器截图


北京联动北方科技有限公司

北京联动北方科技有限公司

北京联动北方科技有限公司

需要注意的是:一定要先运行订阅端,再运行客户端,作为初学者我的理解是,只有先订阅,在消息来之后才能顺利接收,在消息到来之后再订阅就迟了。更合理的解释,还在自学中,见谅。



人们都向往和寻找快乐,其实快乐就是一种心情,秘密隐藏于人的心中。快乐从不曾远离我们,而是我们远离了快乐。原本单纯的心,一旦复杂起来,快乐和幸福就 会远离而去,烦恼和忧愁就会随之而来。






赞(0)    操作        顶端 
nengqiang.wang
注册用户
等级:中校
经验:1658
发帖:34
精华:0
注册:1970-1-1
状态:离线
发送短消息息给nengqiang.wang 加好友    发送短消息息给nengqiang.wang 发消息
发表于: IP:您无权察看 2015-8-14 16:09:42 | [全部帖] [楼主帖] 2  楼

一条消息可以传递给多个接收方,采用javax.jms.Topic表示。每条消息可以有多个接收者,发布者和订阅者有时间上的依赖性,针对某个主题的订阅者必须创建一个订阅之后才能消费发布者发布的消息,而且为了接收消息,订阅者必须保持运行。发布订阅模式的消息不支持离线消息,即当发生消息时,接收方如果不在线,当接收再次上线时就无法接收到已经发送过的消息。为了缓和这种严格的时间相关性,jms运行订阅者创建一个可持久化的订阅,这样,即使订阅者没有被激活(运行),也能接收到发布者发布的消息。若希望发送的消息可以不被做任何处理,或者被一个消费者处理,或者可以被多个消费者处理,应该使用pub/sub模型。


人们都向往和寻找快乐,其实快乐就是一种心情,秘密隐藏于人的心中。快乐从不曾远离我们,而是我们远离了快乐。原本单纯的心,一旦复杂起来,快乐和幸福就 会远离而去,烦恼和忧愁就会随之而来。






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