zoukankan      html  css  js  c++  java
  • JavaEE(7)

    1. 使用事务性Session为消息增加事务(NetBeans创建java project: TxSession)

    MessageSender.java

    package lee;
    
    import javax.jms.*;
    import javax.naming.*;
    import java.util.Properties;
    
    public class MessageSender {
    
        public void sendMessage() throws NamingException, JMSException {
            //定义WebLogic默认连接工厂的JNDI
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            //获取JNDI服务所需的Context
            Context ctx = getInitialContext();
            //通过JNDI查找获取连接工厂
            ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
            //通过JNDI查找获取消息目的
            Destination dest = (Destination) ctx.lookup("MessageQueue");
            //连接工厂创建连接
            Connection conn = connFactory.createConnection();
            conn.setExceptionListener(new ExceptionListener(){
                public void onException(javax.jms.JMSException e){
                }
            });
            //JMS连接创建JMS会话
            Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
    //JMS会话创建消息生产者
            MessageProducer sender = session.createProducer(dest);
            //设置消息生产者生产出来的消息的传递模式、有效时间。
            sender.setDeliveryMode(DeliveryMode.PERSISTENT);
            sender.setTimeToLive(20000);
            //通过JMS会话创建一个文本消息
            TextMessage msg = session.createTextMessage();
            //设置消息内容
            msg.setText("Hello");
            //发送消息
            sender.send(msg);
            int a = 4 / 0;
            msg.setText("Welcome to JMS");
            //再次发送消息
            sender.send(msg);
            //关闭资源
            session.close();
            conn.close();
        }
    
        //工具方法,用来获取命名服务的Context对象
        private Context getInitialContext() {
            // 参加(4)
        }
    
        public static void main(String[] args) throws Exception {
            MessageSender sender = new MessageSender();
            sender.sendMessage();
        }
    }

    SyncConsumer.java

    package lee;
    
    import javax.jms.*;
    import javax.naming.*;
    import java.util.Properties;
    
    public class SyncConsumer {
    
        public void receiveMessage() throws JMSException, NamingException {
            //定义WebLogic默认连接工厂的JNDI
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            //获取JNDI服务所需的Context
            Context ctx = getInitialContext();
            //通过JNDI查找获取连接工厂
            ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
            //通过JNDI查找获取消息目的    
            Destination dest = (Destination) ctx.lookup("MessageQueue");
            //连接工厂创建连接
            Connection conn = connFactory.createConnection();
            //启动JMS连接,让它开始传输JMS消息
            conn.start();
            //JMS连接创建JMS会话
            Session session = conn.createSession(false/*不是事务性会话*/, Session.AUTO_ACKNOWLEDGE);
            //JMS会话创建消息消费者
            MessageConsumer receiver = session.createConsumer(dest);
            //同步接收消息,如果没有接收到消息,该方法会阻塞线程
            TextMessage msg = (TextMessage) receiver.receive();
            System.out.println(msg);
            System.out.println("同步接收到的消息:" + msg.getText());
            //关闭资源
            session.close();
            conn.close();
        }
    
        //工具方法,用来获取命名服务的Context对象
    
        private Context getInitialContext() {
            // 参看(4)
        }
    
        public static void main(String[] args) throws Exception {
            SyncConsumer consumer = new SyncConsumer();
            consumer.receiveMessage();
        }
    }

    2. 使用JTA全局事务为消息增加事务(NetBeans创建java project: JTA)

    MessageSender.java

    package lee;
    
    import javax.jms.*;
    import javax.naming.*;
    import java.util.Properties;
    import javax.transaction.*;
    
    public class MessageSender {
    
        public void sendMessage() throws Exception {
            //定义WebLogic默认连接工厂的JNDI
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            //获取JNDI服务所需的Context
            Context ctx = getInitialContext();
            //通过JNDI查找获取连接工厂
            ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
            //通过JNDI查找获取消息目的
            Destination dest = (Destination) ctx.lookup("MessageQueue");
            //通过JNDI查找获取JTA事务管理器
            UserTransaction tx = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction");
            tx.begin();
            //连接工厂创建连接
            Connection conn = connFactory.createConnection();
            //JMS连接创建JMS会话
            Session session = conn.createSession(false/*使用事务性会话*/, Session.AUTO_ACKNOWLEDGE);
            //JMS会话创建消息生产者
            MessageProducer sender = session.createProducer(dest);
            //设置消息生产者生产出来的消息的传递模式、有效时间。
            sender.setDeliveryMode(DeliveryMode.PERSISTENT);
            sender.setTimeToLive(20000);
            //通过JMS会话创建一个文本消息
            TextMessage msg = session.createTextMessage();
            //设置消息内容
            msg.setText("Hello");
            //发送消息
            sender.send(msg);
            int a = 4 / 0;
            msg.setText("Welcome to JMS");
            //再次发送消息
            sender.send(msg);
        //此处还可执行JDBC操作、EJB等事务操作
            //...
            //提交事务
            tx.commit();
            //关闭资源
            session.close();
            conn.close();
        }
    
        //工具方法,用来获取命名服务的Context对象
        private Context getInitialContext() {
            // 参看(4)
        }
    
        public static void main(String[] args) throws Exception {
            MessageSender sender = new MessageSender();
            sender.sendMessage();
        }
    }

    SyncConsumer.java

    package lee;
    
    import javax.jms.*;
    import javax.naming.*;
    import java.util.Properties;
    
    public class SyncConsumer {
    
        public void receiveMessage() throws JMSException, NamingException {
            //定义WebLogic默认连接工厂的JNDI
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            //获取JNDI服务所需的Context
            Context ctx = getInitialContext();
            //通过JNDI查找获取连接工厂
            ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
            //通过JNDI查找获取消息目的    
            Destination dest = (Destination) ctx.lookup("MessageQueue");
            //连接工厂创建连接
            Connection conn = connFactory.createConnection();
            //启动JMS连接,让它开始传输JMS消息
            conn.start();
            //JMS连接创建JMS会话
            Session session = conn.createSession(false/*不是事务性会话*/, Session.AUTO_ACKNOWLEDGE);
            //JMS会话创建消息消费者
            MessageConsumer receiver = session.createConsumer(dest);
            //同步接收消息,如果没有接收到消息,该方法会阻塞线程
            TextMessage msg = (TextMessage) receiver.receive();
            System.out.println(msg);
            System.out.println("同步接收到的消息:" + msg.getText());
            //关闭资源
            session.close();
            conn.close();
        }
    
        //工具方法,用来获取命名服务的Context对象
        private Context getInitialContext() {
            // 参看(4)
        }
    
        public static void main(String[] args) throws Exception {
            SyncConsumer consumer = new SyncConsumer();
            consumer.receiveMessage();
        }
    }

    3. 监听JMS服务器上的异常

    MessageSender.java

    package lee;
    
    import javax.jms.*;
    import javax.naming.*;
    import java.util.Properties;
    
    public class MessageSender {
    
        public void sendMessage() throws NamingException, JMSException {
            //定义WebLogic默认连接工厂的JNDI
            final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
            //获取JNDI服务所需的Context
            Context ctx = getInitialContext();
            //通过JNDI查找获取连接工厂
            ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
            //通过JNDI查找获取消息目的
            Destination dest = (Destination) ctx.lookup("MessageQueue");
            //连接工厂创建连接
            Connection conn = connFactory.createConnection();
            conn.setExceptionListener(new ExceptionListener(){
                public void onException(javax.jms.JMSException e){
                }
            });
            //JMS连接创建JMS会话
            Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
            //JMS会话创建消息生产者
            MessageProducer sender = session.createProducer(dest);
            //设置消息生产者生产出来的消息的传递模式、有效时间。
            sender.setDeliveryMode(DeliveryMode.PERSISTENT);
            sender.setTimeToLive(20000);
            //通过JMS会话创建一个文本消息
            TextMessage msg = session.createTextMessage();
            //设置消息内容
            msg.setText("Hello");
            //发送消息
            sender.send(msg);
            int a = 4 / 0;
            msg.setText("Welcome to JMS");
            //再次发送消息
            sender.send(msg);
            //关闭资源
            session.close();
            conn.close();
        }
    
        //工具方法,用来获取命名服务的Context对象
        private Context getInitialContext() {
            // 参看(4)
        }
    
        public static void main(String[] args) throws Exception {
            MessageSender sender = new MessageSender();
            sender.sendMessage();
        }
    }

    在单个JMS会话期间,如果需要使用事务性的操作,则应该使用事务性会话。但其他资源如数据库、EJB操作等则不能参与事务性的会话。如果需要让JMS、数据库或EJB操作等都参与到事务中,则应该考虑使用JTA全局事务。

  • 相关阅读:
    一步一步开发sniffer(Winpcap+MFC)(五)莫道无人能识君,其实我懂你的心——解析数据包(转)
    boost.property_tree解析xml的帮助类以及中文解析问题的解决(转)
    boost.xml_parser中文字符问题 (转)
    关于#progma comment 中库文件相对路径问题
    关于VC预定义常量_WIN32,WIN32,_WIN64(转)
    VS2010环境下Winpcap配置方法 (转)
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo(转)
    libnids关于计算校验和引起的抓不到包的现象的解决方法
    LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 (转)
    用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Android端Http访问类(转)
  • 原文地址:https://www.cnblogs.com/thlzhf/p/4249348.html
Copyright © 2011-2022 走看看