连接多个队列并将其消息路由到另一个队列的最有效方法

时间:2016-04-21 14:32:59

标签: java spring perl ibm-mq processing-efficiency

我正在使用IBM的Websphere MQ队列,我希望连接到其中的多个队列,浏览每个消息,并将它们全部路由到另一个队列,其中不同的应用程序将从中读取。

正在阅读" main"的应用程序queue是用Java编写的,使用Spring Boot和JMS处理来自队列的消息。我发现使用这个应用程序连接到多个队列时遇到了困难,因此想法是创建一个路由器应用程序,它将连接到多个队列,清除" main"排队,并用收集的队列中的消息填充它。

我开始使用"路由器"在Java中的应用程序也决定使用Spring Boot,但不是JMS,并且在概念上仍然遇到了一些困难。

所以我想知道Java是否适合这项工作(或者我错过了一些基本的东西)。我也在考虑使用Perl脚本,但我对这种语言并不是很熟悉(如果有的话),但我不想将其视为一种可行的选择。

所以这两种语言中的哪一种可以证明:

1)可维护

2)有点容易阅读

3)高效

完成我所描述的任务?

两者的利弊都很好。

2 个答案:

答案 0 :(得分:1)

Java中最先进的EIP集成框架是Apache Camel。我建议使用它。使用Apache Camel,您可以使用与此类似的形式编写路由器:

public class Routes extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("jms:InputOneQueue1").to("jms:destinationQueue");
        from("jms:InputOneQueue2").to("jms:destinationQueue");
        from("jms:InputOneQueue3").to("jms:destinationQueue");
    }
}

答案 1 :(得分:0)

Apache Camel看起来非常有前景,但是我的Spring Boot应用程序设置方式并没有很好地融合。我最终使用了IBM的MQ库。

我在设置队列后基本上使用这些选项

    putMsgOpts = new MQPutMessageOptions();

    getFirstMsgOpts = new MQGetMessageOptions();
    getFirstMsgOpts.options = MQConstants.MQGMO_BROWSE_FIRST;

    getNextMsgOpts = new MQGetMessageOptions();
    getNextMsgOpts.options = MQConstants.MQGMO_BROWSE_NEXT;

然后使用我的方法

public void transferQueue(MQPropsManager q1) {
    String message = "";
    message = readFromQueue1(q1, getFirstMsgOpts);
    message = verifyMessage(message);   // just a check for empty or null
    writeToQueue2(message);
    q1.decrementMessagesLeftToProcess();  // decrement initial queue depth 

    while (q1.getMessagesLeftToProcess() > 0) {
        message = readFromQueue1(q1, getNextMsgOpts);
        message = verifyMessage(message);
        writeToQueue2(message);
        q1.decrementMessagesLeftToProcess();
    }
    closeQueue(q1);
}

然后是它调用的两个方法:

public String readFromQueue1(MQPropsManager q1,
            MQGetMessageOptions getMsgOpts) {
        MQMessage msg = new MQMessage();
        String message = "";
        try {
            q1.getQueue().get(msg, getMsgOpts);
            message = msg.readStringOfCharLength(msg.getMessageLength());
        } catch (IOException ioe) {
        //  Failed to read string retreived from queue: q1.getQueueName()
        } catch (MQException mqe) {
        //  Failed to retreive message from queue: q1.getQueueName()
        }
        return message;
    }

public void writeToQueue2(String message) {
        MQMessage mqMessage = new MQMessage();
        mqMessage.format = MQConstants.MQFMT_STRING;
        mqMessage.messageType = MQConstants.MQMT_DATAGRAM;

        try {
            mqMessage.writeString(message);
            q2.getQueue().put(mqMessage, putMsgOpts);
        } catch (IOException ioe) {
        //  Failed to write message: message 
        } catch (MQException mqe) {
        //  Failed to put message: message on to the queue2
        }
    }