JavaEE5学习笔记03-JMS介绍与使用---2

下面我们来看消息生产者的代码:

 

/**

 * 消息发送者

 *

 * @author liuyan

 *

 */

public class JbossMessageSender {

 

    /**

     * 发送消息

     *

     * @throws Exception

     */

    public void sendMessage() {

 

       try {

           String Connection_Factory = "ConnectionFactory";

           Context context = getInitialContext();

           ConnectionFactory connectionFactory = (ConnectionFactory) context

                  .lookup(Connection_Factory);

 

           Destination dest = (Destination) context.lookup("jbossJMS");

 

           Connection connection = connectionFactory.createConnection();

 

           Session session = connection.createSession(false,

                  Session.AUTO_ACKNOWLEDGE);

           MessageProducer sender = session.createProducer(dest);

           sender.setDeliveryMode(DeliveryMode.PERSISTENT);

           sender.setTimeToLive(2000);

           TextMessage textMessage = session.createTextMessage();

           textMessage.setStringProperty("ConType", "txt");

           textMessage.setText("hello 速速");

           sender.send(textMessage);

          

           // 等待50

           Thread.sleep(5000);

           System.out.println("停顿5秒钟");

           textMessage.setText("welcome to JMS");

           sender.send(textMessage);

           session.close();

           connection.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

 

    }

 

    private Context getInitialContext() {//重复代码

……

    }

 

    /**

     * @param args

     * @throws Exception

     */

    public static void main(String[] args) throws Exception {

 

       JbossMessageSender jbossMessageSender = new JbossMessageSender();

       jbossMessageSender.sendMessage();

    }

 

}

 

以上是一个消息生产者的代码,流程架子和消息消费者差不多是

1):获得应用上下文

2):根据上下文获得连接工厂,此处使用的是JBoss默认的连接工厂

3):从连接工厂里面获取JMS连接Connection

4):由JMS连接获得JMS消息回话Session

5):根据消息目的,由JMS会话创建消息生产者

6):设置消息头的一些属性

7):填充消息体

8):发送消息

9):关闭JMS消息资源,sessionconnection

 

这样先执行消息消费者,苦苦等待(世间最痛苦的莫过于没有任何音讯的苦苦等待)来自目的的消息。之后再执行消息生产者看到效果如下:

消息消费者的控制台:

textMessagedelegator->JBossMessage[21259511621255168]:PERSISTENT, deliveryId=0

消息内容hello 速速

可以看出生产者生产了2个消息,消费者只享用了一个消息后就继续往下执行代码,执行到close()时,退出消息目的的监听了,看来这个消息消费者很知足啊:你目的没有消息,只要我活着我就永远等着,知道你目的有一个我等待的消息出现,我才往下执行代码。

下面我们不改变消息生产者,修改一下消息的消费者为异步的方式看看效果,代码如下:

 /**

 * 异步接收P2P消息

 *

 * @author liuyan

 *

 */

public class JbossASyncMessageReciveriver implements MessageListener {

   

    /**

     * 异步接收

     */

    public void reciveMessage() {

 

       try {

           String Connection_Factory = "ConnectionFactory";

 

           Context context = getInitialContext();

 

           ConnectionFactory connectionFactory = (ConnectionFactory) context

                  .lookup(Connection_Factory);

 

           Destination dest = (Destination) context.lookup("jbossJMS");

 

           Connection connection = connectionFactory.createConnection();

           connection.start();

           Session session = connection.createSession(false,

                  Session.AUTO_ACKNOWLEDGE);

           MessageConsumer reciver = session.createConsumer(dest);

           // JMS消费者绑定监听器

           reciver.setMessageListener(this);

           // 等待50

           Thread.sleep(50000);

           session.close();

           connection.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

 

    private Context getInitialContext() {//重复

……

    }

   

    /**

     * 实现此方法,每当监听到此目的有消息了,就执行此方法

     */

    @Override

    public void onMessage(Message message) {

       // TODO Auto-generated method stub

       TextMessage textMessage = (TextMessage) message;

       String messageText;

       try {

 

           messageText = textMessage.getText();

 

           System.out.println("textMessage" + textMessage);

 

           System.out.println("消息内容" + messageText);

 

       } catch (JMSException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

 

    /**

     * @param args

     */

    public static void main(String[] args) {

 

       JbossASyncMessageReciveriver jbossSyncMessageReciveriver = new JbossASyncMessageReciveriver();

       jbossSyncMessageReciveriver.reciveMessage();

    }

 

}

异步消费需要实现MessageListener接口和它的onMessage()方法,接收到消息后在onMessage()方法中执行自己的相关逻辑。按照上例的顺序执行代码后,消费者控制台如下:

textMessagedelegator->JBossMessage[21259524079452162]:PERSISTENT, deliveryId=0

消息内容hello 速速

textMessagedelegator->JBossMessage[21259524161454083]:PERSISTENT, deliveryId=1

消息内容welcome to JMS

消费者开启50秒后自动退出,这就是异步消费模式的效果。就是说,老娘等你(消息生产者)50秒,有消息,老娘就收着,没有!!!50秒后老娘就撤了,过了这村就没这店了啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值