如何通过Spring Boot Rest API接收固定长度消息并原封不动发送至IBM MQ
Spring Boot 透传固定长度消息到IBM MQ实现示例
1 依赖引入(Maven)
<dependencies> <!-- Spring Web 依赖,用于暴露Rest API --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- IBM MQ Spring Boot Starter 依赖 --> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>mq-jms-spring-boot-starter</artifactId> <version>2.7.15</version> <!-- 可根据Spring Boot版本调整对应兼容版本 --> </dependency> </dependencies>
2 配置文件(application.yml)
server: port: 8080 # IBM MQ 连接配置 ibm: mq: queue-manager: QM1 # 替换为实际队列管理器名称 channel: DEV.ADMIN.SVRCONN # 替换为实际通道名称 conn-name: 192.168.1.100(1414) # 替换为实际MQ地址和端口 user: admin # 替换为实际MQ用户名 password: passw0rd # 替换为实际MQ密码 # 自定义业务参数 custom: mq: target-queue: TARGET.MAINFRAME.QUEUE # 替换为实际对接大型机的队列名 fixed-message-length: 64 # 替换为实际固定长度消息的标准长度
3 MQ发送配置类
为了避免转码篡改消息内容,直接配置字节流透传的JmsTemplate:
import com.ibm.mq.jms.MQQueue; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.core.JmsTemplate; import jakarta.jms.ConnectionFactory; import jakarta.jms.JMSException; @Configuration public class MqConfig { @Value("${custom.mq.target-queue}") private String targetQueue; @Bean public JmsTemplate bytesJmsTemplate(ConnectionFactory connectionFactory) throws JMSException { JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory); jmsTemplate.setDefaultDestination(new MQQueue(targetQueue)); // 关闭自动消息转换,全程透传字节 jmsTemplate.setMessageConverter(null); return jmsTemplate; } }
4 Rest API接口实现
直接读取原始请求体,校验规则通过后原封不动写入MQ:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.jms.core.JmsTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/message") public class MessageTransmitController { @Autowired private JmsTemplate bytesJmsTemplate; @Value("${custom.mq.fixed-message-length}") private Integer fixedLength; @PostMapping(value = "/transmit", consumes = "text/plain") public ResponseEntity<String> transmitMessage(@RequestBody byte[] messageBytes) { // 1. 固定长度校验 if (messageBytes == null || messageBytes.length != fixedLength) { return ResponseEntity.badRequest() .body(String.format("消息长度非法,要求长度:%d,实际长度:%d", fixedLength, messageBytes == null ? 0 : messageBytes.length)); } // 2. 可选:校验记录结束分隔符,按业务要求调整规则即可 // 示例:如果要求末尾2位是分隔符"00",可添加以下校验 // String suffix = new String(messageBytes, messageBytes.length-2, 2); // if (!"00".equals(suffix)) { // return ResponseEntity.badRequest().body("消息缺少合法的结束分隔符"); // } // 3. 原封不动写入IBM MQ bytesJmsTemplate.send(session -> { var bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes(messageBytes); return bytesMessage; }); return ResponseEntity.status(HttpStatus.CREATED).body("消息已成功写入MQ"); } }
注意事项
- 全程使用字节流传输,不会对消息内容做任何修改,完全满足透传要求
- 不要在当前服务做任何编码转换操作,避免篡改固定长度字段的偏移量,转码逻辑统一放到后端IBM大型机侧处理
- 固定长度、结束分隔符规则可直接调整校验逻辑适配业务需求
内容的提问来源于stack exchange,提问作者Balanjaneyulu P
相关产品推荐
相关产品推荐

