![](/img/trans.png)
[英]How to receive messages from IBM MQ JMS using spring boot continuously?
[英]how can i read messages from IBM MQ using spring boot application?
我已经使用应用程序属性配置了与 IBM MQ 的连接。 如下,
ibm.mq.conn-name=localhost(1415)
ibm.mq.queue-manager=QMGR
ibm.mq.channel=QMGR.SVR.CON.C
ibm.mq.user=xxxxx
ibm.mq.password=xxxxx
我有 class 注释 @service 其方法如下从队列中读取消息,
@Service
public class JMSService {
@Inject
private JmsTemplate queueTemplate;
public JmsMessageBean readMessage(String responseQueueName, Logger logger) throws JMSException, Exception {
JmsMessageBean bean = new JmsMessageBean();
MQQueue queue = new MQQueue(responseQueueName);
queue.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
queueTemplate.setReceiveTimeout(JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
Message message = queueTemplate.receive(queue);
if(message!=null){
String jmsCorrelationID = hexStringToByteArrayToString(message.getJMSCorrelationID());
bean.setJmsCorrelationID(jmsCorrelationID);
bean.setMessage(message.getBody(Object.class));
bean.setJmsMessageID(message.getJMSMessageID());
}
return bean;
}
}
我以 50 毫秒的固定速率运行调度程序并在调度程序中调用上述方法,
@Component
public class QueueConnectionService{
@Scheduled(fixedRate = 50)
public void connectQueueManager() {
JmsMessageBean bean = null;
int umacIndex;
String body = "";
try {
bean = jmsService.readMessage(env.getProperty("inwardQueueName"), inwardqueue);
if (bean != null && bean.getMessage() != null) {
String messagetxt = "";
if (bean.getMessage().getClass().getSimpleName().equals("String")) {
messagetxt = (String) bean.getMessage();
} else {
byte[] messagebytes = (byte[]) bean.getMessage();
messagetxt = new String(messagebytes);
}
umacIndex = messagetxt.indexOf("{UMAC:");
if (umacIndex > 0)
message = messagetxt.substring(0, umacIndex);
else
message = messagetxt;
//sending this message to further processing
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是有效的,但我确信这不是从队列中读取消息的正确有效方式,并且在可能有大量消息时可能是错误的实现。 并且 spring TaskSchedulerPool 将因为有其他数据迁移调度程序而过载。 请验证并建议我从 IBM MQ 读取消息的有效方法。 谢谢你。
正如@JoshMc 建议的那样,您应该使用JmsListener
。
Spring 有很好的JMS 入门指南。 对您来说,它看起来像这样(您可以在提到的myFactory
指南中看到 myFactory 的定义):
package hello;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class Receiver {
@JmsListener(destination = "${inwardQueueName}", containerFactory = "myFactory")
public void receiveMessage(javax.jms.Message message) throws javax.jms.JMSException {
String messagetxt = "";
if (message instanceof javax.jms.TextMessage) {
messagetxt = message.getBody(String.class);
}
...
}
}
@SpringBootApplication
@EnableJms
@EnableScheduling
public class MyApplication extends SpringBootServletInitializer implements SchedulingConfigurer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class);
}
@Bean
public JmsListenerContainerFactory<?> conFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the
// message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
return factory;
}
public static void main(String[] args) {
SpringApplication.run(OmnipApplication.class, args);
}
}
上面是应用程序配置 class 下面是监听器代码;
@Component
public class MessageReceiverService {
@Autowired
MessageValidationService messageValidationService;
@JmsListener(destination="${inwardQueueName}", containerFactory="conFactory")
public void receiveMessage(javax.jms.Message message) throws javax.jms.JMSException{
String messagetxt = "";
JmsMessageBean bean = new JmsMessageBean();
if(message!=null){
bean.setMessage(message.getBody(Object.class));
bean.setJmsMessageID(message.getJMSMessageID());
}
if (bean.getMessage().getClass().getSimpleName().equals("String")) {
messagetxt = (String) bean.getMessage();
} else {
byte[] messagebytes = (byte[]) bean.getMessage();
messagetxt = new String(messagebytes);
}
messagetxt = messagetxt.split(Constants.MESSAGE_END_CHAR)[0].concat(Constants.MESSAGE_END_CHAR);
messageValidationService.messageIdentifier(messagetxt);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.