2016-04-21 57 views
0

我正在與IBM的Websphere MQ隊列,我想連接到其中的多個,瀏覽每個消息,並將它們全部路由到另一個隊列一個不同的應用程序將讀取。最有效的方法來連接到多個隊列,並將他們的消息路由到另一個隊列

從「main」隊列讀取的應用程序是用Java編寫的,並使用Spring Boot和JMS處理隊列中的消息。我發現使用此應用程序連接到多個隊列存在困難,因此我們的想法是創建一個路由器應用程序,該應用程序將連接到多個隊列,清除「主」隊列,並使用收集的隊列中的消息填充路由器應用程序。

我開始使用Java的「路由器」應用程序,並決定使用Spring Boot,但不使用JMS,並且在概念上仍然發現了一些困難。

所以我想知道如果Java是適合這項工作的(或者我錯過了一些基本的東西)。我也在琢磨一個Perl腳本,但我並不十分(如果有的話)經歷過這種語言,但我不想將其視爲可行的選擇。

所以這兩個語言可能被證明是:

1)維護的

2)有點容易完成的任務,如閱讀

3)高效

我所描述的一個?

兩者的優點和缺點都不錯。

回答

0

Apache的駱駝看起來非常有前途的,但與我怎麼了我的春天啓動的應用程序設置以及齧合。我最終使用了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 
     } 
    } 
1

Java中最先進的EIP集成框架是Apache Camel。我建議使用它。隨着Apache的駱駝,你可以寫在形式上類似於此路由器:

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"); 
    } 
} 
+0

你知道這有直接的實現使用Spring?因爲每個隊列定義不會太冗長? –

+0

你可以使用Apache的駱駝春天。網上有很容易整合的例子。你可以使用我的一個項目作爲起點https://github.com/gmaslowski/dam-camel/tree/master/dam-camel-tw – gmaslowski

+0

非常好,謝謝。我會檢查一下,看看這是否是我想要走向的方向。 –

相關問題