You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 10:06:04