ããã¯ããã¹ãã§ã®Scalaã®äœ¿çšã«é¢ãã3çªç®ã®èšäºã§ãã ä»æ¥ã¯ãApache Camelã䜿çšããŠãã¹ãã¹ã¿ããšæ
å ±ã·ã¹ãã ã³ã³ããŒãã³ããäœæããäŸã«ã€ããŠèª¬æããŸãã
å€ãã®å Žåãçµ±åãã¹ãã®ããã«ã·ã¹ãã ã®ä»»æã®éšåã®åäœããšãã¥ã¬ãŒããããã¹ã¿ããäœæããããŸãã¯åçŽãªçµ±åã³ã³ããŒãã³ããäœæããå¿ èŠããããŸãã å¿ èŠãªåçãè¿ãWebãµãŒãã¹ãããŒã¿ããŒã¹ã«å ¥åãããã¹ãããã¥ãŒããã¡ãã»ãŒãžãèªã¿åããåŠççµæãè¿ãã¢ããªã±ãŒã·ã§ã³ããã¡ã€ã«ãžã§ãã¬ãŒã¿ãŒãããã³ãã®ä»ã®ã³ã³ããŒãã³ãã䜿çšã§ããŸãã
çµ±åã®1åéãã®æ€èšŒã«ã¯ãåçŽãªJavaãŸãã¯Scalaã¢ããªã±ãŒã·ã§ã³ãApache JMeterã¹ã¯ãªããããŸãã¯SoapUIã䜿çšããŸãã ããããåžžã«æ©èœãããªã¯ãšã¹ãã«å¿çãããã¹ã¿ãŒããã®ã¢ã¯ã·ã§ã³ãå¿
èŠãšããªãã·ã¹ãã ãå¿
èŠã§ã-ç§ã¯å§ããŠå¿ããŠããŸããã ãã®åé¡ã解決ããããã«ãApache Camelãã¬ãŒã ã¯ãŒã¯ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
5ã€ã®äŸãèããŠã¿ãŸãããã
- ãããšã³ã³ãŒãã£ã³ã°ã§ãã¡ã€ã«ãèªã¿åããå¥ã®ãšã³ã³ãŒãã£ã³ã°ã§æžã蟌ã¿ã
- ããŒã¿ãŠã§ã¢ããŠã¹ã§ã®ã¹ã±ãžã¥ãŒã«ãããWebãµãŒãã¹èŠæ±ãšã¡ãã»ãŒãžã®ä¿åã
- GETèŠæ±ãã©ã¡ãŒã¿ãŒã«å¿ããŠã¡ãã»ãŒãžãè¿ãWebãµãŒãã¹ã®å®è£ ã
- ãã¥ãŒããã¡ãã»ãŒãžãèªã¿åããããŒã¿ããŒã¹ã«ã¡ãã»ãŒãžãéä¿¡ããŸãã
- ãã¡ã€ã«ã®å 容ã«ããã«ãŒãã£ã³ã°ã®äŸã
åé¡ã解決ããããã«äœ¿çšãããããŒã«ãç°¡åã«èª¬æããŠãã ããã Apacheãã£ã¡ã«ïŒ http://camel.apache.org/ïŒ-æ å ±ã·ã¹ãã ã®ãµãã·ã¹ãã ã§ããåã ã®ã¢ããªã±ãŒã·ã§ã³éã®ã¡ãã»ãŒãžäº€æãå®è£ ããããã«èšèšãããJavaãã¬ãŒã ã¯ãŒã¯ã ãšã³ã¿ãŒãã©ã€ãºçµ±åãã¿ãŒã³ïŒEIPïŒããã«ãŠã§ã¢éçºã¢ãããŒããå®è£ ããŸãã ãã¡ã€ã«ãããŒã¿ããŒã¹ããã¥ãŒãããŒãžã£ãŒãWebãµãŒãã¹ãããã³ãã®ä»ã®ã³ã³ããŒãã³ããæäœã§ããŸã- ã³ã³ããŒãã³ããããžã§ã¯ãããŒãžã«ã¯240以äžããããŸãã Camelã¢ããªã±ãŒã·ã§ã³ã¯ããããããšã³ããã€ã³ãããšã³ããã€ã³ããããã³ãããã®éã§ã¡ãã»ãŒãžãå€æããã³ã«ãŒãã£ã³ã°ããããã®ã«ãŒã«ãèšè¿°ããŸãã
Camelã³ã³ããŒãã³ãã¯ãšã³ããã€ã³ããå®è£ ããŸãã ããã¯ãã¡ãã»ãŒãžã®ãããã¥ãŒãµãŒïŒProducerïŒãŸãã¯ã³ã³ã·ã¥ãŒãïŒConsumerïŒã§ãã äžéšã®ã³ã³ããŒãã³ãã¯ãäž¡æ¹ã®ã¿ã€ãã®ãã€ã³ããå®è£ ã§ããŸããããšãã°ããã¡ã€ã«ããã¡ãã»ãŒãžãåä¿¡ããŠââèšé²ã§ããŸãã äžéšã®ã³ã³ããŒãã³ãã¯ãã¿ã€ããŒãªã©ã®ã¡ãã»ãŒãžãããã¥ãŒãµãŒã®ã¿ããŸãã¯ãã®ã³ã°ãªã©ã®ã³ã³ã·ã¥ãŒããŒã®ã¿ãå®è£ ããŸãã
ã¢ããªã±ãŒã·ã§ã³äžã«ãã¡ãã»ãŒãžæ¬æãšãã®ããããŒãæäœãããŸãã Camelã䜿çšããæé ã¯æ¬¡ã®ãšããã§ãã
- ã¡ãã»ãŒãžã®ãœãŒã¹ïŒãã¡ã€ã«ããã¥ãŒãããŒã¿ããŒã¹ããµãŒãã¹ãã¿ã€ããŒãªã©ïŒã説æããŸãã
- ããŒã¿ãšåœ¢åŒãå€æããããã®èŠåã説æããŸãã
- ã¡ãã»ãŒãžã®åä¿¡è ïŒãã¡ã€ã«ããã¥ãŒãããŒã¿ããŒã¹ããµãŒãã¹ãã³ã³ãœãŒã«ãžã®åºåãªã©ïŒããã³ã«ãŒãã£ã³ã°ããžãã¯ãèšè¿°ããŸãã
- ãœãŒã¹ããªãã¹ã³ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã¡ãã»ãŒãžã衚瀺ããããã¡ãã»ãŒãžãå€æããŠåä¿¡è ã«ã«ãŒãã£ã³ã°ããŸãã
ã«ãŒãã£ã³ã°ããã³ã¡ãã»ãŒãžå€æã«ãŒã«ãèšè¿°ããããã«ãããŸããŸãªèšèªã䜿çšãããŸãã ç§ãã¡èªèº«ã¯ãScala DSL scala-dsl-eipãéžæããŸããããã®èšèªã¯ãã³ã³ããŒãã³ããœãããŠã§ã¢ã®ç°¡åãã€è¿ éãªäœæã«é©ããŠããããã§ãã Scalaã§ã¯ã SBTãããžã§ã¯ããã«ãã·ã¹ãã ã䜿çšããŸãã
ãã¡ã€ã«ããã¡ãã»ãŒãžãèªã¿åããhttp postãªã¯ãšã¹ããéä¿¡ããçŽ æŽãããäŸããããŸãã å°ãå€ãã§ããã圹ã«ç«ã€ãããããŸããã
» Http://www.lightbend.com/activator/template/camel-http
» Https://github.com/hilton/activator-camel-http#master
æºåäœæ¥
SBTã«åºã¥ããŠã¢ã€ãã¢ã®ãããããžã§ã¯ããäœæããŸãã ãããžã§ã¯ãäœæã®äŸãèŠãããšãã§ããŸã-Scalatestã䜿çšããæ
å ±ã·ã¹ãã ã®ç£èŠãšçµ±åãã¹ãã®å®è£
ã ããŒã1
build.sbtãã¡ã€ã«ã«ãèšå®ãæžã蟌ã¿ãŸã
name := "camel-scaladsl" version := "1.0" scalaVersion := "2.11.8" val camelVersion = "2.17.1" libraryDependencies ++= Seq( // Camel "org.apache.camel" % "camel-core" % camelVersion, "org.apache.camel" % "camel-scala" % camelVersion, // Camel "org.apache.camel" % "camel-quartz" % camelVersion, "org.apache.camel" % "camel-spring-redis" % camelVersion, "org.apache.camel" % "camel-http" % camelVersion, "org.apache.camel" % "camel-jetty" % camelVersion, "org.apache.camel" % "camel-jms" % camelVersion, "org.apache.camel" % "camel-jdbc" % camelVersion, // "ch.qos.logback" % "logback-classic" % "1.1.2", "org.slf4j" % "slf4j-api" % "1.7.7", // xml "org.scala-lang.modules" % "scala-xml_2.11" % "1.0.5", // H2 "com.h2database" % "h2" % "1.4.192", "org.apache.commons" % "commons-dbcp2" % "2.1.1", // activemq "org.apache.activemq" % "activemq-client" % "5.13.3" )
src / main / resourcesãã¡ã€ã«ã«logback.xmlãã¡ã€ã«ãè¿œå ããŸããlogback.xmlãã¡ã€ã«ã«ã¯ããã°ã¬ãã«ãšã¡ãã»ãŒãžåœ¢åŒãèšå®ãããŠããŸãã
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
ãã以å€ã®å Žåãããã©ã«ãã®ã¬ãã«ã¯DEBUGã§ã-衚瀺ãããæ å ±ãå€ãããŸãã
äŸ1
ãããšã³ã³ãŒãã£ã³ã°ã§ãã¡ã€ã«ãèªã¿åããå¥ã®ãšã³ã³ãŒãã£ã³ã°ã§æžã蟌ã¿ãŸãã ããã¯ãcamel-coreããã±ãŒãžã®ã³ã³ããŒãã³ãhttp://camel.apache.org/file2.htmlã䜿çšããåçŽãªã¢ããªã±ãŒã·ã§ã³ã§ãã FromFileToFileAppã¢ããªã±ãŒã·ã§ã³ãèµ·åãããªããžã§ã¯ããšãã«ãŒããèšè¿°ããFromFileToFileRouteã¯ã©ã¹ã§æ§æãããŸãã ã«ãŒããæã€ã¯ã©ã¹ã¯ãå¥ã®ãã¡ã€ã«ã«ç§»åã§ããŸãã
src / main / scala / FromFileToFileApp.scalaãã¡ã€ã«ã®å 容
import org.apache.camel.CamelContext import org.apache.camel.main.Main import org.apache.camel.scala.dsl.builder.{ScalaRouteBuilder, RouteBuilderSupport} object FromFileToFileApp extends App with RouteBuilderSupport { // Camel Main val mainApp = new Main val context = mainApp.getOrCreateCamelContext // mainApp.addRouteBuilder(new FromFileToFileRoute(context)) // mainApp.run } class FromFileToFileRoute(context: CamelContext) extends ScalaRouteBuilder(context) { // "inbox" """file:inbox?charset=utf-8""" ==> { // "outbox" to ("file:outbox?charset=Windows-1251") } }
FromFileToFileRouteã¯ã©ã¹ã§ã¯ãã¡ãã»ãŒãžã®å 容ã«å€æã¯è¡ããããã«ãŒãã£ã³ã°ã¯è¡ãããŸããã ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããã©ã«ããŒãinboxãããoutboxãããããžã§ã¯ããã©ã«ããŒã«èªåçã«äœæãããŸãã ãinboxããã£ã¬ã¯ããªã«å°éãããšããã¡ã€ã«ã¯èªåçã«èªã¿åãããŸã-ãã©ã«ãããæ¶ããŸãã 次ã«ããéä¿¡ãã¬ã€ããã£ã¬ã¯ããªã«å¥ã®ãšã³ã³ãŒãã£ã³ã°ã§è¡šç€ºãããŸãã ãã®å Žåãamelã«ãã£ãŠèªã¿åãããã¡ãã»ãŒãžã¯ãå¥ã®ãµããã©ã«ããŒã®ãåä¿¡ããã¯ã¹ããã©ã«ããŒã«ä¿åãããŸãã
äŸ2
ããŒã¿ãŠã§ã¢ããŠã¹ã§ã®ã¹ã±ãžã¥ãŒã«ãããWebãµãŒãã¹ãªã¯ãšã¹ããšã¡ãã»ãŒãžã¹ãã¬ãŒãžã ãã®äŸã§ã¯ãã¿ã€ããŒã«ãã£ãŠçºæ¿ã¬ãŒãã®ããŒã¿ãåéããRedisã«éä¿¡ããŸãã ã¡ãã»ãŒãžã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããïŒæ¬æãšããããŒãæžã蟌ãïŒããã«ãã¡ãœãããprocessãããããŸãã Redisã®å Žåãå€ã¯ããããŒã®ãã¢ãCamelRedis.Keyã/ãCamelRedis.Valueãã䜿çšããŠéä¿¡ãããŸãã HTTP GETãªã¯ãšã¹ããè¿ãã¡ãã»ãŒãžã®æ¬æãæœåºãããCamelRedis.Valueãã®ã¿ã€ãã«ã«ããå¿
èŠããããŸãã
ããŒã¯ããœãŒãã«é©ããäžæã®ããŒïŒããªç§åäœã®çŸåšã®æéïŒã«ãã£ãŠçæãããŸãã
import org.apache.camel.{Exchange, CamelContext} import org.apache.camel.main.Main import org.apache.camel.scala.dsl.builder.{ScalaRouteBuilder, RouteBuilderSupport} import org.springframework.data.redis.serializer.StringRedisSerializer object FromHTTPToRedisApp extends App with RouteBuilderSupport{ val mainApp = new Main // stringSerializer Redis mainApp.bind("stringSerializer",new StringRedisSerializer) val context = mainApp.getOrCreateCamelContext mainApp.addRouteBuilder(new FromHTTPToRedisRoute(context)) mainApp.run } class FromHTTPToRedisRoute (context: CamelContext) extends ScalaRouteBuilder(context) { // , HTTP """quartz:timerName?cron=0+0/1+*+*+*+?""" ==> { // log(" ") // to("http://www.google.com/finance/info?q=CURRENCY%3aUSDRUB") // - edis, process((exchange: Exchange) => { exchange.getOut.setHeader("CamelRedis.Key",System.currentTimeMillis()) exchange.getOut.setHeader("CamelRedis.Value",exchange.getIn.getBody(classOf[String])) }) // // (Body: [Body is null]]) to("log:FromHTTPToRedisApp") // Redis // #stringSerializer - to("""spring-redis://172.16.7.58:6379?serializer=#stringSerializer""") } }
ãªã¢ãŒããã¹ãããRedisã«æžã蟌ãã«ã¯ãèš±å¯ãå¿ èŠãªå ŽåããããŸãã ããšãã°ãå®è¡äžã®ãã¹ãäžã®Redisã³ã³ãœãŒã«ã§ã次ã®ã³ãã³ããå®è¡ããŸã
CONFIG SET protected-mode no
Redisã«ãšã³ããªã衚瀺ããäŸãå³ã«ç€ºããŸãã
äŸ3
GETèŠæ±ãã©ã¡ãŒã¿ãŒã«å¿ããŠã¡ãã»ãŒãžãè¿ãWebãµãŒãã¹ã®å®è£
ã ãã®äŸã§ã¯ãJettyã³ã³ããŒãã³ãã䜿çšããŠããã©ã¡ãŒã¿ãŒä»ãã®GETèŠæ±ãåä¿¡ãããã©ã¡ãŒã¿ãŒå€ãŸãã¯ãšã©ãŒä»ãã®xmlãè¿ãåçŽãªHTTPãµãŒããŒãå®è£
ããŸãã
object JettyApp extends App with RouteBuilderSupport{ val mainApp = new Main val context = mainApp.getOrCreateCamelContext mainApp.addRouteBuilder(new JettyRoute(context)) mainApp.run } class JettyRoute(context: CamelContext) extends ScalaRouteBuilder(context) { // """jetty:http://0.0.0.0:1234/myapp/myservice""" ==> { delay(2 seconds) process((exchange: Exchange) => { // uuid get val uuidParam = exchange.getIn.getHeader("uuid") // val pattern = """[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}""".r // // , uuid def responseText = uuidParam match { case null => "Uuid parameter not found" case pattern() => s"$uuidParam" case _ => s"Uuid parameter format is not valid" } // xml exchange.getOut().setHeader(Exchange.CONTENT_TYPE,"text/xml; charset=utf-8") // xml . exchange.getOut().setBody(<uuid>{responseText}</uuid>) // s"<uuid>$responseText</uuid>" }) } }
確èªã®ãªã¯ãšã¹ãã®äŸïŒ
" HttpïŒ// localhostïŒ1234 / myapp / myserviceïŒUuid = 2a577d52-e5a1-4da5-96e5-bdba1f68e6f1 ;
" HttpïŒ// localhostïŒ1234 / myapp / myserviceïŒUuid = 123 ;
" HttpïŒ// localhostïŒ1234 / myapp / myservice ;
" HttpïŒ// localhostïŒ1234 / myapp / myserviceïŒGuid = 2a577d52-e5a1-4da5-96e5-bdba1f68e6f ã
ãµãŒãã¹å¿çã®äŸãå³ã«ç€ºããŸãã
äŸ4
ãã¥ãŒããã¡ãã»ãŒãžãèªã¿åããããŒã¿ããŒã¹ã«æžã蟌ã¿ãŸãã å¥ã®äŸãšããŠããã¥ãŒãšããŒã¿ããŒã¹ã®æäœã匷調ãããŸããã ãããã®ã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºããã«ã¯ãå¥ã®ã¢ãããŒããå¿
èŠã§ãã åã®äŸã§æ§æããšã³ããã€ã³ãè¡ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠå®è¡ãããå Žåãããã§äºåã«ãªããžã§ã¯ããäœæããããã«åºã¥ããŠã³ã³ããŒãã³ããäœæããããã«äœ¿çšããå¿
èŠããããŸãã
ããŒã¿ããŒã¹ã®å Žåãorg.apache.commons.dbcp2.BasicDataSourceã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæ¥ç¶ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã ãã¥ãŒã«å¯ŸããŠãjavax.jms.ConnectionFactoryã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãããã®ã¯ã©ã¹ã«ã¯ãæ¥ç¶ãã©ã¡ãŒã¿ãŒãä¿åãããŸãã 次ã«ããšã³ããã€ã³ãã®ãããã®ã³ã³ããŒãã³ãã®ååãäœæãããURIã§äœ¿çšãããŸãã éãã¯ããã£ã¡ã«jdbcã³ã³ããŒãã³ããããŒã¿ããŒã¹ã«äœ¿çšããããã£ã¡ã«jmsã«åºã¥ãæ°ããã³ã³ããŒãã³ãããã¥ãŒã«äœæãããããšã§ãã
äŸã§ã¬ã³ãŒããæ¿å ¥ãããããŒãã«ã¯ã次ã®ã¯ãšãªã«ãã£ãŠäœæãããŸãã
CREATE TABLE MESSAGETABLE( ID UUID NOT NULL PRIMARY KEY, DATETIME TIMESTAMP, BODY VARCHAR(65536)
次ã®ã³ãŒãã¯ããã¥ãŒããã¡ãã»ãŒãžãååŸããããŒã¿ããŒã¹ã§ãªã¯ãšã¹ããå®è¡ããŠãäžæã®èå¥åãæéãããã³ã¡ãã»ãŒãžæ¬æãè¿œå ããŸãã
import java.text.SimpleDateFormat import java.util.{UUID, Date} import org.apache.camel.component.jms.JmsComponent import org.apache.camel.main.Main import org.apache.camel.scala.dsl.builder.{RouteBuilderSupport, ScalaRouteBuilder} import org.apache.camel.{CamelContext, Exchange} // BasicDataSource import org.apache.commons.dbcp2.BasicDataSource // - ConnectionFactory import org.apache.activemq.ActiveMQConnectionFactory object FromMQToDBApp extends App with RouteBuilderSupport { val mainApp = new Main // val ds = new BasicDataSource ds.setDriverClassName("org.h2.Driver") ds.setUrl("jdbc:h2:./h2db") // endpoint , "h2db" mainApp.bind("h2db",ds) // MQConnectionFactory val cf = new ActiveMQConnectionFactory("tcp://192.168.3.38:61616") // mainApp.bind("amq-jms", JmsComponent.jmsComponentAutoAcknowledge(cf)) val context = mainApp.getOrCreateCamelContext mainApp.addRouteBuilder(new FromMQToDBAppRoute(context)) mainApp.run } // class FromMQToDBAppRoute(context: CamelContext) extends ScalaRouteBuilder(context) { // . , - "amq-jms", // """amq-jms:queue:TESTQ""" ==> { process((exchange: Exchange) => { // uuid, / val uuid = UUID.randomUUID val time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) // val messageBody = exchange.getIn.getBody(classOf[String]) // exchange.getOut.setBody(s"INSERT INTO PUBLIC.MESSAGETABLE (ID, DATETIME, BODY) VALUES('$uuid', '$time', '$messageBody')") }) // // jdbc, DataSource to("jdbc:h2db") } }
ã¡ãã»ãŒãžããŒã¿ããŒã¹ã«æžã蟌ãããšãããšããã£ãŒã«ãããã£ãŒã«ããããé·ãããšã«æ³šæããŠãã ããïŒä»¥åã®ã¯ãšãªã§äœæãããããŒãã«ã®ãã£ãŒã«ãé·ã¯65536æåã§ãïŒ-ãšã©ãŒãçºçããŸãã ããã¯ãããã£ãç®çã®ãµã€ãºã«ããªãã³ã°ããããerrorHandlerïŒdeadLetterChannelïŒ "fileïŒerror"ïŒïŒãè¿œå ããããšã§è§£æ±ºã§ããŸããããã«ããããerrorããã©ã«ããŒå ã®ãšã©ãŒã«ã€ãªããã¡ãã»ãŒãžãéä¿¡ãããŸãã
ãã®äŸã§ã¯ãH2ããŒã¿ããŒã¹ãšã®çžäºäœçšãèæ ®ããŠããŸãã ä»ã®ããŒã¿ããŒã¹ã®å Žåãé©åãªã©ã€ãã©ãªãbuild.sbtã«è¿œå ãããã©ã€ããŒã¯ã©ã¹ã®ååãURLã決å®ããå¿ èŠããããŸãã ãŠãŒã¶ãŒåããã¹ã¯ãŒããªã©ãä»ã®æ¥ç¶ããããã£ãå¿ èŠã«ãªãå ŽåããããŸãã
Postgresqlãæäœããããã®æ¥ç¶ã®è©³çŽ°ã®èª¬æã®äŸïŒ
build.sbtãžã®ã©ã€ãã©ãªã®è¿œå
libraryDependencies += "org.postgresql" % "postgresql" % "9.4.1207"
ã¯ã©ã¹ã®å®è£ ïŒ
val ds = new BasicDataSource { setDriverClassName("org.postgresql.Driver") setUrl(conf.getString("jdbc:postgresql://myhost:5432/mydb")) setUsername(conf.getString("myusername")) setPassword(conf.getString("mypassword")) }
ãã¥ãŒã€ã³ã°ã¯å°ãè€éã§ãã äžéšã®ãã¥ãŒãããŒãžã£ã§ã¯ããªããžããªã§ã¢ã¯ã»ã¹ããããã®ã©ã€ãã©ãªãéãããŠããŸããã ãã®å Žåã* .jarãã¡ã€ã«ã䜿çšããããããžã§ã¯ãã®libãã©ã«ããŒã«ä¿åãããŸãã
ãã¥ãŒãããŒãžã£ã®å Žåãæ¥ç¶ãã¡ã¯ããªã¿ã€ãã®é©åãªãªããžã§ã¯ããäœæããå¿
èŠããããŸãã
ããšãã°ãIBM Websphere MQãšå¯Ÿè©±ããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
val cf = new MQQueueConnectionFactory { setHostName("myhost") setPort(1414) setTransportType(1) setQueueManager("myqmname") setChannel("mychannel") }
Oracle Weblogic Jmsã®å Žåã¯ããã«èå³æ·±ãã§ãã Weblogic Server 11gã§åçŽãªJMSãã¥ãŒãäœæããæ¹æ³ã®ãã¥ãŒãäœæããå Žåãã³ã³ããŒãã³ã宣èšã¯æ¬¡ã®ããã«ãªããŸãã
val env = new util.Hashtable[String, String] env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory") env.put(javax.naming.Context.PROVIDER_URL, "t3://myhost:7001") val ic: InitialContext = new InitialContext(env) val connectionFactory = ic.lookup("jms/TestConnectionFactory").asInstanceOf[QueueConnectionFactory] // jms/TestConnectionFactory - jndi ConnectionFactory" mainApp.bind("ora-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory))
ãšã³ããã€ã³ãURIã¯æ¬¡ã®åœ¢åŒã«ãªããŸãïŒãora-jmsïŒqueueïŒ./ TestJMSModuleïŒTestJMSQueueããããã§./ã¯çŸåšã®ãµãŒããŒããTestJMSModuleãJNDIã¢ãžã¥ãŒã«åãTestJMSQueueã-JNDIãã¥ãŒå
äŸ5
ãã¡ã€ã«ã®å
容ã«ããã«ãŒãã£ã³ã°ã ãã®äŸã§ã¯ãã³ã³ãã³ãã«å¿ããŠã¡ãã»ãŒãžã®ã«ãŒãã£ã³ã°ãæ€èšããŸãã
å ¥åã«xmlã¡ãã»ãŒãžãããããã®åŠçã¯ToèŠçŽ ã®å€ã«äŸåãããšä»®å®ããŸãã
<To>ActiveMQ</To>
-ãã¥ãŒã«éä¿¡ããå¿
èŠãããã <To>H2</To>
-äœããã®æ¹æ³ã§åŠçããŠããŒã¿ããŒã¹ã«éä¿¡ããå¿
èŠãããã <To>someAdress</To>
-äœããã®æ¹æ³ã§åŠçããŸãã
ã¡ãã»ãŒãžã®éä¿¡å ãšãªããšã³ããã€ã³ãã®ååãå«ãDestinationããããŒãã¡ãã»ãŒãžã«è¿œå ãããŸãã
ã¡ãã»ãŒãžã®åŠçäžã«ãšã©ãŒãçºçããå ŽåããŸãã¯ã«ãŒãã£ã³ã°ããŒãã«ã«å¯Ÿå¿ããå€ããªãå Žåãã¡ãã»ãŒãžããdirectïŒtrashãã«éä¿¡ããŸãã
ãã®äŸã§ã¯ãããã¯æ§é "???"ã䜿çšããŠããŸããããã«ãããååšããªãã³ãŒããããã¯ã眮ãæããŠã³ã³ãã€ã«ãæåãããããšãã§ããŸãã 代ããã«ãåŠçããžãã¯ãèšè¿°ããå¿ èŠããããŸãã
import org.apache.camel.{Exchange, CamelContext} import org.apache.camel.scala.dsl.builder.ScalaRouteBuilder import scala.xml.XML class ContentOrientedRouting(context: CamelContext) extends ScalaRouteBuilder(context) { // , "direct:trash" errorHandler(deadLetterChannel("direct:trash")) // Map val destMap = Map( "ActiveMQ" -> "jms-amq:queue:inbox", "H2" -> "direct:h2db", "someAdress" -> "direct:outbox") // val addRoutingAction = (exchange: Exchange) => { // "To" XML-, val body = exchange.getIn.getBody(classOf[String]) val xmlBody = XML.loadString(body) val toValue = (xmlBody \\ "To").text // endpoint, - "direct:trash" val dest = destMap.getOrElse(toValue,"direct:trash") // exchange.getOut.setHeader("Destination", dest) } """direct:inbox1""" ==> { process(addRoutingAction) // "Destination" endpoint recipients(_.in("Destination")) } // endpoint """jms-amq:queue:inbox""" ==> {???} """direct:h2db""" ==> { process((exchange: Exchange) => {???}) to ("jdbc:h2db") } """direct:outbox""" ==> { // to("file:someFile", "log:Somelog") } """direct:trash""" ==> {???} }
ãã®äŸã¯ããã®ç®çã®ããã«å°ããªã¢ããªã±ãŒã·ã§ã³ãå®è£ ããæ¹æ³ã瀺ããŠããŸãã è¿œå ã®åŽé¢ãæ€èšããŸãããã ã¢ããªã±ãŒã·ã§ã³ã®éçºãšä¿å®ããã䟿å©ã«ããããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãæ§æããããã«ãã³ãŒãã«æ¥ç¶ãã©ã¡ãŒã¿ãŒãã€ãªãã®ã§ã¯ãªããæ§æãã¡ã€ã«ã«ä¿åããããã«ãTypesafe ã©ã€ãã©ãªãŒã䜿çšããŸãã
build.sbtã«ä»¥äžãè¿œå ããŸãã
libraryDependencies += "com.typesafe" % "config" % "1.3.0"
src / main / resourcesãã©ã«ããŒã§application.confãã¡ã€ã«ãäœæããŸãããã®ãã¡ã€ã«ã«èšå®ãæå®ããã³ãŒãããèšå®ãåŒã³åºããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãsbt runã³ãã³ãã«ãã£ãŠèµ·åãããŸãã å Žåã«ãã£ãŠã¯ãããã¯äžäŸ¿ãããããŸããã
sbt-assemblyãã©ã°ã€ã³https://github.com/sbt/sbt-assemblyã䜿çšããŠjarãã¡ã€ã«ãäœæããjava âjar camelapp.jarã³ãã³ããå®è¡ããããšãã§ããŸãã ãã¹ãŠã®äŸåé¢ä¿ã¯.jarãã¡ã€ã«ã«å«ãŸããããããµã€ãºã¯å€§ãããªããŸãããã³ã³ããŒãã³ããããŠã³ããŒãããã«ããã«éå§ããŸãã
nohupã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããã¯ã°ã©ãŠã³ãã§å®è¡ãããšäŸ¿å©ã§ãã
$ PATHç°å¢å€æ°ã«å«ãŸãããã©ã«ããŒã§å®è¡ããã¹ã¯ãªãããäœæããä»»æã®ãã£ã¬ã¯ããªããååã§åŒã³åºããŸãã ããšãã°ã/ usr / local / bin /ã«ãããŸãã å®è¡ããã¹ã¯ãªããïŒ
/ usr / local / bin / camelstart
#!/bin/bash /usr/bin/nohup java -jar /opt/camelapp.jar&
åæ¢ããã«ã¯ïŒ
/ usr / local / bin / camelstop
#!/bin/bash pkill -f camelapp
ã¢ããªã±ãŒã·ã§ã³ã®èµ·åã¯camelstartã³ãã³ãã§è¡ãããåæ¢ã¯camelstopã§è¡ãããŸãã
Apache Camelã䜿çšããããšã®é·æãšçæã匷調ã§ããŸãã
é·æïŒ
- ã¢ããªã±ãŒã·ã§ã³ã®é«éå®è£ ã
- å€æ°ã®å®æããã³ã³ããŒãã³ãã
- ãã«ãã¹ã¬ãããããã«äœ¿çšå¯èœãªã¡ãã»ãŒãžã®äžŠååŠçã
- XML圢åŒãŸãã¯DSL圢åŒã®èšè¿°æ¹æ³ãéžæããæ©èœã
çæïŒ
- åã³ã³ããŒãã³ãã«ã¯ç¬èªã®äœæ¥ããžãã¯ããããç解ããã«ã¯æéãããããŸãã
- ãšã³ããªã®ãããå€ããããŸãã
ããã«ãApache Camelã¯JVMäžã§å®è¡ããããããããã«åºã¥ããŠæ§ç¯ãããã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã®ãã©ãããã©ãŒã ã®é·æãšçæããããŸãã
åŒç€Ÿã§Apache CamelãScalaDSLãšçµã¿åãããŠäœ¿çšââããçµéšã¯ãã¹ã¿ããçµ±åã³ã³ããŒãã³ããããã³å Žåã«ãã£ãŠã¯è² è·ãã¹ãã®äœæã«å¯Ÿããæå¹æ§ã瀺ããŠããŸãã