import
org
.
apache
.
activemq
.
ActiveMQConnectionFactory
;
import
org
.
springframework
.
beans
.
factory
.
annotation
.
Qualifier
;
import
org
.
springframework
.
beans
.
factory
.
annotation
.
Value
;
import
org
.
springframework
.
context
.
annotation
.
Bean
;
import
org
.
springframework
.
context
.
annotation
.
Configuration
;
import
org
.
springframework
.
context
.
annotation
.
Primary
;
import
org
.
springframework
.
jms
.
config
.
DefaultJmsListenerContainerFactory
;
import
org
.
springframework
.
jms
.
config
.
JmsListenerContainerFactory
;
import
org
.
springframework
.
jms
.
core
.
JmsTemplate
;
* @program: service
* @description activemq 配置类
* @author: wys
* @create: 2020-06-03
@Configuration
public
class
ActiveMqConfigs
{
* one mq 地址 账户密码注入
* @param brokerUrl
* @param username
* @param password
* @return
@Bean
(
name
=
"oneConnectionFactory"
)
@Primary
public
ActiveMQConnectionFactory
oneConnectionFactory
(
@Value
(
"${activemq.one.brokerUrl}"
)
String brokerUrl
,
@Value
(
"${activemq.one.user}"
)
String username
,
@Value
(
"${activemq.one.password}"
)
String password
)
{
ActiveMQConnectionFactory factory
=
new
ActiveMQConnectionFactory
(
)
;
factory
.
setBrokerURL
(
brokerUrl
)
;
factory
.
setUserName
(
username
)
;
factory
.
setPassword
(
password
)
;
return
factory
;
* one JmsTemplate生成
* @param connectionFactory
* @param pubSubDmain
* @return
@Bean
(
name
=
"oneJmsTemplate"
)
@Primary
public
JmsTemplate
oneJmsTemplate
(
@Qualifier
(
"oneConnectionFactory"
)
ActiveMQConnectionFactory connectionFactory
,
@Value
(
"${activemq.one.pub-sub-domain}"
)
boolean
pubSubDmain
)
{
JmsTemplate jmsTemplate
=
new
JmsTemplate
(
connectionFactory
)
;
jmsTemplate
.
setPubSubDomain
(
pubSubDmain
)
;
return
jmsTemplate
;
* one JmsListener工厂生成
* @param connectionFactory
* @param pubSubDmain
* @return
@Bean
(
name
=
"oneJmsListenerContainerFactory"
)
@Primary
public
JmsListenerContainerFactory
oneJmsListenerContainerFactory
(
@Qualifier
(
"oneConnectionFactory"
)
ActiveMQConnectionFactory connectionFactory
,
@Value
(
"${activemq.one.pub-sub-domain}"
)
boolean
pubSubDmain
)
{
DefaultJmsListenerContainerFactory factory
=
new
DefaultJmsListenerContainerFactory
(
)
;
factory
.
setConnectionFactory
(
connectionFactory
)
;
factory
.
setPubSubDomain
(
pubSubDmain
)
;
return
factory
;
* two mq 地址 账号密码注入
* @param brokerUrl
* @param username
* @param password
* @return
@Bean
(
name
=
"twoConnectionFactory"
)
public
ActiveMQConnectionFactory
twoConnectionFactory
(
@Value
(
"${activemq.two.brokerUrl}"
)
String brokerUrl
,
@Value
(
"${activemq.two.user}"
)
String username
,
@Value
(
"${activemq.two.password}"
)
String password
)
{
ActiveMQConnectionFactory factory
=
new
ActiveMQConnectionFactory
(
)
;
factory
.
setBrokerURL
(
brokerUrl
)
;
factory
.
setUserName
(
username
)
;
factory
.
setPassword
(
password
)
;
return
factory
;
* two JmsTemplate生成
* @param connectionFactory
* @param pubSubDmain
* @return
@Bean
(
name
=
"twoJmsTemplate"
)
public
JmsTemplate
twoJmsTemplate
(
@Qualifier
(
"twoConnectionFactory"
)
ActiveMQConnectionFactory connectionFactory
,
@Value
(
"${activemq.two.pub-sub-domain}"
)
boolean
pubSubDmain
)
{
JmsTemplate jmsTemplate
=
new
JmsTemplate
(
connectionFactory
)
;
jmsTemplate
.
setPubSubDomain
(
pubSubDmain
)
;
return
jmsTemplate
;
* two JmsListener工厂生成
* @param connectionFactory
* @param pubSubDmain
* @return
@Bean
(
name
=
"twoJmsListenerContainerFactory"
)
public
JmsListenerContainerFactory
twoJmsListenerContainerFactory
(
@Qualifier
(
"twoConnectionFactory"
)
ActiveMQConnectionFactory connectionFactory
,
@Value
(
"${activemq.two.pub-sub-domain}"
)
boolean
pubSubDmain
)
{
DefaultJmsListenerContainerFactory factory
=
new
DefaultJmsListenerContainerFactory
(
)
;
factory
.
setConnectionFactory
(
connectionFactory
)
;
factory
.
setPubSubDomain
(
pubSubDmain
)
;
return
factory
;
只要在注入对象前加@Qualifier注解就可以了,当然也可以用 @Resource注解。
jmsTemplate.convertAndSend方法的第一个参数是要发送的mq名称,第二个参数是mq的内容。
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
@Qualifier("oneJmsTemplate")
private JmsTemplate jmsTemplate;
* 查询发送测试
public void sendMq() {
try {
jmsTemplate.convertAndSend("mqName","content");
} catch (Exception e) {
log.error("SendMsgController.sendMq()", e);
* 接收one mq方法
* @param message
@JmsListener(destination = "${msgListener.oneMqName}" ,containerFactory = "oneJmsListenerContainerFactory")
public void receiveQueueOne(String message) {
if (StringUtils.isEmpty(message)) {
return;
* 接收two mq方法
* @param message
@JmsListener(destination = "${msgListener.twoMqName}" ,containerFactory = "twoJmsListenerContainerFactory")
public void receiveQueueTwo(String message) {
if (StringUtils.isEmpty(message)) {
return;
如果接收相同ip相同queues或topics的队列,就不用增加配置,直接调用即可. 如和one的ip相同,直接复制receiveQueueOne方法,修改方法名和注解上的destination配置即可,containerFactory配置不用修改。
springboot链接两个ActiveMq(多个)1.修改yml文件建议:最好把原来的配置去了 。spring:# activemq:# broker-url: tcp://127.0.0.1:61616# user: admin# password: admin# jms: #true:topic模式,false:queue模式# pub-sub-domain: trueactivemq: one: brokerUrl: tcp:/
ActiveMQ 多机房容灾
ActiveMQ 带有一个 。 其中的多台 ActiveMQ Broker 彼此应该使用桥接方式相连,否则可能会出现没有 Consumer 的问题。但在多机房 ActiveMQ 集群中,考虑到跨机房的网络速度,不同机房的 Broker 之间并没有桥接。因此,为了保证每一个机房的 Broker 上都有足够数量的 Consumer,Consumer 需要分机房进行单独部署。这就产生了重复配置的问题。
Spring JMS 和 Spring Boot ActiveMQ Starter 对此场景并没有考虑。本项目的一个主要目的就是解决这一问题,简化多机房 ActiveMQ 的配置。
注:本项目并不强依赖于 Spring Boot,但为了简化开发使用,设计为 Spring Bo
#mq引入
spring.default.activemq.brokerUrl=tcp://192.168.1.12:61616?wireFormat.maxInactivityDuration=10000
spring.default.activemq.user=admin
spring.default.activemq.password=admin
spring.mq119.activemq.brokerUrl=tcp://119.251.214..
在我们的日常工作中,大部分情况下,我们的服务一般只需要连接某一个存放消息的rabbitMQ服务器。但是,现在多用微服务和分布式的开发部署模式,一个服务连接
多个rabbitMQ服务器的需求也难以避免。最近刚好遇到,并实现,发出步骤,避免大家走弯路。
首先是yml或者propertes文件中的配置信息:
spring.rabbitmq.first.host = XXXX
spring.rabbitmq.first.port = XXXX
spring.rabbitmq.first.username = XXX
一、消息队列概述
1、什么是消息队列?
消息队列是消息中间件的一种实现方式。消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
目前的消息队列有:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。本篇主要对activeMQ集成到SpringBoot项目做详解。
消息队列在实际应用中常用的使用场景有异步处理,应用解耦,流量削锋和消息通讯四个场景。
2、修改里面的activemq.xml文件 ①brokerName不能和原来的重复
②数据存放的文件名称不能重复,比如<kahaDB directory = "${activemq.data}/kahadb2"/>
③所有涉及的transportCon...
在这个过程中调用三方通道(短信或银行通道)都比较耗时,同时账务处理可能也是由专门的账务系统进行处理。那么,为了提高并发和相应速度,后面的三个操作都可以通过异步进行处理。这就用到了消息队列。
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。
市面上比较常见的消息队列有:Act
Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clien
ActiveMQ 是一个流行的、开源的消息队列(Message Queue)和消息中间件(Message Middleware)实现,它支持多种语言和平台。以下是一些学习 ActiveMQ 的教程:
1. ActiveMQ 官方文档:ActiveMQ 的官方文档提供了全面而详细的说明,涵盖了 ActiveMQ 的基本概念、使用方法、配置、开发和集成等方面。
2. Apache ActiveMQ 教程:这是一个适合初学者的 ActiveMQ 教程,涵盖了 ActiveMQ 的基本概念、配置、使用和集成等方面,并提供了许多示例代码。
3. Spring 整合 ActiveMQ 教程:这是一个介绍如何使用 Spring 框架集成 ActiveMQ 的教程,包括 Spring 中如何配置 ActiveMQ、如何使用 Spring JMS API 和 Spring Boot 中如何使用 ActiveMQ 等内容。
4. ActiveMQ 实战教程:这是一个基于实战的 ActiveMQ 教程,介绍了如何使用 ActiveMQ 解决实际问题,例如如何使用 ActiveMQ 实现异步通信、如何使用 ActiveMQ 实现分布式系统、如何使用 ActiveMQ 实现发布-订阅等等。
希望以上推荐的教程能帮助您更好地学习和使用 ActiveMQ。
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans
34010
JSON解析出错 Cause: java.lang.IllegalStateException: No typehandler found for property xxx
Daemon-:
maven打包失败 Cannot create resource output directory[已解决]
武yuanshun:
maven打包失败 Cannot create resource output directory[已解决]
你好,我想请教一下,如果我是在Ubuntu里用mvn打包出现了这个问题怎么解决
Your installed version of Erlang (6.2) is too old. Please install a more recent version.[已解决]
武yuanshun:
Your installed version of Erlang (6.2) is too old. Please install a more recent version.[已解决]
过客执念: