Activemq消费者生产者实现

手写activemq的消息实现

maven应用仓库


            org.apache.activemq
            activemq-pool
            5.13.3
 

s生产者

public class Produce {


    public static void main(String[] args) throws JMSException {
        //连接工场
        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER,ActiveMQConnectionFactory.DEFAULT_PASSWORD,"tcp://192.168.184.129:61616");
         //创建一个链接
        Connection connection= connectionFactory.createConnection();
        //打开一个链接
        connection.start();
        //创建一个发送的消息的线程
        Session session= connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        //队列  消息的存放地
        Destination destination =session.createQueue("my_queue");
        //消息发送者
        MessageProducer messageProducer=session.createProducer(destination);
        //设置消息的持久化或者非持久化
        messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

         sendMsg(session,messageProducer);
         session.commit();      //当不提交的时候,是不入队的,不会在队列中显示
         session.close();
         connection.close();
        //connection.stop();
    }


    public  static void   sendMsg(Session session,MessageProducer messageProducer) throws JMSException {

        for (int i=0;i<1;i++){
            TextMessage message=session.createTextMessage("this is "+i+" 条信息");
            System.out.println("消息成功发送到队列。。。{}。。。"+i);
            messageProducer.send(message);
        }

    }

}

消费者

public class Consumer {



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


        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER,ActiveMQConnectionFactory.DEFAULT_PASSWORD,"tcp://192.168.184.129:61616");

        Connection connection= connectionFactory.createConnection();

        connection.start();

        Session session= connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

        Destination destination =session.createQueue("my_queue");

        MessageConsumer consumer= session.createConsumer(destination);

        //listenerReciv(consumer);
        //normalReciv(consumer);


        while (true){
            Message message= consumer.receive();
            TextMessage textMessage=(TextMessage)message;
            String text=  textMessage.getText();
            System.out.println(text);
            session.commit();   //当不提交的时候,是不当成已经消失的

            //connection.close();
        }

        //;
        //connection.close();
    }

    //监听的方式监听是否有信息
    public  static void listenerReciv(MessageConsumer consumer) throws JMSException {

        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage=(TextMessage)message;
                try {
                    System.out.println(textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public static  void  normalReciv(MessageConsumer consumer) throws JMSException {
       Message message= consumer.receive();
       TextMessage textMessage=(TextMessage)message;
        while (true){
          String text=  textMessage.getText();
          System.out.println(text);
        }

    }




}

在事务型会话中
在事务状态下进行发送操作,消息并未真正投递到中间件,而只有进行 session.commit 操作之后,消息才会发送到中间件,再转发到适当的消费者进行处理。如果是调用rollback 操作,则表明,当前事务期间内所发送的消息都取消掉。通过在创建 session 的时候使用 true or false 来决定
当前的会话是事务性还是非事务性
connection.createSession(Boolean.TRUE,Session.AUTO_
ACKNOWLEDGE);
在事务性会话中,消息的确认是自动进行,也就是通过
session.commit()以后,消息会自动确认。
➢ 必须保证发送端和接收端都是事务性会话
在非事务型会话中
消息何时被确认取决于创建会话时的应答模式
(acknowledgement mode). 有三个可选项
Session.AUTO_ACKNOWLEDGE
当客户成功的从 receive 方法返回的时候,或者从
MessageListenner.onMessage 方法成功返回的时候,会话
自动确认客户收到消息。
Session.CLIENT_ACKNOWLEDGE
客户通过调用消息的 acknowledge 方法确认消息。

CLIENT_ACKNOWLEDGE 特性
在这种模式中,确认是在会话层上进行,确认一个被消费
的消息将自动确认所有已被会话消费的消息。列如,如果
一个消息消费者消费了 10 个消息,然后确认了第 5 个消
息,那么 0~5 的消息都会被确认 ->
演示如下:发送端发送 10 个消息,接收端接收 10 个消息,
但是在 i==5 的时候,调用 message.acknowledge()进行
确认,会发现 0~4 的消息都会被确认
Session.DUPS_ACKNOWLEDGE
消息延迟确认。指定消息提供者在消息接收者没有确认发
送时重新发送消息,这种模式不在乎接受者收到重复的消 息。

你可能感兴趣的:(消息队列)