2017-10-17 31 views
0

아파치 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 클래스는 쓸모가 없습니다. - 대부분의 경우 다른 노드에서 수행 될 수있는 Service 인스턴스를 생성 한 직후에이 인스턴스는 직렬화되어 내부 캐시에 추가되고 대상 시스템에서 시작됩니다 .

제티 서버 객체를 올바르게 직렬화 할 수 없다고 생각합니다. 예를 들어 ThreadPool의 직렬화는 수행 할 수 없습니다. Thread 구현에는 원시 코드 블록이 포함되어 있기 때문입니다.

+0

아, 맞아. 저는 지금 순간적으로 개발 중이기 때문에 직렬화에 대해서 생각조차하지 않았습니다. – Derecho

0

나는 그걸 알아 냈지만 같은 문제가있는 다른 사람의 이익을 위해 그걸 남겨 둘 것입니다.

생성자에서 Server을 인스턴스화 할 수 없습니다. 은 방법으로해야합니다. (생성자가 실행 아직 때 어떤 생각이 왜,하지만 - 아마도 스레드 풀은 설정하지 있습니다.)

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") 
    } 
}