消息的发布有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. Android类装载器DexClassLoader的简单使用-----制作android插件的前奏

    声明:此篇文章借鉴<android内核剖析>整理得来. 一.装载器简介 “类装载器”(ClassLoader),顾名思义,就是用来动态装载class文件的.标准的Java SDK中有个Cl ...

  2. 百度离线地图,web

    1.首先获取百度 JavaScript API 首先用浏览器打开 http://api.map.baidu.com/api?v=1.3 其中 http://api.map.baidu.com/gets ...

  3. Java菜鸟学习笔记()--面向对象篇(七):Wrapper Class包装类

    什么是包装类? 在Java里一切都是对象,除了Java中的基本数据类型(byte,short,int,long,char,float,double,boolean)不是面向对象的,这在实际使用时存在很 ...

  4. SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话

    第一阶中我们描述了如何在Profiler中自定义一个Trace,并且让它运行在服务器端来创建一个Trace文件.然后我们通过Jonathan Kehayias的 sp_SQLskills_Conver ...

  5. Spark Structured Stream 2

    ❤Limitations of DStream API Batch Time Constraint application级别的设置. 不支持EventTime event time 比process ...

  6. 记一次IIS站点出错的解决过程

    记一次IIS站点出错的解决过程 以前一直都是人家用着系统出问题了反馈过来这边改,没想到这回就发生在自己使用的过程中 问题经过 我正在执行一个操作,保存了没有返回提示,打开浏览器控制台查看网络,请求返回 ...

  7. .NET Core MemoryCache缓存获取全部缓存键

    在Core中不能使用原HttpRuntime.Cache缓存,改为MemoryCache(Microsoft.Extensions.Caching.Memory). 现MemoryCache新版为2. ...

  8. 基于STM32的平衡车机器人设计-硬件电路设计

    今天分享一个STM32F103为主控的自平衡车机器人的硬件电路设计.(亲测完全可用,且没有任何问题) 电路原理图: 电源部分采用12V锂电池作为输入,分三路稳压,其中7805作为5V传感器的供电以及后 ...

  9. qt linux下配置安装

    linux版本: qt卸载: 1. 先找到qt的安装位置: 2.然后执行其下面的文件MaintenanceTool: 3. 然后会出现图形界面: 卸载完成. 安装qt 下载地址: https://ww ...

  10. Java中的String,StringBuilder,StringBuffer的区别

    这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > ...