簡體   English   中英

Apache Camel創建Consumer組件

[英]Apache Camel creating Consumer component

我是Apache Camel的新手。 在hp不間斷中,有一個接收器,它接收事件管理器生成的事件,就像流一樣。 我的目標是建立一個消費者端點,該端點接收傳入的消息並通過Camel處理它。

另一個終點,我只需要在日志中編寫它即可。 從我的研究中我了解到,對於Consumer端點,我需要創建自己的組件,並且配置將像

   from("myComp:receive").to("log:net.javaforge.blog.camel?level=INFO")

這是我的代碼片段,它接收來自事件系統的消息。

 Receive receive = com.tandem.ext.guardian.Receive.getInstance();
    byte[] maxMsg = new byte[500]; // holds largest possible request 
    short errorReturn = 0;
    do { // read messages from $receive until last close 
        try {
            countRead = receive.read(maxMsg, maxMsg.length);
            String receivedMessage=new String(maxMsg, "UTF-8");
            //Here I need to handover receivedMessage to camel 

        } catch (ReceiveNoOpeners ex) {
            moreOpeners = false;
        } catch(Exception e) {
            moreOpeners = false;
        }
    } while (moreOpeners);

有人可以提供一些提示來指導如何使它成為消費者。

10,000英尺的視圖是這樣的:

您需要從實現組件開始。 最簡單的入門方法是擴展org.apache.camel.impl.DefaultComponent 您唯一需要做的就是重寫DefaultComponent::createEndpoint(..) 很明顯,它所做的是創建端點。

因此,您下一步需要實現端點。 為此擴展org.apache.camel.impl.DefaultEndpoint 在最低的DefaultEndpoint::createConsumer(Processor)上重寫以創建自己的使用者。

最后但並非最不重要的一點是,您需要實現使用者。 同樣,最好是擴展org.apache.camel.impl.DefaultConsumer 消費者是您生成代碼的代碼所在。 通過構造函數,您會收到對端點的引用。 使用終結點引用創建一個新的Exchange,將其填充並沿路由發送。 遵循以下原則

Exchange ex = endpoint.createExchange(ExchangePattern.InOnly);
setMyMessageHeaders(ex.getIn(), myMessagemetaData);
setMyMessageBody(ex.getIn(), myMessage);

getAsyncProcessor().process(ex, new AsyncCallback() {
    @Override
    public void done(boolean doneSync) {
        LOG.debug("Mssage was processed " + (doneSync ? "synchronously" : "asynchronously"));
    }
});

我建議您選擇一個簡單的組件( DirectComponent ?)作為示例。

因此,添加我自己的消費者組件可能會對某人有所幫助。

public class MessageConsumer extends DefaultConsumer {

private final MessageEndpoint endpoint;

private boolean moreOpeners = true;

public MessageConsumer(MessageEndpoint endpoint, Processor processor) {
    super(endpoint, processor);
    this.endpoint = endpoint;

}


 @Override
protected void doStart() throws Exception {

    int countRead=0; // number of bytes read 

    do { 
         countRead++;
            String msg = String.valueOf(countRead)+" "+System.currentTimeMillis();
            Exchange ex = endpoint.createExchange(ExchangePattern.InOnly);
            ex.getIn().setBody(msg);
            getAsyncProcessor().process(ex, new AsyncCallback() {
                @Override
                public void done(boolean doneSync) {
                    log.info("Mssage was processed " + (doneSync ? "synchronously" : "asynchronously"));
                }
            });
            // This is an echo server so echo request back to requester    

    } while (moreOpeners);
}

@Override
protected void doStop() throws Exception {
    moreOpeners = false;
    log.debug("Message processor is shutdown");
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM