我正在使用IBM的Websphere MQ队列,我希望连接到其中的多个队列,浏览每个消息,并将它们全部路由到另一个队列,其中不同的应用程序将从中读取。
正在阅读" main"的应用程序queue是用Java编写的,使用Spring Boot和JMS处理来自队列的消息。我发现使用这个应用程序连接到多个队列时遇到了困难,因此想法是创建一个路由器应用程序,它将连接到多个队列,清除" main"排队,并用收集的队列中的消息填充它。
我开始使用"路由器"在Java中的应用程序也决定使用Spring Boot,但不是JMS,并且在概念上仍然遇到了一些困难。
所以我想知道Java是否适合这项工作(或者我错过了一些基本的东西)。我也在考虑使用Perl脚本,但我对这种语言并不是很熟悉(如果有的话),但我不想将其视为一种可行的选择。
所以这两种语言中的哪一种可以证明:
1)可维护
2)有点容易阅读
3)高效
完成我所描述的任务?
两者的利弊都很好。
答案 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
}
}