Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
06a5cc9b
"src/vscode:/vscode.git/clone" did not exist on "61d615d1290f82246feee5e495f706f4177f9bf4"
Commit
06a5cc9b
authored
Jul 23, 2021
by
terrfly
Browse files
完成components.mq 组件, 完成activeMQ和rabbitMQ的封装, 对消息生产者和消费者的配置透明化。
parent
8e9e6087
Changes
19
Show whitespace changes
Inline
Side-by-side
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/constant/MQSendTypeEnum.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.constant
;
/**
* 定义MQ消息类型:
* QUEUE - 点对点 (只有1个消费者可消费)
* TOPIC - 订阅模式 (所有接收者都可接收到)
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:49
*/
public
enum
MQSendTypeEnum
{
QUEUE
,
TOPIC
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/constant/MQVenderCS.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.constant
;
/**
* MQ 厂商定义类
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:50
*/
public
class
MQVenderCS
{
public
static
final
String
YML_VENDER_KEY
=
"isys.mq.vender"
;
public
static
final
String
ACTIVE_MQ
=
"activeMQ"
;
public
static
final
String
RABBIT_MQ
=
"rabbitMQ"
;
public
static
final
String
ROCKET_MQ
=
"rocketMQ"
;
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/executor/MqThreadExecutor.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.executor
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.scheduling.annotation.EnableAsync
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
java.util.concurrent.Executor
;
import
java.util.concurrent.ThreadPoolExecutor
;
/*
* MQ 线程池配置
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/6/8 17:33
*/
@Configuration
@EnableAsync
public
class
MqThreadExecutor
{
public
static
final
String
EXECUTOR_PAYORDER_MCH_NOTIFY
=
"mqQueue4PayOrderMchNotifyExecutor"
;
/*
* 功能描述:
* 支付结果通知到商户的异步执行器 (由于量大, 单独新建一个线程池处理, 之前的不做变动 )
* 20, 300, 10, 60 该配置: 同一时间最大并发量300,(已经验证通过, 商户都可以收到请求消息)
* 缓存队列尽量减少,否则将堵塞在队列中无法执行。 corePoolSize 根据机器的配置进行添加。此处设置的为20
*/
@Bean
public
Executor
mqQueue4PayOrderMchNotifyExecutor
()
{
ThreadPoolTaskExecutor
executor
=
new
ThreadPoolTaskExecutor
();
executor
.
setCorePoolSize
(
20
);
// 线程池维护线程的最少数量
executor
.
setMaxPoolSize
(
300
);
// 线程池维护线程的最大数量
executor
.
setQueueCapacity
(
10
);
// 缓存队列
executor
.
setThreadNamePrefix
(
"payOrderMchNotifyExecutor-"
);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor
.
setRejectedExecutionHandler
(
new
ThreadPoolExecutor
.
CallerRunsPolicy
());
//对拒绝task的处理策略
executor
.
setKeepAliveSeconds
(
60
);
// 允许的空闲时间
executor
.
initialize
();
return
executor
;
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/AbstractMQ.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.model
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
/**
* 定义MQ消息格式
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 15:33
*/
public
abstract
class
AbstractMQ
{
/** MQ名称 **/
public
abstract
String
getMQName
();
/** MQ 类型 **/
public
abstract
MQSendTypeEnum
getMQType
();
/** 构造MQ消息体 String类型 **/
public
abstract
String
toMessage
();
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderMchNotifyMQ.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.model
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
*
* 定义MQ消息格式
* 业务场景: [ 支付订单的商户通知消息 ]
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 15:25
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
PayOrderMchNotifyMQ
extends
AbstractMQ
{
/** 【!重要配置项!】 定义MQ名称 **/
public
static
final
String
MQ_NAME
=
"QUEUE_PAY_ORDER_MCH_NOTIFY"
;
/** 内置msg 消息体定义 **/
private
MsgPayload
payload
;
/** 【!重要配置项!】 定义Msg消息载体 **/
@Data
@AllArgsConstructor
public
static
class
MsgPayload
{
/** 支付订单号 **/
private
String
payOrderId
;
}
@Override
public
String
getMQName
()
{
return
MQ_NAME
;
}
/** 【!重要配置项!】 **/
@Override
public
MQSendTypeEnum
getMQType
(){
return
MQSendTypeEnum
.
QUEUE
;
// QUEUE - 点对点 、 Topic - 订阅模式
}
@Override
public
String
toMessage
()
{
return
JSONObject
.
toJSONString
(
payload
);
}
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
public
static
PayOrderMchNotifyMQ
build
(
String
payOrderId
){
return
new
PayOrderMchNotifyMQ
(
new
MsgPayload
(
payOrderId
));
}
/** 解析MQ消息, 一般用于接收MQ消息时 **/
public
static
MsgPayload
parse
(
String
msg
){
return
JSON
.
parseObject
(
msg
,
MsgPayload
.
class
);
}
/** 定义 IMQReceiver 接口: 项目实现该接口则可接收到对应的业务消息 **/
public
interface
IMQReceiver
{
void
receive
(
MsgPayload
payload
);
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderReissueMQ.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.model
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
*
* 定义MQ消息格式
* 业务场景: [ 支付订单补单(一般用于没有回调的接口,比如微信的条码支付) ]
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 15:25
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
PayOrderReissueMQ
extends
AbstractMQ
{
/** 【!重要配置项!】 定义MQ名称 **/
public
static
final
String
MQ_NAME
=
"QUEUE_PAY_ORDER_REISSUE"
;
/** 内置msg 消息体定义 **/
private
MsgPayload
payload
;
/** 【!重要配置项!】 定义Msg消息载体 **/
@Data
@AllArgsConstructor
public
static
class
MsgPayload
{
/** 支付订单号 **/
private
String
payOrderId
;
}
@Override
public
String
getMQName
()
{
return
MQ_NAME
;
}
/** 【!重要配置项!】 **/
@Override
public
MQSendTypeEnum
getMQType
(){
return
MQSendTypeEnum
.
QUEUE
;
// QUEUE - 点对点 、 Topic - 订阅模式
}
@Override
public
String
toMessage
()
{
return
JSONObject
.
toJSONString
(
payload
);
}
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
public
static
PayOrderReissueMQ
build
(
String
payOrderId
){
return
new
PayOrderReissueMQ
(
new
MsgPayload
(
payOrderId
));
}
/** 解析MQ消息, 一般用于接收MQ消息时 **/
public
static
MsgPayload
parse
(
String
msg
){
return
JSON
.
parseObject
(
msg
,
MsgPayload
.
class
);
}
/** 定义 IMQReceiver 接口: 项目实现该接口则可接收到对应的业务消息 **/
public
interface
IMQReceiver
{
void
receive
(
MsgPayload
payload
);
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/ResetAppConfigMQ.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.model
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
*
* 定义MQ消息格式
* 业务场景: [ 更新系统配置参数 ]
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 15:25
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
ResetAppConfigMQ
extends
AbstractMQ
{
/** 【!重要配置项!】 定义MQ名称 **/
public
static
final
String
MQ_NAME
=
"TOPIC_RESET_APP_CONFIG"
;
/** 内置msg 消息体定义 **/
private
MsgPayload
payload
;
/** 【!重要配置项!】 定义Msg消息载体 **/
@Data
@AllArgsConstructor
public
static
class
MsgPayload
{
}
@Override
public
String
getMQName
()
{
return
MQ_NAME
;
}
/** 【!重要配置项!】 **/
@Override
public
MQSendTypeEnum
getMQType
(){
return
MQSendTypeEnum
.
TOPIC
;
// QUEUE - 点对点 、 Topic - 订阅模式
}
@Override
public
String
toMessage
()
{
return
JSONObject
.
toJSONString
(
payload
);
}
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
public
static
ResetAppConfigMQ
build
(){
return
new
ResetAppConfigMQ
(
new
MsgPayload
());
}
/** 解析MQ消息, 一般用于接收MQ消息时 **/
public
static
MsgPayload
parse
(
String
msg
){
return
JSON
.
parseObject
(
msg
,
MsgPayload
.
class
);
}
/** 定义 IMQReceiver 接口: 项目实现该接口则可接收到对应的业务消息 **/
public
interface
IMQReceiver
{
void
receive
(
MsgPayload
payload
);
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/IMQMsgReceiver.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender
;
/**
* MQ 消息接收器 接口定义
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/21 16:09
*/
public
interface
IMQMsgReceiver
{
/** 接收消息 **/
void
receiveMsg
(
String
msg
);
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/IMQSender.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender
;
import
com.jeequan.jeepay.components.mq.model.AbstractMQ
;
/**
* MQ 消息发送器 接口定义
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/21 16:09
*/
public
interface
IMQSender
{
/** 推送MQ消息, 实时 **/
void
send
(
AbstractMQ
mqModel
);
/** 推送MQ消息, 延迟接收,单位:s **/
void
send
(
AbstractMQ
mqModel
,
int
delay
);
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/activemq/ActiveMQConfig.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.activemq
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
com.jeequan.jeepay.components.mq.model.AbstractMQ
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
org.apache.activemq.command.ActiveMQQueue
;
import
org.apache.activemq.command.ActiveMQTopic
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.jms.config.DefaultJmsListenerContainerFactory
;
import
org.springframework.jms.config.JmsListenerContainerFactory
;
import
org.springframework.stereotype.Component
;
import
javax.jms.ConnectionFactory
;
import
javax.jms.Destination
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
/*
* activeMQ的配置项
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:51
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
ACTIVE_MQ
)
public
class
ActiveMQConfig
{
Map
<
String
,
Destination
>
map
=
new
ConcurrentHashMap
<>();
public
Destination
getDestination
(
AbstractMQ
mqModel
){
if
(
map
.
get
(
mqModel
.
getMQName
())
==
null
){
this
.
init
(
mqModel
.
getMQName
(),
mqModel
.
getMQType
());
}
return
map
.
get
(
mqModel
.
getMQName
());
}
private
synchronized
void
init
(
String
mqName
,
MQSendTypeEnum
mqSendTypeEnum
){
if
(
mqSendTypeEnum
==
MQSendTypeEnum
.
QUEUE
){
map
.
put
(
mqName
,
new
ActiveMQQueue
(
mqName
)
);
}
else
{
map
.
put
(
mqName
,
new
ActiveMQTopic
(
mqName
)
);
}
}
public
static
final
String
TOPIC_LISTENER_CONTAINER
=
"jmsTopicListenerContainer"
;
/** 新增jmsListenerContainer, 用于接收topic类型的消息 **/
@Bean
public
JmsListenerContainerFactory
<?>
jmsTopicListenerContainer
(
ConnectionFactory
factory
){
DefaultJmsListenerContainerFactory
bean
=
new
DefaultJmsListenerContainerFactory
();
bean
.
setPubSubDomain
(
true
);
bean
.
setConnectionFactory
(
factory
);
return
bean
;
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/activemq/ActiveMQSender.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.activemq
;
import
com.jeequan.jeepay.components.mq.model.AbstractMQ
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
com.jeequan.jeepay.components.mq.vender.IMQSender
;
import
org.apache.activemq.ScheduledMessage
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.jms.core.JmsTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.jms.TextMessage
;
/**
* activeMQ 消息发送器的实现
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:52
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
ACTIVE_MQ
)
public
class
ActiveMQSender
implements
IMQSender
{
@Autowired
private
ActiveMQConfig
activeMQConfig
;
@Autowired
private
JmsTemplate
jmsTemplate
;
@Override
public
void
send
(
AbstractMQ
mqModel
)
{
jmsTemplate
.
convertAndSend
(
activeMQConfig
.
getDestination
(
mqModel
),
mqModel
.
toMessage
());
}
@Override
public
void
send
(
AbstractMQ
mqModel
,
int
delay
)
{
jmsTemplate
.
send
(
activeMQConfig
.
getDestination
(
mqModel
),
session
->
{
TextMessage
tm
=
session
.
createTextMessage
(
mqModel
.
toMessage
());
tm
.
setLongProperty
(
ScheduledMessage
.
AMQ_SCHEDULED_DELAY
,
delay
);
tm
.
setLongProperty
(
ScheduledMessage
.
AMQ_SCHEDULED_PERIOD
,
1
*
1000
);
tm
.
setLongProperty
(
ScheduledMessage
.
AMQ_SCHEDULED_REPEAT
,
1
);
return
tm
;
});
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/activemq/receive/PayOrderMchNotifyActiveMQReceiver.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.activemq.receive
;
import
com.jeequan.jeepay.components.mq.executor.MqThreadExecutor
;
import
com.jeequan.jeepay.components.mq.model.PayOrderMchNotifyMQ
;
import
com.jeequan.jeepay.components.mq.vender.IMQMsgReceiver
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.jms.annotation.JmsListener
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
/**
* activeMQ 消息接收器:仅在vender=avtiveMQ时 && 项目实现IMQReceiver接口时 进行实例化
* 业务: 支付订单商户通知
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 17:06
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
ACTIVE_MQ
)
@ConditionalOnBean
(
PayOrderMchNotifyMQ
.
IMQReceiver
.
class
)
public
class
PayOrderMchNotifyActiveMQReceiver
implements
IMQMsgReceiver
{
@Autowired
private
PayOrderMchNotifyMQ
.
IMQReceiver
mqReceiver
;
/** 接收 【 queue 】 类型的消息 **/
@Async
(
MqThreadExecutor
.
EXECUTOR_PAYORDER_MCH_NOTIFY
)
@JmsListener
(
destination
=
PayOrderMchNotifyMQ
.
MQ_NAME
)
public
void
receiveMsg
(
String
msg
){
mqReceiver
.
receive
(
PayOrderMchNotifyMQ
.
parse
(
msg
));
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/activemq/receive/ResetAppConfigActiveMQReceiver.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.activemq.receive
;
import
com.jeequan.jeepay.components.mq.model.ResetAppConfigMQ
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
com.jeequan.jeepay.components.mq.vender.IMQMsgReceiver
;
import
com.jeequan.jeepay.components.mq.vender.activemq.ActiveMQConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.jms.annotation.JmsListener
;
import
org.springframework.stereotype.Component
;
/**
* activeMQ消息接收器:仅在vender=avtiveMQ时 && 项目实现IMQReceiver接口时 进行实例化
* 业务: 更新系统配置参数
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 17:06
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
ACTIVE_MQ
)
@ConditionalOnBean
(
ResetAppConfigMQ
.
IMQReceiver
.
class
)
public
class
ResetAppConfigActiveMQReceiver
implements
IMQMsgReceiver
{
@Autowired
private
ResetAppConfigMQ
.
IMQReceiver
mqReceiver
;
/** 接收 【 topic 】 类型的消息 **/
@JmsListener
(
destination
=
ResetAppConfigMQ
.
MQ_NAME
,
containerFactory
=
ActiveMQConfig
.
TOPIC_LISTENER_CONTAINER
)
public
void
receiveMsg
(
String
msg
){
mqReceiver
.
receive
(
ResetAppConfigMQ
.
parse
(
msg
));
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rabbitmq/RabbitMQBeanProcessor.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.rabbitmq
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
org.springframework.amqp.core.CustomExchange
;
import
org.springframework.beans.BeansException
;
import
org.springframework.beans.factory.config.ConfigurableListableBeanFactory
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 将spring容器的 [bean注册器]放置到属性中,为 RabbitConfig提供访问。
* 顺序:
* 1. postProcessBeanDefinitionRegistry (存放注册器)
* 2. postProcessBeanFactory (没有使用)
* 3. 注册延迟消息交换机的bean: delayedExchange
* 4. 动态配置RabbitMQ所需的bean。
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:27
*/
@Configuration
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
RABBIT_MQ
)
public
class
RabbitMQBeanProcessor
implements
BeanDefinitionRegistryPostProcessor
{
/** bean注册器 **/
protected
BeanDefinitionRegistry
beanDefinitionRegistry
;
@Override
public
void
postProcessBeanDefinitionRegistry
(
BeanDefinitionRegistry
beanDefinitionRegistry
)
throws
BeansException
{
this
.
beanDefinitionRegistry
=
beanDefinitionRegistry
;
}
@Override
public
void
postProcessBeanFactory
(
ConfigurableListableBeanFactory
configurableListableBeanFactory
)
throws
BeansException
{
}
/** 自定义交换机: 用于延迟消息 **/
@Bean
(
name
=
RabbitMQConfig
.
DELAYED_EXCHANGE_NAME
)
CustomExchange
delayedExchange
()
{
Map
<
String
,
Object
>
args
=
new
HashMap
<>();
args
.
put
(
"x-delayed-type"
,
"direct"
);
return
new
CustomExchange
(
RabbitMQConfig
.
DELAYED_EXCHANGE_NAME
,
"x-delayed-message"
,
true
,
false
,
args
);
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rabbitmq/RabbitMQConfig.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.rabbitmq
;
import
cn.hutool.core.util.ClassUtil
;
import
cn.hutool.core.util.ReflectUtil
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
com.jeequan.jeepay.components.mq.model.AbstractMQ
;
import
com.jeequan.jeepay.core.utils.SpringBeansUtil
;
import
org.springframework.amqp.core.*
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.support.BeanDefinitionBuilder
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.PostConstruct
;
import
java.util.Set
;
/**
* RabbitMQ的配置项
* 1. 注册全部定义好的Queue Bean
* 2. 动态注册fanout交换机
* 3. 将Queue模式绑定到延时消息的交换机
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:33
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
RABBIT_MQ
)
public
class
RabbitMQConfig
{
/** 全局定义延迟交换机名称 **/
public
static
final
String
DELAYED_EXCHANGE_NAME
=
"delayedExchange"
;
/** 扇形交换机前缀(activeMQ中的topic模式), 需根据queue动态拼接 **/
public
static
final
String
FANOUT_EXCHANGE_NAME_PREFIX
=
"fanout_exchange_"
;
/** 注入延迟交换机Bean **/
@Autowired
@Qualifier
(
DELAYED_EXCHANGE_NAME
)
private
CustomExchange
delayedExchange
;
/** 注入rabbitMQBeanProcessor **/
@Autowired
private
RabbitMQBeanProcessor
rabbitMQBeanProcessor
;
/** 在全部bean注册完成后再执行 **/
@PostConstruct
public
void
init
(){
// 获取到所有的MQ定义
Set
<
Class
<?>>
set
=
ClassUtil
.
scanPackageBySuper
(
ClassUtil
.
getPackage
(
AbstractMQ
.
class
),
AbstractMQ
.
class
);
for
(
Class
<?>
aClass
:
set
)
{
// 实例化
AbstractMQ
amq
=
(
AbstractMQ
)
ReflectUtil
.
newInstance
(
aClass
);
// 注册Queue === new Queue(name), queue名称/bean名称 = mqName
rabbitMQBeanProcessor
.
beanDefinitionRegistry
.
registerBeanDefinition
(
amq
.
getMQName
(),
BeanDefinitionBuilder
.
rootBeanDefinition
(
Queue
.
class
).
addConstructorArgValue
(
amq
.
getMQName
()).
getBeanDefinition
());
// topic模式
if
(
amq
.
getMQType
()
==
MQSendTypeEnum
.
TOPIC
){
// 动态注册交换机, 交换机名称/bean名称 = FANOUT_EXCHANGE_NAME_PREFIX + amq.getMQName()
rabbitMQBeanProcessor
.
beanDefinitionRegistry
.
registerBeanDefinition
(
FANOUT_EXCHANGE_NAME_PREFIX
+
amq
.
getMQName
(),
BeanDefinitionBuilder
.
genericBeanDefinition
(
FanoutExchange
.
class
,
()
->{
// 普通FanoutExchange 交换机
return
new
FanoutExchange
(
FANOUT_EXCHANGE_NAME_PREFIX
+
amq
.
getMQName
(),
true
,
false
);
// 支持 延迟的 FanoutExchange 交换机, 配置无效果。
// Map<String, Object> args = new HashMap<>();
// args.put("x-delayed-type", ExchangeTypes.FANOUT);
// return new CustomExchange(RabbitMQConfig.DELAYED_EXCHANGE_NAME, "x-delayed-message", true, false, args);
}
).
getBeanDefinition
()
);
}
else
{
// 延迟交换机与Queue进行绑定, 绑定Bean名称 = mqName_DelayedBind
rabbitMQBeanProcessor
.
beanDefinitionRegistry
.
registerBeanDefinition
(
amq
.
getMQName
()
+
"_DelayedBind"
,
BeanDefinitionBuilder
.
genericBeanDefinition
(
Binding
.
class
,
()
->
BindingBuilder
.
bind
(
SpringBeansUtil
.
getBean
(
amq
.
getMQName
(),
Queue
.
class
)).
to
(
delayedExchange
).
with
(
amq
.
getMQName
()).
noargs
()
).
getBeanDefinition
()
);
}
}
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rabbitmq/RabbitMQSender.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.rabbitmq
;
import
com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
com.jeequan.jeepay.components.mq.model.AbstractMQ
;
import
com.jeequan.jeepay.components.mq.vender.IMQSender
;
import
org.springframework.amqp.rabbit.core.RabbitTemplate
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.stereotype.Component
;
/**
* rabbitMQ 消息发送器的实现
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/23 16:52
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
RABBIT_MQ
)
public
class
RabbitMQSender
implements
IMQSender
{
@Autowired
private
RabbitTemplate
rabbitTemplate
;
@Override
public
void
send
(
AbstractMQ
mqModel
)
{
if
(
mqModel
.
getMQType
()
==
MQSendTypeEnum
.
QUEUE
){
rabbitTemplate
.
convertAndSend
(
mqModel
.
getMQName
(),
mqModel
.
toMessage
());
}
else
{
// fanout模式 的 routeKEY 没意义。
this
.
rabbitTemplate
.
convertAndSend
(
RabbitMQConfig
.
FANOUT_EXCHANGE_NAME_PREFIX
+
mqModel
.
getMQName
(),
null
,
mqModel
.
toMessage
());
}
}
@Override
public
void
send
(
AbstractMQ
mqModel
,
int
delay
)
{
if
(
mqModel
.
getMQType
()
==
MQSendTypeEnum
.
QUEUE
){
rabbitTemplate
.
convertAndSend
(
RabbitMQConfig
.
DELAYED_EXCHANGE_NAME
,
mqModel
.
getMQName
(),
mqModel
.
toMessage
(),
messagePostProcessor
->{
messagePostProcessor
.
getMessageProperties
().
setDelay
(
Math
.
toIntExact
(
delay
*
1000
));
return
messagePostProcessor
;
});
}
else
{
// fanout模式 的 routeKEY 没意义。 没有延迟属性
this
.
rabbitTemplate
.
convertAndSend
(
RabbitMQConfig
.
FANOUT_EXCHANGE_NAME_PREFIX
+
mqModel
.
getMQName
(),
null
,
mqModel
.
toMessage
());
}
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rabbitmq/receive/PayOrderMchNotifyRabbitMQReceiver.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.rabbitmq.receive
;
import
com.jeequan.jeepay.components.mq.executor.MqThreadExecutor
;
import
com.jeequan.jeepay.components.mq.model.PayOrderMchNotifyMQ
;
import
com.jeequan.jeepay.components.mq.vender.IMQMsgReceiver
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
/**
* rabbitMQ消息接收器:仅在vender=rabbitMQ时 && 项目实现IMQReceiver接口时 进行实例化
* 业务: 支付订单商户通知
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 17:06
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
RABBIT_MQ
)
@ConditionalOnBean
(
PayOrderMchNotifyMQ
.
IMQReceiver
.
class
)
public
class
PayOrderMchNotifyRabbitMQReceiver
implements
IMQMsgReceiver
{
@Autowired
private
PayOrderMchNotifyMQ
.
IMQReceiver
mqReceiver
;
/** 接收 【 queue 】 类型的消息 **/
@Async
(
MqThreadExecutor
.
EXECUTOR_PAYORDER_MCH_NOTIFY
)
@RabbitListener
(
queues
=
PayOrderMchNotifyMQ
.
MQ_NAME
)
public
void
receiveMsg
(
String
msg
){
mqReceiver
.
receive
(
PayOrderMchNotifyMQ
.
parse
(
msg
));
}
}
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rabbitmq/receive/ResetAppConfigRabbitMQReceiver.java
0 → 100644
View file @
06a5cc9b
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.components.mq.vender.rabbitmq.receive
;
import
com.jeequan.jeepay.components.mq.model.ResetAppConfigMQ
;
import
com.jeequan.jeepay.components.mq.vender.IMQMsgReceiver
;
import
com.jeequan.jeepay.components.mq.constant.MQVenderCS
;
import
com.jeequan.jeepay.components.mq.vender.rabbitmq.RabbitMQConfig
;
import
org.springframework.amqp.core.ExchangeTypes
;
import
org.springframework.amqp.rabbit.annotation.Exchange
;
import
org.springframework.amqp.rabbit.annotation.Queue
;
import
org.springframework.amqp.rabbit.annotation.QueueBinding
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.stereotype.Component
;
/**
* rabbitMQ消息接收器:仅在vender=rabbitMQ时 && 项目实现IMQReceiver接口时 进行实例化
* 业务: 更新系统配置参数
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/22 17:06
*/
@Component
@ConditionalOnProperty
(
name
=
MQVenderCS
.
YML_VENDER_KEY
,
havingValue
=
MQVenderCS
.
RABBIT_MQ
)
@ConditionalOnBean
(
ResetAppConfigMQ
.
IMQReceiver
.
class
)
public
class
ResetAppConfigRabbitMQReceiver
implements
IMQMsgReceiver
{
@Autowired
private
ResetAppConfigMQ
.
IMQReceiver
mqReceiver
;
/** 接收 【 topic 】 类型的消息
*
* 注意:
* RabbitMQ的广播模式(fanout)交换机 --》全部的Queue
* 如果queue包含多个消费者, 【例如,manager和payment的监听器是名称相同的queue下的消费者(Consumers) 】, 两个消费者是工作模式且存在竞争关系, 导致只能一个来消费。
* 解决:
* 每个topic的QUEUE都声明一个FANOUT交换机, 消费者声明一个系统产生的【随机队列】绑定到这个交换机上,然后往交换机发消息,只要绑定到这个交换机上都能收到消息。
* 参考: https://bbs.csdn.net/topics/392509262?list=70088931
*
* **/
@RabbitListener
(
bindings
=
{
@QueueBinding
(
value
=
@Queue
(),
// 注意这里不要定义队列名称,系统会随机产生
exchange
=
@Exchange
(
name
=
RabbitMQConfig
.
FANOUT_EXCHANGE_NAME_PREFIX
+
ResetAppConfigMQ
.
MQ_NAME
,
type
=
ExchangeTypes
.
FANOUT
))}
)
public
void
receiveMsg
(
String
msg
){
mqReceiver
.
receive
(
ResetAppConfigMQ
.
parse
(
msg
));
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/config/MqThreadExecutor.java
View file @
06a5cc9b
...
@@ -30,8 +30,8 @@ import java.util.concurrent.ThreadPoolExecutor;
...
@@ -30,8 +30,8 @@ import java.util.concurrent.ThreadPoolExecutor;
* @site https://www.jeepay.vip
* @site https://www.jeepay.vip
* @date 2021/6/8 17:33
* @date 2021/6/8 17:33
*/
*/
@Configuration
//
@Configuration
@EnableAsync
//
@EnableAsync
public
class
MqThreadExecutor
{
public
class
MqThreadExecutor
{
public
static
final
String
EXECUTOR_PAYORDER_MCH_NOTIFY
=
"mqQueue4PayOrderMchNotifyExecutor"
;
public
static
final
String
EXECUTOR_PAYORDER_MCH_NOTIFY
=
"mqQueue4PayOrderMchNotifyExecutor"
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment