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);
}
使用 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);
}