IBM-MQ 创建 MQ 目标

IBM-MQ Create MQ Destination

使用 spring 启动和 IBM MQ 我需要向 MQ 发送消息。

在我的 Spring 启动应用程序中,我已注册 MQQueueConnectionFactory 如下。

@SpringBootApplication
@EnableJms
public class MainApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(MainApplication.class).web(WebApplicationType.NONE).run(args);
        logger.info("init completed...");
    }

    @Bean
    public MQQueueConnectionFactory queueConnectionFactory() {
        MQQueueConnectionFactory queueConnectionFactory = new MQQueueConnectionFactory();
        try {
            queueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
            queueConnectionFactory.setHostName(host);
            queueConnectionFactory.setChannel(channel);
            queueConnectionFactory.setPort(port);
            queueConnectionFactory.setQueueManager(queueManager);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return queueConnectionFactory;
    }

}

我有如下目标解析器。

 @Component
 public class IBMWebSphereMqDestinationResolver extends 
  DynamicDestinationResolver implements DestinationResolver {

@Override
public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
    Destination destination = super.resolveDestinationName(session, destinationName, pubSubDomain);
    if (destination instanceof MQDestination) {
        MQDestination mqDestination = (MQDestination) destination;
    }
    return destination;
}

}

我正在使用 JmsTemplate 向 MQ 发送消息。

@Service
public class MqServiceImpl implements MqService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private MQDestination destination;

    @Handler
    @Override
    public void sendMessage(String textMessage) {
        logger.info("textMessage {} ", textMessage);
        logger.info("destination {}  ", destination);
        jmsTemplate.convertAndSend(destination, textMessage);
    }

}

然而,当我尝试启动应用程序时,我得到 MQDestination' that could not be found.

service.impl.MqServiceImpl required a bean of type 'com.ibm.mq.jms.MQDestination' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.ibm.mq.jms.MQDestination' in your configuration.

不应该 spring 尝试调用 DestinationResolver 吗?

如果不是,我如何为 IBM MQ 注册目的地?

您正在定义一个 DestinationResolver bean,但注入了一个 MQDestination bean。这就是您收到错误的原因。您应该注入 DestinationResolver 并在 JmsTemplate 上调用 setDestinationResolver

但是 JmsTemplate 会动态解析目的地。这也有效:

public void sendMessage(String textMessage) {
    String destination = "MY.QUEUE";
    jmsTemplate.convertAndSend(destination, textMessage);
}