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);
        }
    }
ActiveMQ安装 : 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.配置jdk环境,解压ActiveMQ到本地 3.启动ActiveMQ服务器: 32位机 : 直接运行\bin\win32\activemq.bat 64位机 : 直接运行\bin\win64\activemq.bat 4.打开ActiveMQ消息管理后台系统 http://localhost:8161/admin/ 参考文章为 : HelloWorld : http://blog.youkuaiyun.com/baggio7095586/article/details/5708519 进阶 :http://haohaoxuexi.iteye.com/blog/1893038 helloworld阶段 : 一个发送消息的程序,一个接收消息的程序..实现最简单的JMS交流... 监听器阶段 : ⑴MessageListener,最简单的监听器..只是拿来监听接收信息的 ⑵SessionAwareMessageListener,有个session的参数..可以拿来对接收到的信息再做响应.. ⑶MessageListenerAdapter,将消息委托交给一个普通的java类来处理.. 转化器阶段 : 实现MessageConverter接口来转换JMS对象与java对象.. 其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> <property name="sessionTransacted" value="true"/> </bean> 该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下,但是对于其他操作如数据库访问等将不属于该事务控制。 数据库跟JMS挂钩的事务先别理..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值