消息的发布有2种形式, 队列式(点对点) 和主题式(pub/sub) 模式, 队列式发布后, 接收者从队列中获取消息后, 消息就会消失, 但任意消费者都可以从队列中接受消息, 消息只能被接受一次

主题式则为接受后消息不消失

JMS 是(java message service) 是 基于JVM代理的规范, ActiveMQ是他的一种实现

、JMS消息基本组件

2.1、ConnectionFactory

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。

2.2、Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

2.3、Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。

2.4、Session

Session是操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。

2.5、消息的生产者

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

2.6、消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

2.7、MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

1, 安装activeMQ

1), linux安装

访问: http://activemq.apache.org/activemq-5111-release.html

2), docker安装

sudo docker run -d -p : -p : cloudesire/activemq

安装成功后, 可访问:

3) 使用springboot的内嵌 activemq

 <!--springboot 内嵌 activemq-->
<dependency>
<groupId>org.apacke.activemq</groupId>
<artifactId>activemq-broker</artifactId>
</dependency>

2, 新建springboot项目

1), 添加依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
</dependency>

2), 添加配置:

spring:
activemq:
broker-url: tcp://192.168.50.202:61616

支持的配置有:

  activemq:
broker-url: tcp://192.168.50.202:61616
user:
password:
in-memory:

3) 消息发送者:

package com.wenbronk.enterprise.jms.message;

import org.springframework.jms.core.MessageCreator;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session; /**
* 消息创建者
* Created by wenbronk on 2017/6/13.
*/
public class CreateMessage implements MessageCreator{
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("测试消息");
}
}

4) 消息接受着:

package com.wenbronk.enterprise.jms.message;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; /**
* 消息接受者
* Created by wenbronk on 2017/6/13.
*/
@Component
public class ReceiMessage { /**
* 使用 @JmsListener 指定要监听的域, 有消息发送时就会发送到此域中
* @param message
*/
@JmsListener(destination = "my-destination")
public void receiveMessage(String message) {
System.out.println("接受到的消息是: " + message);
} }

5), 消息发送:

package com.wenbronk.enterprise.jms.config;

import com.wenbronk.enterprise.jms.message.CreateMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component; /**
* 消息发送及目的地定义
* 实现commandLineRunner, 使得程序启动后执行该类的run() 方法
* Created by wenbronk on 2017/6/13.
*/
@Component
public class MessageConfig implements CommandLineRunner { @Autowired
private JmsTemplate jmsTemplate; /**
* 消息域为 my-destination
* 发送者为 createMessage()
* @param args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
jmsTemplate.send("my-destination", new CreateMessage());
}
}

如果想自定义使用 topic 或者 queue 模式, 需要自己指定:

MessageConfig

package com.wenbronk.enterprise.jms.config;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.jms.Queue;
import javax.jms.Topic; /**
* 创建 点对点模式的对象和发布订阅模式的对象
* Created by wenbronk on 2017/6/13.
*/
@Configuration
public class TopicConfig {
@Bean
public Queue queue() {
return new ActiveMQQueue("sample.queue");
} @Bean
public Topic topic() {
return new ActiveMQTopic("sample.topic");
}
}

消息发布者:

package com.wenbronk.enterprise.jms.producer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import javax.jms.Queue;
import javax.jms.Topic; /**
* 点对点和订阅模式的消息发布
* Created by wenbronk on 2017/6/13.
*/
@Component
@EnableScheduling
public class MessageProducer { @Autowired
private JmsMessagingTemplate jmsMessagingTemplate; @Autowired
private Queue queue; @Autowired
private Topic topic; @Scheduled(fixedDelay=)//每3s执行1次
public void send() {
//send queue.
this.jmsMessagingTemplate.convertAndSend(this.queue, "hi,activeMQ");
//send topic.
this.jmsMessagingTemplate.convertAndSend(this.topic, "hi,activeMQ(topic)");
} }

消息接受者

package com.wenbronk.enterprise.jms.message;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; /**
* 点对点和订阅模式的消息接受着
* Created by wenbronk on 2017/6/13.
*/
@Component
public class MessageConsumer { @JmsListener(destination = "sample.topic")
public void receiveQueue(String text) {
System.out.println("Consumer2="+text);
} @JmsListener(destination = "sample.topic")
public void receiveTopic(String text) {
System.out.println("Consumer3="+text);
} }

需要在配置文件中开启 发布订阅模式的支持: 

spring:   
 activemq:
broker-url: tcp://192.168.50.202:61616
jms:
pub-sub-domain: true

springboot-25-springboot 集成 ActiveMq的更多相关文章

