ElasticSearch(九):springboot项目集成消息中间件activeMQ
目的:为了将elasticsearch做成单独的服务,那么我们必须解耦,也就是业务逻辑和搜索模块是没有关系的,并且是异步的。那么项目之间通信,使用的选择有限,消息中间件是一个不错的选择。
消息中间件常用的:ActiveMQ,RabbitMQ,RocketMQ,Kafka等。由于activeMQ是使用java开发的,并且有比较完整的文档,在很多公司都有较多的应用,最重要的,产品比较成熟。所以选择了activeMQ作为中间件。由于这个项目是探索项目,所以只是一个单机版本的中间件,并且没有对消息进行持久化,也没有判断消息的重复消费和丢失等,完全是最简单的应用。
至于复杂的东西,以后会慢慢更新。
正文
1. windows下安装并启动activeMQ。
网址:这里下载最新版本的activeMQ,这里下载任意版本的activeMQ
下载完之后如下:

然后双击 bin/win64/activemq.bat (根据自己系统启动)
启动完成之后如下:访问localhost:8161 ,然后点击 manager ActiveMQ broker 会要求输入账号密码,账号密码分别为admin,admin。(账号是在目录下 conf-->users.properties配置文件中)
第三个页面表示你已经等了成功了,在Queues和Topics里面可以看到接收到的发布,订阅消息。



