📄 topicreceive.java
字号:
//声明本类在包examples.jms中
package examples.jms.topic;
//本类需要导入的其他类或包
//Java 基础类库中的类
import java.io.*;
import java.util.*;
//Java扩展类库中的包,依次是名称服务器类和Java消息包
import javax.naming.*;
import javax.jms.*;
/**
* 这个实例描述怎样和消息服务器上的一个消息主题建立连接,以及怎样接收这个
* 主题的消息。创建一个消息主题接收,可以分为三个步骤,在类TopicReceive中,
* 这三个步骤封装成了三个方法,在main方法中依次调用。
*/
//消息接收程序必须实现MessageListener接口,才能接收到发送的消息
public class TopicReceive
implements MessageListener
{
/**
* 定义JNDI构造器
*/
public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
/**
* 定义JMS连接器
*/
public final static String JMS_FACTORY="weblogic.examples.jms.TopicConnectionFactory";
/**
* 定义主题
*/
public final static String TOPIC="weblogic.examples.jms.exampleTopic";
//声明主题消息连接器变量
private TopicConnectionFactory tconFactory;
//声明主题消息连接变量
private TopicConnection tcon;
//声明主题消息会话器变量
private TopicSession tsession;
//声明主题消息接收器变量
private TopicSubscriber tsubscriber;
//声明主题消息变量
private Topic topic;
private boolean quit = false;
/**
* 必须实现的接口MessageListener中的方法,这个方法被消息服务器自动激发。
* @参数 msg 消息
*
*/
public void onMessage(Message msg)
{
try {
//声明文本消息变量
String msgText;
//判断消息是否为文本消息实例
if (msg instanceof TextMessage) {
//是,则取出消息文本赋值到变量
msgText = ((TextMessage)msg).getText();
} else {
//不是,则用toString()方法取出这个消息的信息
msgText = msg.toString();
}
//在控制台显示
System.out.println("JMS 消息接收: "+ msgText );
if (msgText.equalsIgnoreCase("quit")) {
//如果发出退出消息,则置退出标志为真,使本程序终止运行
synchronized(this) {
quit = true;
this.notifyAll(); // 通知主现成退出
}
}
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}
/**
* 创建发送主体消息相关的对象
*
* @参数 ctx JNDI 上下文
* @参数 topicName 主题名
* @异常 NamingExcpetion JNDI异常
* @异常 JMSException if JMS异常
*
*/
public void init(Context ctx, String topicName)
throws NamingException, JMSException
{
//消息上下文从JNDI服务中寻找到主题连接构造器
tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
//建立主题连接
tcon = tconFactory.createTopicConnection();
//创建主题会话
tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//消息上下文从JNDI服务中寻找到主题
topic = (Topic) ctx.lookup(topicName);
//在主体会话中创建主题接收器
tsubscriber = tsession.createSubscriber(topic);
//设置主题接收的消息监听器
tsubscriber.setMessageListener(this);
//启动连接
tcon.start();
}
/**
* 关闭 JMS 对象.
*
* @异常 JMSException JMS 异常
*/
public void close()
throws JMSException
{
tsubscriber.close();
tsession.close();
tcon.close();
}
/**
* 主方法
*
* @参数 args WebLogic服务器URL
* @异常 Exception 操作失误
*/
public static void main(String[] args)
throws Exception
{
//运行这个程序,给出应用服务器的URL作为命令行参数
//如果没有给出URL的命令行参数,打印出用法提示。
if (args.length != 1) {
System.out.println("用法: java examples.jms.topic.TopicReceive WebLogicURL");
return;
}
//创建初始化上下文实例
InitialContext ic = getInitialContext(args[0]);
//声明本类的一个实例
TopicReceive tr = new TopicReceive();
//建立给定主题的消息服务器连接
tr.init(ic, TOPIC);
System.out.println("JMS 准备好了接收消息(要退出, 发送一个\"quit\"消息).");
// 等待,发出直到"quit"消息
synchronized(tr) {
while (! tr.quit) {
try {
tr.wait();
} catch (InterruptedException ie) {}
}
}
tr.close();
}
/**
* 得到初始化的JNDI上下文
*
* @参数 url 消息服务器
* @异常 NamingException JNDI错误抛出的异常
*/
private static InitialContext getInitialContext(String url)
throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
env.put("weblogic.jndi.createIntermediateContexts", "true");
return new InitialContext(env);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -