繁体   English   中英

如何使用 spring 引导应用程序从 IBM MQ 读取消息?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM