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