来自IBM MQ的Spark流数据

时间:2018-07-13 12:16:33

标签: apache-spark apache-kafka spark-streaming ibm-mq

我想从IBM MQ流数据。我已经尝试过在Github上找到的this code

我能够从Queue中流传输数据,但是每次流传输时,它将从队列中获取所有数据。我只想获取推送到队列中的当前数据。我在许多站点上查找,但没有找到正确的解决方案。

在卡夫卡,我们有KafkaStreamUtils之类的东西用于流式传输近实时数据。是否有与IBM MQ中类似的东西,以便它仅流式传输最新数据?

1 个答案:

答案 0 :(得分:1)

您提供的链接中的示例显示,它调用了以下方法来从IBM MQ中接收:

CustomMQReciever(String host , int port, String qm, String channel, String qn)

如果查看CustomMQReciever here,您会发现它只是浏览队列中的消息。这意味着该消息仍将在队列中,下次连接时,您将收到相同的消息:

MQQueueBrowser browser = (MQQueueBrowser) qSession.createBrowser(queue);

如果要从队列中删除消息,则需要调用一个确实从队列中使用消息的方法,而不是从队列中浏览消息。以下是对CustomMQReciever.java所做的更改示例,该更改应完成您想要的操作:


initConnection()下,将以上代码更改为以下代码,以使其从队列中删除消息:

MQMessageConsumer consumer = (MQMessageConsumer) qSession.createConsumer(queue);

摆脱:

enumeration= browser.getEnumeration();

receive()下更改以下内容:

while (!isStopped() && enumeration.hasMoreElements() )
    {

    receivedMessage= (JMSMessage) enumeration.nextElement();
    String userInput = convertStreamToString(receivedMessage);
    //System.out.println("Received data :'" + userInput + "'");
    store(userInput);
    }

对于这样的事情:

while (!isStopped() && (receivedMessage = consumer.receiveNoWait()) != null))
    {
    String userInput = convertStreamToString(receivedMessage);
    //System.out.println("Received data :'" + userInput + "'");
    store(userInput);
    }