2011-07-12 10 views
28

मैं एक शुद्ध अक्का संचालित आरईएसटी आधारित वेब एपीआई लागू करने का इरादा रखता हूं। मैं स्प्रे का उपयोग करने के बारे में निश्चित नहीं हूँ। यदि यह कोई अच्छा है तो मैं स्केलत्रा का उपयोग करने पर विचार करूंगा। असल में मैं स्कैला अभिनेता मॉडल के समवर्ती लाभों का उपयोग करने में रूचि रखता हूं। मैं नहीं चाहता कि सर्वलेट कंटेनर उस प्रक्रिया में बाधा बन जाए।अक्का का उपयोग कर एक आरईएसटी वेब सेवा को कैसे कार्यान्वित करें?

अन्य विकल्प क्या हो सकते हैं?

अद्यतन 1: कौन सा अक्का बैकएंड के आधार पर बाकी को लागू करने के लिए बेहतर दृश्यपटल है? - स्प्रे, स्केलेट्रा या ड्रॉपविज़ार्ड या कोई अन्य?

उत्तर

27

महत्वपूर्ण बात यह है अक्का के बारे में एहसास है कि यह एक सभी या कुछ भी नहीं वातावरण नहीं है। आप एक बड़ी डिग्री के लिए, सिस्टम के लिए समझने के लिए विभिन्न पुस्तकालयों को मिलाकर मैच कर सकते हैं जो आपके लिए समझ में आता है। उदाहरण के लिए, मैंने ऐसे ऐप्स लिखे हैं जो Dropwizard का उपयोग बैकएंड के सामने करते हैं जो अंक के बिना अक्का का उपयोग करता है। मैंने Clothesline के साथ भी ऐसा किया है (क्लोजर में लागू किया गया है, लेकिन Scala wrapper के साथ)। और बाद में इस सप्ताह मैं Unfiltered के websocket implementation का उपयोग करने और अक्का के सामने ग्राहक ब्राउज़रों के लिए वास्तविक समय डेटा के पास भोजन के लिए एक RabbitMQ पाइप में बैठने के लिए के साथ प्रयोग करने की उम्मीद है - मैं विशेष रूप से इस उदाहरण का उल्लेख क्योंकि अनफिल्टर्ड WebSocket impl पर बैठता है सर्वलेट कंटेनर के बजाय Netty का शीर्ष)।

अद्यतन: इस जवाब में कुछ साल पहले लिखा होने के बाद से, मैं विशेष रूप से अक्का साथ RESTful विकास के लिए Spray का उपयोग शुरू कर दिया है। जबकि किसी भी जेवीएम आरईएसटी लाइब्रेरी का उपयोग किया जा सकता है, स्प्रे बहुत स्वाभाविक रूप से अक्का के अभिनेता-आधारित मॉडल में फिट बैठती है और पुस्तकालय स्पष्ट रूप से परिपक्वता के स्तर तक पहुंच गया है जहां यह आसानी से डिफ़ॉल्ट विकल्प हो सकता है। नए अक्का-http मॉड्यूल के रूप में अक्का में स्प्रे का आगामी एकीकरण इसका स्पष्ट संकेत है।

+0

मैं नेटटी + अनफिल्टर का एक संस्करण बनाने के लिए किसी के लिए लुभाना चाहता हूं जो जेटी निरंतरता और/या सर्वलेट 3.0 असिंक का उपयोग करता है, इसलिए मैं उस तरह अक्का को हुक कर सकता हूं। यदि आप वांछनीय हैं तो निजी तौर पर अपने अक्का अनुभवों के बारे में सुनकर मैं बहुत उत्सुक हूं। भयानक काम जारी रखें, √ –

+1

हाँ, यह कभी भी अनुमति देता है, मुझे उस जोड़े को पाने में पिच करना अच्छा लगेगा। मुझे पता है कि वहां पहले से ही कुछ आधारभूत कार्य है, लेकिन यह समझना मुश्किल है कि कितना काम करना बाकी है। और यह websockets में मेरा पहला प्रयास है (हालांकि, मैंने अतीत में धूमकेतु के साथ बहुत कुछ किया है), मैं शामिल जटिलताओं के बारे में संकोच कर रहा हूं। –

+0

एर, मेरा कहना था, मुझे पता है कि इस अर्थ में पहले से ही कुछ आधारभूत कार्य है कि काम सीधे इसे अक्का में करना शुरू कर दिया गया था। निश्चित नहीं है कि किसी ने जेटी/सर्वलेट 3.0 एपीआई के माध्यम से अनफिल्टर में इसे कार्यान्वित करने का प्रयास किया है। मुझे शोध करना चाहिए कि ... ओह, मैं कुछ खाली समय के लिए क्या दे दूंगा। –

3

HTTP सर्वलेट और कई कंटेनरों एक करने की कोशिश की और विश्वसनीय प्रौद्योगिकी है बाहर। अक्का आपको its own embedded servlet container का विकल्प प्रदान करता है, या आप इसे with your own का उपयोग कर सकते हैं।

