2017-10-17 14 views
0

ApacheのIgniteサービス(this thread)にJettyサーバーを埋め込みたいので、HTTPエンドポイントを自分のデータパイプラインのエントリポイントにすることができます。ここに私の基本的なテストです:Apache IgniteサービスにJettyサーバーを埋め込む方法は?

Main.scala

object Main { 
    def main(args: Array[String]): Unit = { 
     val ignite = Ignition.start() 
     val group = ignite.cluster.forLocal 
     val services = ignite.services(group) 
     services.deployNodeSingleton("myTestService", new TestServiceImpl) 
    } 
} 

TestService.scala

trait TestService { 
    def test() 
} 

class TestServiceImpl extends Service with TestService { 
    val server = new Server(8090) 

    def cancel(ctx: ServiceContext) = { 
     server.stop() 
     server.join() 
    } 

    def init(ctx: ServiceContext) = { 
     println("TestServiceImpl#init") 
    } 

    def execute(ctx: ServiceContext) = { 
     println("TestServiceImpl#execute") 
     server.start() 
    } 

    def test() = { 
     println("Tested") 
    } 
} 

私はそれを実行すると、私は次のエラーを取得する:

[01:52:57] Ignite node started OK (id=626c1302) 
[01:52:57] Topology snapshot [ver=1, servers=1, clients=0, CPUs=8, heap=2.0GB] 
TestServiceImpl#init 
TestServiceImpl#execute 
Oct 17, 2017 1:52:57 AM org.apache.ignite.logger.java.JavaLogger error 
SEVERE: Service execution stopped with error [name=myTestService, execId=565f4fb4-5726-4c37-857d-0c74f3b334ce] 
java.util.concurrent.RejectedExecutionException: [email protected] 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:362) 
    at org.eclipse.jetty.io.SelectorManager.execute(SelectorManager.java:160) 
    at org.eclipse.jetty.io.SelectorManager.doStart(SelectorManager.java:258) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:256) 
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) 
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:366) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at me.danellis.ignite.TestServiceImpl.execute(TestService.scala:23) 
    at org.apache.ignite.internal.processors.service.GridServiceProcessor$2.run(GridServiceProcessor.java:1160) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:748) 

何かをする必要がありますか?これが動作するためにIgniteまたはJettyのどちらかで異なって構成されていますか?

答えて

2

あなたがそれているために、initメソッドで桟橋Serverクラスをインスタンス化しますサービスの配備直後にターゲットマシン上で呼び出されます。コンストラクタのインスタンス化サーバークラスは無用です - サービスインスタンスを作成した直後(ほとんどの場合、他のノードで実行可能)、このインスタンスはシリアル化され、内部のキャッシュに追加されます。 。

私はそれは桟橋Serverオブジェクトを正しくシリアライズすることができないことは明らかだと思います。たとえば、ThreadPoolの直列化は実行できません。これは、Thread実装にネイティブコードのブロックが含まれているためです。

+0

あ、そうです。私は現時点ではローカルで開発しているので、シリアライゼーションについては考えていませんでした。 – Derecho

0

私はそれを考え出したが、私は同じ問題を抱えて誰の利益のためにそれを残しておきます。

あなたは、コンストラクタでServerをインスタンス化することはできませんが判明します。 は、initの方法でにする必要があります。 (コンストラクターが実行したときに何のアイデアは、なぜ、しかし、おそらく、スレッドプールがまだ設定されていませんされていません。)

TestService.scala

class TestServiceImpl extends Service with TestService { 
    var server: Server = _ 

    def cancel(ctx: ServiceContext) = { 
     server.stop() 
     server.join() 
    } 

    def init(ctx: ServiceContext) = { 
     println("TestServiceImpl#init") 
     server = new Server(8090) 
    } 

    def execute(ctx: ServiceContext) = { 
     println("TestServiceImpl#execute") 
     server.start() 
    } 

    def test() = { 
     println("Tested") 
    } 
} 
関連する問題