[英]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.