📄 jmsdrawdemo.java
字号:
//声明这个类定义在包examples.jms.drawdemo中
package examples.jms.drawdemo;
//声明这个类引入的其它包或类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;
import java.util.*;
import javax.jms.*;
import javax.naming.*;
/**
* 这个图形化的实例演示JMS发布/订阅模型的关键概念,运行这个实例观察
* 事务会话的行为,一致性消息和持久订阅。
*/
public class JMSDrawDemo extends JPanel
implements MouseListener, MessageListener, ActionListener
{
// 常量
/**
* 定义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";
/**
* 定义图标图像
*/
public final static String IMAGE="/weblogic/graphics/truck32x32.gif";
// JMS 数据
//声明主题消息连接器变量
private TopicConnectionFactory connectionFactory;
//声明主题消息连接变量
private TopicConnection connection;
//声明主题消息会话器变量
private TopicSession session, sessionTX;
//声明主题发布者
private TopicPublisher publisher, publisherTX;
//声明主题订阅者
private TopicSubscriber subscriber;
//声明主题
private Topic topic;
//声明消息
private Message msg;
//声明是否事务处理
private boolean isTransacted;
// 用户界面
//图像
private Image image;
//图像是否加载
private boolean imageLoaded;
//图像宽和高
private int imageWidth, imageHeight;
//点
private Vector points = new Vector();
//发送点
private Vector pointsSent = new Vector();
//位图
private Image offScreenImage;
//图形对象
private Graphics offScreenGraphics;
//按钮
private JButton commitButton, rollbackButton, clearButton, quitButton;
//选择框
private JCheckBox transactedCheckBox, persistentCheckBox;
private Dimension d;
//构造函数
public JMSDrawDemo(JFrame frame, String url, String durableSubscriberID)
throws NamingException, JMSException
{
//布局图形组件
frame.getContentPane().add(this, "Center");
frame.getContentPane().add(makeControlPanel(), "South");
image = loadImage(IMAGE);
initJMS(url, durableSubscriberID);
//注册消息监听器
addMouseListener(this);
}
/*******************************************************************
* 创建发送和接收主题消息必须的对象
*******************************************************************/
private void initJMS(String url, String durableSubscriberID)
throws NamingException, JMSException
{
boolean noLocal = false; // 不抑制自身发送的消息
//获取初始化上下文
InitialContext ctx = getInitialContext(url);
//查找连接构造器
connectionFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
//创建主题连接
connection = connectionFactory.createTopicConnection();
if (durableSubscriberID != null) {
//设置客户端id
connection.setClientID("JMSDrawDemo");
}
//创建主题会话
session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
sessionTX = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
//查找主题
topic = (Topic) ctx.lookup(TOPIC);
//创建消息发布者
publisher = session.createPublisher(topic);
publisherTX = sessionTX.createPublisher(topic);
if (durableSubscriberID == null) {
//创建消息订阅者
subscriber = session.createSubscriber(topic, "TRUE", noLocal);
} else {
subscriber = session.createDurableSubscriber(topic, durableSubscriberID);
}
//设置消息监听器
subscriber.setMessageListener(this);
//创建消息
msg = session.createMessage();
//启动连接
connection.start();
}
/*******************************************************************
* 用X/Y坐标来发送消息
* @参数 x X 坐标
* @参数 y Y 坐标
*******************************************************************/
private void publishPoint(int x, int y)
{
try {
//设置消息
msg.setIntProperty("x", x);
msg.setIntProperty("y", y);
//保存
pointsSent.addElement(new Point(x, y));
if (isTransacted) {
//如果使用事务
publisherTX.publish(msg, deliveryMode(), 5, 0);
} else {
//如果没使用事务
publisher.publish(msg, deliveryMode(), 5, 0);
}
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}
/*******************************************************************
* 发布一个JMS "clearScreen" 消息
*******************************************************************/
private void publishClear()
{
try {
//创建消息
Message clearMsg = session.createMessage();
clearMsg.setStringProperty("command", "clearScreen");
//发送消息
publisher.publish(clearMsg, deliveryMode(), 5, 0);
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}
/*******************************************************************
* 接收JMS消息,X/Y坐标或一个"clearScreen" 消息。
* @参数 msg 消息
*******************************************************************/
public void onMessage(Message msg)
{
try {
//获取命令
String command = msg.getStringProperty("command");
if (command != null && command.equals("clearScreen")) {
//如果是清屏命令
clearScreen();
} else {
//获取坐标
int x = msg.getIntProperty("x");
int y = msg.getIntProperty("y");
Point p = new Point(x,y);
//更新位图
updateImage(p);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
/*******************************************************************
* 关闭JMS对象并退出
*******************************************************************/
private void exit()
{
try {
publisher.close();
publisherTX.close();
subscriber.close();
session.close();
sessionTX.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
/*******************************************************************
* 用户界面
*******************************************************************/
private JPanel makeControlPanel()
{
//控制面板
JPanel controlPanel = new JPanel();
//选择框
persistentCheckBox = new JCheckBox("Persistent");
//注册选择框事件监听器
persistentCheckBox.addActionListener(this);
//加入选择框组件
controlPanel.add(persistentCheckBox);
//选择框
transactedCheckBox = new JCheckBox("Transacted");
//注册选择框事件监听器
transactedCheckBox.addActionListener(this);
//加入选择框组件
controlPanel.add(transactedCheckBox);
//发送按钮
commitButton = new JButton("Commit");
commitButton.setEnabled(false);
//注册事件监听器
commitButton.addActionListener(this);
//加入按钮
controlPanel.add(commitButton);
// 按钮
rollbackButton = new JButton("Rollback");
rollbackButton.setEnabled(false);
//注册事件监听器
rollbackButton.addActionListener(this);
//加入按钮
controlPanel.add(rollbackButton);
//清除按钮
clearButton = new JButton("Clear");
clearButton.addActionListener(this);
controlPanel.add(clearButton);
//退出按钮
quitButton = new JButton("Quit");
quitButton.addActionListener(this);
controlPanel.add(quitButton);
return controlPanel;
}
/*******************************************************************
* 打印用户界面
* @参数 g 用户界面
*******************************************************************/
public void paint(Graphics g) {
//设置为黑色
g.setColor(Color.black);
//获取当前大小
d = getSize();
if (offScreenImage==null ||
d.width != offScreenImage.getWidth(null) ||
d.height != offScreenImage.getHeight(null)) {
//创建位图,首次或者大小改变时
offScreenImage = createImage(d.width, d.height);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -