JMS

有很多种技术可以实现系统之间的传递数据
如RPC(远程过程调用的解决方案):COM/DCOM,COBRA,DCE,EJB等等。
也有使用时间通知,内部交互,消息队列的:如FIFO缓冲,消息队列,管道,信号,socket等等
也可以使用异步可靠消息中间件(MOM)。如IBM WEBsphere,apache activeMQ等。也是我们要讨论的。

MOM的设计初衷是为了分布式系统提供异步,解耦,稳定,可扩展的安全的行为。JMS是在MOM供应商所提供的核心API的基础上发展起来的。目标是为java提供一个标准的API来发射和接收消息。同时保证在不同MOM供应商中间的可移植性。JMS不是MOM,而是一个客户端和MOM交互的API。关系类似JDBC和数据库。

JMS中有如下规范
JMS客户端—-100%用Java编写的发送和接收消息的应用。
Non-JMS客户端—-使用JMS提供者特定的客户端API而不是JMS API来发送和接收消息的应用
JMS producer—-创建和发送JMS消息的客户端应用。
JMS consumer—-接收和处理JMS消息的客户端应用。

JMSk可以实现点对点通信。在这种情况下,每条到达队列的消息将会被投递到一个单独的消费者一次。并且只有一次。多个消费者和多个多个生产者都可以注册到同一个队列上。
也可以实现发布订阅模式。生产者发布消息到特定的主题(topics),而订阅该主题的所有人都会受到这一消息。消费者可以选择持久订阅或者非持久订阅。持久订阅的时间是无限的。甚至在订阅者断开连接时,平台仍将保存消息等到重新连接后再投递。除非消费者主动取消订阅。非持久订阅的的时间是有限的。特别是当断开连接时,平台不会保存任何消息。常见的JMS的使用代码如下:

ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  

        Connection connection = factory.createConnection();  
        connection.start();  
        //创建消息的Destination 
        Queue queue = new ActiveMQQueue("testQueue");  

        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
        //创建将要发送的消息
        Message message = session.createTextMessage("Hello JMS!");  
        //创建消息生产者发送消息 
        MessageProducer producer = session.createProducer(queue);  
        producer.send(message);  

        System.out.println("Send Message Completed!");  
        //创建消息的接收者 
        MessageConsumer comsumer = session.createConsumer(queue); 
        //消息的消费者接收消息的第一种方式:手工接受。consumer.receive() 或 consumer.receive(int timeout);
        //Message recvMessage = comsumer.receive();  
        //System.out.println(((TextMessage)recvMessage).getText()); 
        //消息的消费者接收消息的第二种方式:注册一个MessageListener。
        comsumer.setMessageListener(new MessageListener(){
            public void onMessage(Message msg) {
                // TODO Auto-generated method stub
                TextMessage textMsg=(TextMessage)msg;
                try {
                    System.out.println(textMsg.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

        });

当然,在工程中封装成一个方法要方便的多。

    public String getMessage() {
        String msg = "";
        try {

            long timeout = 3000;
            Message message = getConsumer(null).receive(timeout);

            if (message instanceof TextMessage) {
                TextMessage txtMsg = (TextMessage) message;

                msg = txtMsg.getText();
            }

        } catch (JMSException e) {
            logger.error(e.getMessage(), e);
        }
        return msg;
    }

创建一个连接要指定若干属性

    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();


    public AmqConsumerTool(String brokerUrl, String queueName, String userName, String password,String filter) {
        this.brokerUrl = brokerUrl;
        this.queueName = queueName;
        cf.setBrokerURL(this.brokerUrl);
        cf.setUserName(userName);
        cf.setPassword(password);
        try {
            getConnection().start();
            getConsumer(null,filter);
        } catch (JMSException e) {
            logger.error(e.getMessage(), e);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值