ActiveMq实现JMS

 

1、JMS基本组成部分
  a、JMS服务提供者:我们使用的是activemq,它实现了JMS API 的服务器端的接口,完成诸如服务器到客户端的通信、服务器端消息的存储、客户信息的存储等等
  b、JMS客户端:负责消息的发送和接收,需要自己实现
  c、消息(Message):它是客户、服务器交互的载体。消息一般由某个客户应用程序创建,发送至服务器端指定的“目的地”;其它某客户应用程序连接此服务器,“消费”特定“目的地”中的消息。
  d、管理对象:该对象是客户服务器交互的唯一“连接点”。JMS定义了两种类型的被管理对象:目的地对象(Destination)和连接工厂对象(ConnectionFactory)

2、JMS 消息传送方式
 <1>QUEUE
消息生产者将消息发布到Qqueue中,在随后的操作中将会有消息消费者从该Qqueue中将消息消费掉。一旦消息消费掉,Qqueue中将不再存在他,因此其他消息消费者将不能够获得已消费的消息。注意,尽管Qqueue支持同时存在多个消息消费者,但对于单个的消息而言,仅仅会有一个消息消费者消费它。
 <2>TOPIC
 消息生产者(发布者)将消息发布到Topic中,与此同时将会有多个消息消费者(订阅者)消费发布到该Topic的消息。它与点对点不同,即发布到Topic的消息将会被所有已订阅该Topic的订阅者消费。注意,如果消息发往Topic中时,当时不存在消息监听者(即,订阅者不处于监听状态),则该消息将丢弃掉。但有一点特殊,如果某订阅者是持久订阅者,则该消息将保留到该持久订阅者消费掉该消息为止。


2、消息发送
 /*初始化生产者*/
 private void initialize() throws JMSException, Exception {
        /*创建连接工厂*/
        connectionFactory = new ActiveMQConnectionFactory(user, password, url);
        /*创建连接*/
        connection = connectionFactory.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        /*消息发送地*/
        destination = session.createTopic(subject);//queue方式 用方法createQueue
        /*消息的生产者*/
        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        connection.start();
    }
  /*发送消息*/
  public void produceMessage(SimpleEmailMessage simpleEmailMessage)
            throws JMSException, Exception {
        //initialize();
        TextMessage msg = session.createTextMessage(simpleEmailMessage
                .getText());
        producer.send(msg);
        System.out.println("Producer:->Message sent complete!");
    }


3、消息接收

 /*初始化生产者*/
 private void initialize() throws JMSException, Exception {
        /*创建连接工厂*/
        connectionFactory = new ActiveMQConnectionFactory(user, password, url);
        /*创建连接*/
        connection = connectionFactory.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        /*消息发送地*/
        destination = session.createTopic(subject);
        /*消息的消费者*/
        consumer = session.createConsumer(destination);
        connection.start();
        consumer.setMessageListener(this);//异步获取方式,需要实现MessageListener的onMessage方法 同步获取使用consumer.reveive();
    }
  /*接收消息*/

    public void onMessage(Message message) {
        logger.debug("从队列中接收信息");
       
        if(message instanceof TextMessage){
            TextMessage txtMsg = (TextMessage) message;
            try {
                converXMLMessageToSimpleEmailMessage(txtMsg
                        .getText());
                this.sendEmail(simpleEmailMessage);
                this.sendResultMessage(resultMessage);
            }
            catch (JMSException e) {
               logger.error(""+e);
            }
        }
        else{
            logger.debug("message type"+message.toString());
            if(message instanceof ActiveMQMessage){
                ActiveMQMessage am = (ActiveMQMessage)message;
            }
        }
       
       
    }


4、消息种类

包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。


StreamMessage   一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。

MapMessage     一种主体中包含一组键--值对的消息。没有定义条目顺序。

TextMessage       一种主体中包含Java字符串的消息(例如,XML消息)。

ObjectMessage    一种主体中包含序列化Java对象的消息。

BytesMessage     一种主体中包含连续字节流的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值