2. application.properities文件配置activeMQ的参数。
application.properties配置文件如下:
spring.activemq.broker-url=tcp://localhost:61616 //tcp连接的网址和端口,这里端口是61616,不是8161
spring.activemq.close-timeout=15s
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=10
3. 配置ActiveMQ的配置类
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 org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory; import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic; /**
* @author: cc
* @Date: 2018/8/29 11:22
* @Description:
*/
@Configuration
public class JmsConfig { public final static String TOPIC_CREATE = "es.topic.create";
public final static String QUEUE_CREATE = "es.queue.create";
public final static String TOPIC_DELETE = "es.topic.delete";
public final static String QUEUE_DELETE = "es.queue.delete";
public final static String TOPIC_UPDATE = "es.topic.update";
public final static String QUEUE_UPDATE = "es.queue.update"; @Bean("esQueueCreate")
public Queue esQueueCreate() {
return new ActiveMQQueue(QUEUE_CREATE);
}
@Bean("esQueueDelete")
public Queue esQueueDelete() {
return new ActiveMQQueue(QUEUE_DELETE);
}
@Bean("esQueueUpdate")
public Queue esQueueUpdate() {
return new ActiveMQQueue(QUEUE_UPDATE);
} @Bean("esTopicCreate")
public Topic esTopicCreate() {
return new ActiveMQTopic(TOPIC_CREATE);
}
@Bean("esTopicDelete")
public Topic esTopicDelete() {
return new ActiveMQTopic(TOPIC_DELETE);
}
@Bean("esTopicUpdate")
public Topic esTopicUpdate() {
return new ActiveMQTopic(TOPIC_UPDATE);
}
/**
* topic模式的ListenerContainer
* @param activeMQConnectionFactory
* @return
*/
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
} /**
* queue模式的ListenerContainer
* @param activeMQConnectionFactory
* @return
*/
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
}
解释:
这里分别定义了queue 和topic 的增加,删除,修改的消息,分别用来接收调用服务的修改,添加,删除数据的对应的操作(如果使用一个,那么就需要对数据进行判断到底是执行的什么操作。)
后来定义了两个异步的消息监听器,本质是一样的,一个监听queue,一个监听topic
4. 创建消息生成类,消息消费类
消息生成类:发送消息到activeMQ的类
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.jms.Destination; /**
* @author: cc
* @Date: 2018/8/29 11:04
* @Description:
*/ @Service
public class Producer {
@Resource
private JmsTemplate jmsTemplate; public void sendMessage(Destination destination, String message) {
this.jmsTemplate.convertAndSend(destination,message);
} }
消息消费类:只需要在需要监听的方法上加上注解:(topic或者queue)
@JmsListener(destination = JmsConfig.TOPIC,containerFactory = "jmsListenerContainerTopic")
@JmsListener(destination = JmsConfig.QUEUE,containerFactory = "jmsListenerContainerQueue")
即可完成消息的监听,你可以在你的方法上直接接受String类型的消息进行解析。
如下:
public class Consumer {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@JmsListener(destination = JmsConfig.TOPIC_CREATE,containerFactory = "jmsListenerContainerTopic")
public void onTopicMessage(String msg) {
logger.info("接收到topic消息:{}",msg);
}
@JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue")
public void onQueueMessage(String msg) {
logger.info("接收到queue消息:{}",msg);
}
}
5. 完成
到这里已经可以发送消息和接受消息了,但是有很多问题的,比如消息丢失,重复消费等等问题,以后在解决。目前已经可以进行项目通信了。
ElasticSearch(九):springboot项目集成消息中间件activeMQ的更多相关文章
- SpringBoot项目集成Hystrix
Hystrix Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟.异常,引起资源耗尽导致系统不可用的解决方案. 1.什么是服务熔断 服务熔断就是对该服务的调用 ...
- SpringBoot项目集成PageHelper使用
SpringBoot项目集成PageHelper使用 一.开始 地址:https://github.com/pagehelper/Mybatis-PageHelper 在spring boot ...
- 七、SpringBoot项目集成JSP以及项目不同启动方式及访问路径配置
1.创建JSP目录 在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图: 然后再改文件夹下面我们创建JSP文件: 大家在使用IDEA 的new菜单创建JSP ...
- springboot项目集成activity
1.按照上一篇博客,新建好springboot项目后,在项目pom.xml文件中添加activity依赖 <dependency> <groupId>org.activiti& ...
- Springboot项目集成JPush极光推送(Java SDK)
1.由于项目的需求,需要在Android APP上实现消息推送功能,所以引用了极光推送(官网:https://www.jiguang.cn/, 文档:http://docs.jiguang.cn/) ...
- 使用IDEA快速搭建基于Maven的SpringBoot项目(集成使用Redis)
迫于好久没写博客心慌慌,随便写个简单版的笔记便于查阅. 新建项目 新建项目 然后起名 继续next netx finish. 首先附上demo的项目结构图 配置pom.xml <?xml ver ...
- 「Elasticsearch」SpringBoot快速集成ES
Elastic Search 的底层是开源库 Lucene.但是Lucene的使用门槛比较高,必须自己写代码去调用它的接口.而Elastic Search的出现正是为了解决了这个问题,它是 Lucen ...
- SpringBoot项目集成socketIo实现实时推送
netty-socketio maven依赖 <dependency> <groupId>com.corundumstudio.socketio</groupId> ...
- SpringBoot项目集成cas单点登录
添加依赖 添加cas client依赖 <dependency> <groupId>net.unicon.cas</groupId> <artifactId& ...
随机推荐
- SSD论文理解
SSD论文贡献: 1. 引入了一种单阶段的检测器,比以前的算法YOLO更准更快,并没有使用RPN和Pooling操作: 2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类 ...
- js事件轮询机制
console.log(1) setTimeout(function(){ console.log(2) },0); console.log(3) 毫无疑问:运行结果是1 3 2 也就是说:setTi ...
- 关于网站的SYN_RECV(SYN_RECEIVED)***的防范措施
关于网站的SYN_RECV(SYN_RECEIVED)***的防范措施 一.总结 一句话总结:SYN ***是最常见又最容易被利用的一种***手法.相信很多人还记得2000年YAHOO网站遭受的*** ...
- 卸载 PrestaShop 1.7
PrestaShop 的卸载非常简单: 在你的 Web 服务器上删除所有 PrestaShop 的文件和目录.你可以使用 FTP 客户端,你也可以使用 SSH 工具. 使用数据库工具删除数据库中所有以 ...
- (转载)-关于sg函数的理解
最近学习了nim博弈,但是始终无法理解sg函数为什么sg[S]=mex(sg[S'] | S->S'),看到一篇博文解释的不错,截取了需要的几章节. 四.Sprague-Grundy数的提出 我 ...
- ASP.NET的内置对象 —— Request 对象
Request 对象最大的用途在于提交表单信息. (可获取页面间传递的值.客户端的 IP 地址等) 3.2.2 获取页面间传送的值 获取页面传送参数值是 Request 对象最广泛的应用之一. ASP ...
- 供应商API补充(详解EBS接口开发之供应商导入)(转)
原文地址 供应商导入的API补充(详解EBS接口开发之供应商导入) --供应商 --创建 AP_VENDOR_PUB_PKG.Create_Vendor ( p_api_version IN NUM ...
- javassist和jdk动态代理
先来一个InvocationHandler示例,InvocationHandler类的作用是:对原始对象的方法做一个拦截. package com.zhang; import java.lang.re ...
- shiro中OAuth2 集成
OAuth 角色 资源拥有者(resource owner): 能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户:如新浪微博用户 zhangsan: 资源服务器(resource s ...
- webservice-jdk客户端代码
使用wsimport.exe 生成客户端代码 使用JDK的bin文件夹中,有一个wsimport.exe,这个工具依据wsdl文件生成相应的类文件,然后用这些文件就可以像调用本地类一样调用本地的类一样 ...