Apache Camel框架之JMS路由
繼上次Camel如何在做項目集成類型的項目中用于從FTP取文件和傳文件之后,我們在系統集成中經常遇到的另一個應用就是將數據通過JMS傳到消息中間件的queue里,或者從消息中間件的queue里取消息.
本文簡單的介紹和示例一個用Camel實現這樣的需求:監聽某一個文件夾是否有文件,取到文件后發送到另外一個系統監聽的queue.
1,因為要用JMS,這里介紹一個open source的activeMQ,可以從http://activemq.apache.org/download.html 下載,下載后解壓,bin目錄有一個activemq.bat文件,在命令行里運行activemq 啟動activeMQ,如果能從從瀏覽器里訪問 http://localhost:8161/admin/則activeMQ成功啟動了.
2,在Camel里實現上圖所示的路由:JAVA項目里需要將activeMQ的jar包配置到classpath下,Java代碼如下:
private static String user = ActiveMQConnection.DEFAULT_USER;
private static String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String args[]) throws Exception {
CamelContext context = new DefaultCamelContext();
ConnectionFactory connectionFactory =
new ActiveMQConnectionFactory(user, password, url);
context.addComponent("jms",
JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
System.out.println(url + " " + user + password);
context.addRoutes(new RouteBuilder() {
public void configure() {
from("file:d:/temp/inbox").to(
"jms:queue:TOOL.DEFAULT");
}
});
context.start();
boolean loop = true;
while (loop) {
Thread.sleep(25000);
}
context.stop();
}</pre>
Camel會在路由的時候將文件的內容以binary message發到activeMQ的名為'TOOL.DEFAULT'的queue .
用下面的代碼可以從Camel發送的queue里取到消息.
private static String user = ActiveMQConnection.DEFAULT_USER;
private static String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static boolean transacted;
private static int ackMode = Session.AUTO_ACKNOWLEDGE;
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(transacted, ackMode);
Destination destination = session.createQueue("TOOL.DEFAULT");
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive(1000);
System.out.println("Received: " + message);
BytesMessage bytesMsg = (BytesMessage) message;
byte[] bytes = new byte[(int) bytesMsg.getBodyLength()];
bytesMsg.readBytes(bytes);
System.out.println("contents: " + new String(bytes));
} </pre>
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!