activeMQ 的简单运用

文章目录

客户端


package com.zhuguang.jack.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class QueueConsumer {
    public static void main(String[] args) {
        String username = "system";

        String password = "manager";

        String brokerURL = "failover://tcp://192.168.1.10:61616";

        ConnectionFactory connectionFactory = null;

        Connection connection = null;

        Session session = null;

        Destination destination = null;

        MessageProducer messageProducer = null;

        connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL);

        try {
            connection = connectionFactory.createConnection();

            connection.start();

            /*
             * 第一个参数:是否支持事务,如果是true的话,第二个参数就会忽略
             *
             * 第二个参数:消息确认机制
             *
             * Session.AUTO_ACKNOWLEDGE:自动确认消息,consumer.receive只要有返回就确认成功处理消息,哪怕处理消息
             * 出现异常也是给了一个成功的应答
             *
             * Session.CLIENT_ACKNOWLEDGE:客户端接收消息后,必须调用ackknowledge方法手动确认,手动确认才会删除
             *
             * Session.DUPS_OK_ACKNOWLEDGE:批量确认消息
             * DUPS_OK_ACKNOWLEDGE = AUTO_ACKNOWLEDGE + 延迟
             *
             *
             * 1、如果生产者是事务消息,那么消费者也要保证是事务消息
             *
             * */
            session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);

            destination = session.createQueue("zgqueue");

            MessageConsumer consumer = session.createConsumer(destination);

            final Session finalSession = session;
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    if (message instanceof TextMessage) {
                        textMessage((TextMessage)message);
                    } else if(message instanceof ObjectMessage) {
                        objectMessage((ObjectMessage)message);
                    } else if(message instanceof BytesMessage) {
                        bytesMessage((BytesMessage)message, finalSession);
                    }
                }
            });

            /*while (true) {

                try {
                // receive 方式是阻塞式的,想比于自动确认消息,处理消息慢, 但是这里可以根据计算机的性能 进行一些操作,而自动确认消息是不管计算机性能的 直接是无脑接收
                    TextMessage textMessage = (TextMessage) consumer.receive(100000);

                    if (textMessage != null) {
                        System.out.println("成功接收消息:" + textMessage.getText());
                    } else {
                        break;
                    }

                    textMessage.acknowledge();

//                    int i = 1 / 0;
                } catch (Exception e) {
                    e.printStackTrace();

                    *//*
             * ActiveMQ.DLQ 如果rollback成功,会把消息存储在DLQ队列
             * 1、过期消息
             * 2、处理失败消息
             * 3、回滚消息
             *
             * *//*
                    session.rollback();
                }

               *//* try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //当业务逻辑处理完后,手动确认,挨个确认,比较好资源
                textMessage.acknowledge();*//*
            }*/
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static void textMessage(TextMessage textMessage) {
        try {
            System.out.println("成功接收消息:" + textMessage.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static void objectMessage(ObjectMessage objectMessage) {
        try {
            User user = (User) objectMessage.getObject();
            System.out.println(user.getUsername()+":" + user.getPassword());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static  void bytesMessage(BytesMessage bytesMessage,Session session) {
        FileOutputStream os = null;
        try {
            String filename = bytesMessage.getStringProperty("filename");
            os = new FileOutputStream("F:" + File.separator + filename);
            byte[] bytes = new byte[1024];

            int len = 0;
            while((len = bytesMessage.readBytes(bytes))!= -1) {
                os.write(bytes,0,len);
            }

            System.out.println("文件保存成功!!");
		//获取回执消息
            Destination jmsReplyTo = bytesMessage.getJMSReplyTo();
            TextMessage textMessage = session.createTextMessage("文件处理成功回执消息:" + filename);
            //此处变成了生产者
            MessageProducer producer = session.createProducer(jmsReplyTo);
            producer.send(textMessage);

        } catch (JMSException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


生产端

package com.zhuguang.jack.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class QueueProducer {

    public static void main(String[] args) {
        String username = "system";

        String password = "manager";

        String brokerURL = "failover://tcp://192.168.1.10:61616";

        ConnectionFactory connectionFactory = null;

        Connection connection = null;

        Session session = null;

        Destination destination = null;

        MessageProducer messageProducer = null;

        connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL);

        try {
            connection = connectionFactory.createConnection();

            connection.start();

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

            Queue zgqueue = session.createQueue("zgqueue");

            MessageProducer producer = session.createProducer(zgqueue);
            //默认是一个持久化的消息存储机制
//          producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            textMessage(session, producer);
//            objectMessage(session, producer);
//            byteMessage(session, producer);

//            session.commit();
        } catch (JMSException e) {
            e.printStackTrace();

            try {
                session.rollback();
            } catch (JMSException e1) {
                e1.printStackTrace();
            }

        }
    }

    private static void textMessage(Session session, MessageProducer producer) {
        try {
            TextMessage textMessage = session.createTextMessage();
            for (int i = 0; i < 10; i++) {
                textMessage.setText("生产消息测试 : " + i);
                producer.send(textMessage);
                System.out.println("发送成功:" + textMessage.getText());
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static void objectMessage(Session session, MessageProducer producer) {
        try {
            ObjectMessage objectMessage = session.createObjectMessage();
//            objectMessage.setJMSReplyTo();
            for (int i = 0; i < 10; i++) {
                User user = new User();
                user.setUsername("jack" + i);
                user.setPassword("123" + i);
                objectMessage.setObject(user);
                producer.send(objectMessage);
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static void byteMessage(Session session, MessageProducer producer) {
        FileInputStream is = null;
        try {
            BytesMessage bytesMessage = session.createBytesMessage();
            replyMessage(session, "bytemsg_reply_queue", bytesMessage);
            bytesMessage.setStringProperty("filename", "my.ini");
            File file = new File("D:" + File.separator + "software" + File.separator + "my.ini");

            is = new FileInputStream(file);

            byte[] buffer = new byte[is.available()];
            is.read(buffer);

            bytesMessage.writeBytes(buffer);
            producer.send(bytesMessage);
            System.out.println("send to broker!!");
        } catch (JMSException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static void streamMessage(Session session,MessageProducer producer) {
        try {
            StreamMessage streamMessage = session.createStreamMessage();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    private static void replyMessage(Session session, String queuename, Message message) {
        try {
            Queue queue = session.createQueue(queuename);
            message.setJMSReplyTo(queue);


            MessageConsumer consumer = session.createConsumer(queue);
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    if (message != null && message instanceof TextMessage) {
                        try {
                            System.out.println("reply message : " + ((TextMessage) message).getText());
                        } catch (JMSException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}


pom

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.9.0</version>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

如果服务端 发的事务消息, 客户端配置的非事务消息, 则客户端接不到。

如果服务端发的是非事务消息,客户端用事务消息去接, 发现 此消息一直存在,可以被多次消费, 就算调用 acknowledge()方法也不行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以回答这个问题。以下是一个简单ActiveMQ 示例: 1. 首先,你需要下载 ActiveMQ 并启动它。你可以从 ActiveMQ 官网下载最新版本的 ActiveMQ。 2. 然后,你需要创建一个 Java 项目,并将 ActiveMQ 的 JAR 文件添加到项目的类路径中。 3. 接下来,你需要编写一个生产者和一个消费者。生产者将消息发送到 ActiveMQ 队列中,消费者从队列中接收消息并进行处理。 4. 下面是一个简单的生产者示例: ``` import javax.jms.*; import org.apache.activemq.ActiveMQConnectionFactory; public class Producer { public static void main(String[] args) throws JMSException { // 创建连接工厂 ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = factory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列 Destination destination = session.createQueue("myQueue"); // 创建生产者 MessageProducer producer = session.createProducer(destination); // 创建消息 TextMessage message = session.createTextMessage("Hello, world!"); // 发送消息 producer.send(message); // 关闭连接 connection.close(); } } ``` 5. 下面是一个简单的消费者示例: ``` import javax.jms.*; import org.apache.activemq.ActiveMQConnectionFactory; public class Consumer { public static void main(String[] args) throws JMSException { // 创建连接工厂 ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = factory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列 Destination destination = session.createQueue("myQueue"); // 创建消费者 MessageConsumer consumer = session.createConsumer(destination); // 接收消息 Message message = consumer.receive(); // 处理消息 if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; System.out.println("Received message: " + textMessage.getText()); } // 关闭连接 connection.close(); } } ``` 这是一个非常简单ActiveMQ 示例,它演示了如何使用 ActiveMQ 发送和接收消息。当然,实际应用中,你需要更加复杂的逻辑来处理消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值