ActiveMQ的基本使用

来源:互联网 发布:棋牌室软件 编辑:程序博客网 时间:2024/06/05 23:36

1、我在做电商项目的时候,遇到这样一个需求,在后台添加一个新的商品的时候,我应该把商品的信息同步到索引库中,但是在分布式系统架构中,添加商品的服务不应该直接调用搜索服务,这样不利于各个服务的单一职能原则,也不利于解耦,对服务的启动顺序有要求。


2、这时候我需要一个MQ来完成各个服务间的通信,实现同步。


3、JMS规范规定了MQ有两种方式:queue和topic (queue默认是缓存的,所以能够等到消费者进行消费才算,但是topic默认是不缓存的,可以有多个消费者,需要缓存的话则需要配置subscribe)


4、ActiveMQ的后台管理使用的端口号是:8161 http://ipaddr:8161/admin/ 账号密码都是admin


5、下面是点对点的代码(queue)

@Testpublic void testQueueProducer() throws Exception {// 1. 创建一个连接工厂对象ConnectionFactory对象。需要指定mq服务的ip及端口ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.117.17.106:61616");// 2. 使用ConnectionFactory创建一个连接Connection对象Connection connection = connectionFactory.createConnection();// 3. 开启连接。调用Connection对象的start方法connection.start();// 4. 使用Connection对象创建一个Session对象// 第一个参数是是否开启事务,一般不使用事务。保证数据的最终一致,可以使用消息队列实现。// 如果第一个参数为true,第二个参数自动忽略。如果不开启事务false,第二个参数为消息的应答模式。一般自动应答就可以。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 5. 使用Session对象创建一个Destination对象,两种形式queue、topic。现在应该使用queue// 参数就是消息队列的名称Queue queue = session.createQueue("test-queue");// 6. 使用Session对象创建一个Producer对象MessageProducer producer = session.createProducer(queue);// 7. 创建一个TextMessage对象/* * TextMessage textMessage = new ActiveMQTextMessage(); * textMessage.setText("hello activemq"); */TextMessage message = session.createTextMessage("hello activemq123");// 8. 发送消息producer.send(message);// 9. 关闭连接producer.close();session.close();connection.close();}@Testpublic void testConsumer() throws Exception {// 1. 创建一个连接工厂对象ConnectionFactory对象。需要指定mq服务的ip及端口ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.117.17.106:61616");// 2. 创建一个connetion对象Connection connection = connectionFactory.createConnection();// 3. 开启连接connection.start();// 4. 得到一个session对象Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 5. 创建一个queue对象Queue queue = session.createQueue("test-queue");// 6. 得到一个consumer对象MessageConsumer consumer = session.createConsumer(queue);// 7. 设置消息监听对象,用来接收消息consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {// 接受消息if (message instanceof TextMessage) {// 如果是文本消息 则可以强转TextMessage textMessage = (TextMessage) message;try {// 打印消息String text = textMessage.getText();System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}}});// 8. 循环等待System.in.read();// 9. 关闭资源consumer.close();session.close();connection.close();}


6、下面是订阅发布模式的代码(topic)

@Testpublic void testTopicProducer() throws Exception {// 1. 创建一个连接工厂对象ConnectionFactory对象。需要指定mq服务的ip及端口ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.117.17.106:61616");// 2. 使用ConnectionFactory创建一个连接Connection对象Connection connection = connectionFactory.createConnection();// 3. 开启连接。调用Connection对象的start方法connection.start();// 4. 使用Connection对象创建一个Session对象// 第一个参数是是否开启事务,一般不使用事务。保证数据的最终一致,可以使用消息队列实现。// 如果第一个参数为true,第二个参数自动忽略。如果不开启事务false,第二个参数为消息的应答模式。一般自动应答就可以。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 5. 使用Session对象创建一个Destination对象,两种形式queue、topic。现在应该使用topic// 参数就是消息队列的名称Topic topic = session.createTopic("test-topic");// 6. 使用Session对象创建一个Producer对象MessageProducer producer = session.createProducer(topic);// 7. 创建一个TextMessage对象/* * TextMessage textMessage = new ActiveMQTextMessage(); * textMessage.setText("hello activemq"); */TextMessage message = session.createTextMessage("hello activemq123 topic");// 8. 发送消息producer.send(message);// 9. 关闭连接producer.close();session.close();connection.close();}// consumer@Testpublic void testTopicConsumer() throws Exception {// 1. 创建一个连接工厂对象ConnectionFactory对象。需要指定mq服务的ip及端口ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.117.17.106:61616");// 2. 创建一个connetion对象Connection connection = connectionFactory.createConnection();// 3. 开启连接connection.start();// 4. 得到一个session对象Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 5. 创建一个topic对象Topic topic = session.createTopic("test-topic");// 6. 得到一个consumer对象MessageConsumer consumer = session.createConsumer(topic);// 7. 设置消息监听对象,用来接收消息consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {// 接受消息if (message instanceof TextMessage) {// 如果是文本消息 则可以强转TextMessage textMessage = (TextMessage) message;try {// 打印消息String text = textMessage.getText();System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}}});System.out.println("topic消费者1..");// 8. 循环等待System.in.read();// 9. 关闭资源consumer.close();session.close();connection.close();}