💼 银行系统 | IBM MQ 接收报文



IBM MQ 是 IBM 提供的一种 企业级消息中间件,广泛用于金融、银行等对稳定性和安全性要求高的系统中。它支持 JMS(Java Message Service)标准,可以与 Java 程序很好地集成。

IBM MQ 层级

名称 描述
Queue Manager 队列管理器,MQ 的核心组件
Queue 队列,消息的存储通道
Channel 通道,客户端与队列管理器通信的方式
Listener 监听器,监听某个端口接收连接请求
Message 消息内容

以下展示 Spring JMS 连接 MQ 客户端

maven 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<!-- Spring Boot Starter JMS -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<!-- IBM MQ All-in-one Client -->
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.3.0.0</version> <!-- 具体版本视情况而定 -->
</dependency>
</dependencies>

application.yml 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
jms:
pub-sub-domain: false # 使用Queue(点对点)模式,Topic为true
listener:
auto-startup: true
acknowledge-mode: auto

ibm:
mq:
queue-manager: QM1
channel: DEV.APP.SVRCONN
conn-name: 127.0.0.1(1414)
queue: QUEUE1
username: app
password: password

MQ 配置类

设置 MQ 配置,队列、通道、用户名、密码等连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Configuration
public class MqConfig {

@Value("${ibm.mq.queue-manager}")
private String queueManager;

@Value("${ibm.mq.channel}")
private String channel;

@Value("${ibm.mq.conn-name}")
private String connName;

@Value("${ibm.mq.username}")
private String username;

@Value("${ibm.mq.password}")
private String password;

@Bean
public ConnectionFactory connectionFactory() throws JMSException {
MQConnectionFactory factory = new MQConnectionFactory();
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
factory.setQueueManager(queueManager);
factory.setChannel(channel);
factory.setConnectionNameList(connName);
factory.setAppName("SpringBootMQApp");

factory.setStringProperty(WMQConstants.USERID, username);
factory.setStringProperty(WMQConstants.PASSWORD, password);
factory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);

return factory;
}

// 创建连接模版
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
return new JmsTemplate(connectionFactory);
}
}

发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
public class MqSender {

@Value("${ibm.mq.queue}")
private String queueName;

private final JmsTemplate jmsTemplate;

public MqSender(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}

public void send(String msg) {
jmsTemplate.convertAndSend(queueName, msg);
System.out.println("已发送消息: " + msg);
}
}

在其他地方调用发送器,设定调用 /send 接口,参数作为发送的消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class TestController {

private final MqSender mqSender;

public TestController(MqSender mqSender) {
this.mqSender = mqSender;
}

@GetMapping("/send")
public String send(@RequestParam String msg) {
mqSender.send(msg);
return "发送成功";
}
}

接收消息

1
2
3
4
5
6
7
8
@Component
public class MqListener {

@JmsListener(destination = "${ibm.mq.queue}")
public void receive(String msg) {
System.out.println("接收到消息: " + msg);
}
}