⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmsdrawdemo.java

📁 weblogic应用全实例
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//声明这个类定义在包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 + -