आप, ज़ाहिर है, Netty साथ अपने वेब सर्वर रोल कर सकते हैं, और वहाँ एक दिलचस्प write-up about this on the web है।

10

आप कोड यह करने के लिए चाहते हैं, तो ये रहा। यह वास्तव में यह जानने के लिए थोड़ा सा लगा कि क्या हो रहा है, क्योंकि उदाहरणों का एक टन है, और यह स्पष्ट नहीं है कि वे क्या कर रहे हैं या इसे सभी को कैसे रखा जाए। पता चला है इसे और अधिक आसान था की तुलना में मैंने सोचा था कि:

package com.nthalk.akkatest 

import akka.actor.Actor.actorOf 
import akka.actor.Actor 
import akka.camel.Consumer 
import akka.camel.Message 
import akka.camel.CamelServiceManager 

class MyActor extends Actor with Consumer { 
    def endpointUri = "jetty:http://localhost:8877/" 
    def receive = { 
    case msg: Message => { self.reply("State Rest Service: Achieved") } 
    case _ => { self.reply("Really, no message?") } 
    } 
} 

object App extends scala.App { 
    actorOf[MyActor].start 
    CamelServiceManager.startCamelService 
} 

और मेरे build.sbt की तरह दिखता है:

organization := "com.nthalk" 

name := "akkatest" 

version := "0.1.0" 

resolvers += 
    "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/" 

libraryDependencies ++= Seq(
    "org.apache.camel" % "camel-jetty" % "2.9.0", 
    "se.scalablesolutions.akka" % "akka-camel" % "1.3.1" 
) 

आशा इस मदद करता है!

0

मुझे नहीं पता कि आप एक सर्वलेट कंटेनर का आधार के रूप में क्यों उपयोग कर रहे हैं - यह वास्तव में आपकी पसंद को किसी भी संभावित तरीके से सीमित नहीं करता है, यह केवल मूल HTTP सर्वर नलसाजी को संभालता है। इस प्रकार, अधिकांश जावा सेवा ढांचे में मूल नींव के रूप में सर्वलेट एपीआई का उपयोग होता है भले ही वे उस स्तर का पर्दाफाश न करें।

मुझे लगता है कि ड्रॉपविज़ार्ड सभी प्रकार की जेवीएम आराम सेवाओं के लिए एक बेहतरीन विकल्प है, जिसमें वास्तविक उठाने के लिए अक्का का उपयोग किया जाता है। इसकी भलाई के स्पष्ट कारण के अलावा (पुस्तकालयों के संग्रह के आधार पर "जेवीएम का सर्वश्रेष्ठ" साबित हुआ), मुझे यह पसंद है क्योंकि यह उन क्षेत्रों में मदद करता है जो कई अन्य libs/ढांचे को छोड़ देते हैं: मेट्रिक्स का उत्पादन, घोषणात्मक सत्यापन; सभी चीजों को सरल, स्पष्ट और समझने योग्य रखते हुए।

5

पूर्णता के लिए, स्केलैट्रा उदाहरण के लिए उपयोगी लगता है (चूंकि सवाल स्केलत्रा के बारे में पूछा गया था)। यहाँ Scalatra Akka Guide से कुछ उदाहरण कोड है:

package com.example.app 

import akka.actor.{ActorRef, Actor, Props, ActorSystem} 
import akka.dispatch.ExecutionContext 
import akka.util.Timeout 
import org.scalatra.FutureSupport 
import org.scalatra.{Accepted, ScalatraServlet} 

class MyActorApp(system:ActorSystem, myActor:ActorRef) extends ScalatraServlet with  FutureSupport { 

    protected implicit def executor: ExecutionContext = system.dispatcher 

    import _root_.akka.pattern.ask 
    implicit val timeout = Timeout(10) 

    get("/async") { 
    new AsyncResult { def is = myActor ? "Do stuff and give me an answer" } 
    } 

    get("/fire-forget") { 
    myActor ! "Hey, you know what?" 
    Accepted() 
    } 
} 

class MyActor extends Actor { 
    def receive = { 
    case "Do stuff and give me an answer" => sender ! "The answer is 42" 
    case "Hey, you know what?" => println("Yeah I know... oh boy do I know") 
    } 

} 
+0

मुझे निम्न त्रुटि मिली है उदाहरण के साथ कोड: स्कैला: पैरामीटर टाइमआउट के लिए निहित मूल्य नहीं मिला: akka.util.Timeout नया AsyncResult {val is = myActor? "सामान करो और मुझे जवाब दें"} – Owen

+0

मेरे लिए काम करने के लिए टाइमआउट वैल का नाम बदलना – Owen

3

का उपयोग कर akka-http (लोगों को भी यह स्प्रे 2.0 कहते हैं) जो अक्का धाराओं पर आधारित है।

संबंधित मुद्दे