  1. SpringBoot集成ActiveMQ

    前面提到了原生API访问ActiveMQ和Spring集成ActiveMQ.今天讲一下SpringBoot集成ActiveMQ.SpringBoot就是为了解决我们的Maven配置烦恼而生,因此使用S ...

  2. Springboot简单集成ActiveMQ

    Springboot简单集成ActiveMQ 消息发送者的实现 pom.xml添加依赖 <dependency> <groupId>org.springframework.bo ...

  3. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  4. SpringBoot(七):集成DataSource 与 Druid监控配置

    绑定DataSource:Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource,Druid是Java语言中最好的数据库连接池,并且能够提供 ...

  5. DEMO: springboot 与 freemarker 集成

    直接在 DEMO: springboot 与 mybatis 集成 基础上,进行修改. 1.pom.xml 中引用 依赖 <dependency> <groupId>org.s ...

  6. Springboot 和 Mybatis集成开发

    Springboot 和 Mybatis集成开发 本项目使用的环境: 开发工具:Intellij IDEA 2017.1.3 jdk:1.7.0_79 maven:3.3.9 额外功能 PageHel ...

  7. 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)

    这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...

  8. 在前后端分离的SpringBoot项目中集成Shiro权限框架

    参考[1].在前后端分离的SpringBoot项目中集成Shiro权限框架 参考[2]. Springboot + Vue + shiro 实现前后端分离.权限控制   以及跨域的问题也有涉及

  9. SpringBoot系列之集成jsp模板引擎

    目录 1.模板引擎简介 2.环境准备 4.源码原理简介 SpringBoot系列之集成jsp模板引擎 @ 1.模板引擎简介 引用百度百科的模板引擎解释: 模板引擎(这里特指用于Web开发的模板引擎)是 ...

  10. SpringBoot系列之集成Druid配置数据源监控

    SpringBoot系列之集成Druid配置数据源监控 继上一篇博客SpringBoot系列之JDBC数据访问之后,本博客再介绍数据库连接池框架Druid的使用 实验环境准备: Maven Intel ...

随机推荐

  1. codevs 1012

    题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 Input Description 第一行一个正整数n 第二行n个用空格隔开的整数 输出描述 Output De ...

  2. Bellman_ford货币兑换——正权回路判断

    POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...

  3. 哈希连接(hash join) 原理

    哈希连接(hashjoin)    访问次数:驱动表和被驱动表都只会访问0次或1次.    驱动表是否有顺序:有.    是否要排序:否.    应用场景: 1. 一个大表,一个小表的关联:     ...

  4. 【python】基础入门

    1.正则表达式 import re sql="aaa$1bbbbccccc$2sdfsd gps_install_note_id =$3;" regexp=r'\$\d+' # 编 ...

  5. unusedjs

    查看js的有效使用情况: https://github.com/gmetais/unusedjs Installation You need to open your console and writ ...

  6. grunt管理js/css

    1.安装node 2.npm安装 3.运行grunt,可能遇到下面的问题 可以运行npm install -g grunt 然后再运行grunt 可以看到已经压缩成功了:

  7. DBCC--CHECKDB--结果收集

    --由宋沄剑提供 CREATE TABLE [dbo].[dbcc_history]( [Error] [int] NULL, [Level] [int] NULL, [State] [int] NU ...

  8. Kafka send问题

    kafka 在send之后不会立即把消息发送到broker.会把消息发到producer所在电脑内存里,后端的IOThread会扫描内存,并从中取出消息进行消费. 在调用close()或者flush( ...

  9. go语言的null值问题

    关于go语言数据库存储和显示null值的问题困扰了我很久,并且也和群友讨论过这个问题,但是都没有得到相对满意和全面的答案.最近FQ找了几篇相对详细和权威的文章,分享给大家,希望和大家一起进步,go g ...

  10. Day 6 编码的进阶

     https://blog.csdn.net/Deft_MKJing/article/details/79460485 a.ascii码:8位表示一个字符,共可以表示2**8个(即256)字符 ,   ...