Code Monkey home page Code Monkey logo

play2-sockjs's People

Contributors

arielscarpinelli avatar fdimuccio avatar flo354 avatar gcacace avatar mellster2012 avatar mkurz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

play2-sockjs's Issues

Play 2.8.0 support

Hi there,

Play 2.8.0 is not released. Could you make it compatible?

Thanks,

Detecting close status code

When a websocket is closed by the remote client, is there a way to identify the connection close status code?, I am implementing a reconnection feature & it is important to identify if it is a clean close or a abrupt failure. Websockt spec defines these codes
https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1 7 & browsers do implement these status codes. SockJs server also sends codes such as 3000 Go away, which gets propagated to browsers onClose event.

Eg:
Javascript on close event payload
{
"type": "close",
"bubbles": false,
"cancelable": false,
"timeStamp": 1654833914457,
"wasClean": true,
"code": 3000,
"reason": "Go away!"
}

https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code

Rejecting & accepting websockets

I would like to reject & accept websockets based on the session status, something like what play2 websockets supports

public LegacyWebSocket socket() {
if (session().get("user") != null) {
return WebSocket.withActor(MyWebSocketActor::props);
} else {
return WebSocket.reject(forbidden());
}
}

What is the api support for this?

SockJS with Dependency Injection

Hello

I'm using lib with my Play 2.3.1. From version 2.1 (I think) there is a possibility for dependency injection. How is it possible to add it to sockjs?

Checking the examples and docs, I didn't find any solutions. Ideas?

Compatibility Scala 2.13

Hi there,

Play 2.7.3 bring support for scala 2.13. Could you make play2-sockjs compatible with scala 2.13.

Thanks,

Detect ungraceful client disconnects

Play2 websockets do not detect ungracefully disconnected clients, i.e pull the network cable in the client machine server is not notified on the connection loss.

playframework/playframework#1388
http://stackoverflow.com/questions/21654421/websocket-connection-status-on-server
http://stackoverflow.com/questions/12681565/websocket-hard-disconnect-not-apparent

Solutions that are recommended talks about using heartbeats to detect stale connections. As we are using Sockjs api, is this a feature play2-sockjs can support?.
Undetected failures results is stale connection & a major problem in implementing a reconnect.

Play 2.7.3 support

Released version 0.7.0 is failing with Play 2.7.2 & Play 2.7.3

Pull request #29 or setting the play version to 2.7.3 fixes this. Can we please have a release 0.7.1 with this fix

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: scala/collection/compat/Factory$]]
	at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:351)
	at play.api.http.HttpErrorHandlerExceptions.throwableToUsefulException(HttpErrorHandler.scala)
	at play.http.DefaultHttpErrorHandler.throwableToUsefulException(DefaultHttpErrorHandler.java:227)
	at play.http.DefaultHttpErrorHandler.onServerError(DefaultHttpErrorHandler.java:182)
	at com.xxx.xxx.configuration.CustomErrorHandler.onServerError(CustomErrorHandler.java:91)
	at play.core.j.JavaHttpErrorHandlerAdapter.$anonfun$onServerError$1(JavaHttpErrorHandlerAdapter.scala:24)
	at play.core.j.JavaHelpers.$anonfun$invokeWithContext$1(JavaHelpers.scala:290)
	at play.core.j.JavaHelpers.withContext(JavaHelpers.scala:302)
	at play.core.j.JavaHelpers.withContext$(JavaHelpers.scala:298)
	at play.core.j.JavaHelpers$.withContext(JavaHelpers.scala:311)
	at play.core.j.JavaHelpers.invokeWithContext(JavaHelpers.scala:289)
	at play.core.j.JavaHelpers.invokeWithContext$(JavaHelpers.scala:284)
	at play.core.j.JavaHelpers$.invokeWithContext(JavaHelpers.scala:311)
	at play.core.j.JavaHttpErrorHandlerAdapter.onServerError(JavaHttpErrorHandlerAdapter.scala:24)
	at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:448)
	at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:446)
	at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:417)
	at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
	at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
	at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
	at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:92)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
	at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:92)
	at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
	at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:49)
	at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
	at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
	at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
	at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.util.concurrent.CompletionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: scala/collection/compat/Factory$
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292)
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308)
	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593)
	at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577)
	at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
	at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977)
	at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:21)
	at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:18)
	at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
	at scala.concurrent.BatchingExecutor$Batch.processBatch$1(BatchingExecutor.scala:67)
	at scala.concurrent.BatchingExecutor$Batch.$anonfun$run$1(BatchingExecutor.scala:82)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
	at scala.concurrent.BatchingExecutor$Batch.run(BatchingExecutor.scala:59)
	at scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Future.scala:874)
	at scala.concurrent.BatchingExecutor.execute(BatchingExecutor.scala:110)
	at scala.concurrent.BatchingExecutor.execute$(BatchingExecutor.scala:107)
	at scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scala:872)
	at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:72)
	at scala.concurrent.impl.Promise$DefaultPromise.$anonfun$tryComplete$1(Promise.scala:288)
	at scala.concurrent.impl.Promise$DefaultPromise.$anonfun$tryComplete$1$adapted(Promise.scala:288)
	at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:288)
	at scala.concurrent.Promise.tryFailure(Promise.scala:112)
	at scala.concurrent.Promise.tryFailure$(Promise.scala:112)
	at scala.concurrent.impl.Promise$DefaultPromise.tryFailure(Promise.scala:187)
	at play.api.mvc.Filter$$anon$2$$anonfun$$nestedInanonfun$apply$4$1.applyOrElse(Filters.scala:86)
	at play.api.mvc.Filter$$anon$2$$anonfun$$nestedInanonfun$apply$4$1.applyOrElse(Filters.scala:80)
	... 14 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: scala/collection/compat/Factory$
	at play.api.mvc.ActionBuilder$$anon$10.apply(Action.scala:431)
	at play.api.mvc.Action.$anonfun$apply$2(Action.scala:98)
	at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
	... 13 common frames omitted
Caused by: java.lang.NoClassDefFoundError: scala/collection/compat/Factory$
	at play.sockjs.core.Server.$anonfun$send$14(Server.scala:75)
	at scala.util.Either.fold(Either.scala:191)
	at play.sockjs.core.Server.$anonfun$send$2(Server.scala:75)
	at play.api.mvc.ActionBuilderImpl.invokeBlock(Action.scala:489)
	at play.api.mvc.ActionBuilderImpl.invokeBlock(Action.scala:487)
	at play.api.mvc.ActionBuilder$$anon$10.apply(Action.scala:426)
	... 15 common frames omitted

Actor API

Since Play 2.3 there's also an Actor API for WebSockets.
Are you planning to introduce the similar api for SockJS?

Details concerning failed xhr_tests?

Could someone elaborate on the reasons why the two mentioned xhr tests fail (test_abort_xhr_streaming and test_abort_xhr_polling)?

Is it caused by Netty not detecting that the connection has been closed or is it directly related to the implementation of play2-sockjs?

OutOfMemoryError

I am using SockJS with Play2.7 & I am seeing OutOfMemeory crashes intermittently. We never experienced this issue with Play2.5.
SockJS router is handled with an actor(WebSocketActor). WebSocketActor receives a very high volume of messages, hence large buffer is used(1048576) is defined for ActorFlow.actorRef

SockJs router

@Override
public SockJSSettings settings() {
	return new SockJSSettings().withWebsocket(true)
			.withSessionTimeout(FiniteDuration.create(5000, TimeUnit.MILLISECONDS))
			.withHeartbeat(FiniteDuration.create(20000, TimeUnit.MILLISECONDS))
			.withSessionBufferSize(512 * 1024).withStreamingQuota(4 * 1024);
}

// SockJS endpoint handler
@Override
public SockJS sockjs() {
	return SockJS.Text.acceptOrResult(request -> {
		if (isValid(request)) {
			return CompletableFuture
					.completedFuture(F.Either.<Result, Flow<String, String, ?>>Right(ActorFlow.actorRef(	
							actorRef -> createActorRef(() -> websocketActorFactory.create(actorRef, params)),
							1048576, // support high volume of messages
							OverflowStrategy.fail(),
							actorSystem,
							materializer)));
			
		} else {
			logger.error("Invalid request');
		}
		return CompletableFuture.completedFuture(F.Either.Left(forbidden()));
	});
}

private Props createActorRef(Supplier<Actor> create) {
     return Props.create(Actor.class, create::get);
}
Uncaught error from thread [application-akka.actor.default-dispatcher-65743]: Java heap space, shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[application]
java.lang.OutOfMemoryError: Java heap space
	at akka.stream.impl.FixedSizeBuffer$FixedSizeBuffer.<init>(Buffers.scala:71)
	at akka.stream.impl.FixedSizeBuffer$PowerOfTwoFixedSizeBuffer.<init>(Buffers.scala:141)
	at akka.stream.impl.FixedSizeBuffer$.apply(Buffers.scala:65)
	at akka.stream.impl.Buffer$.apply(Buffers.scala:45)
	at akka.stream.impl.Buffer$.apply(Buffers.scala:40)
	at akka.stream.impl.ActorRefSource$$anon$1.<init>(ActorRefSource.scala:45)
	at akka.stream.impl.ActorRefSource.createLogicAndMaterializedValue(ActorRefSource.scala:39)
	at akka.stream.impl.GraphStageIsland.materializeAtomic(PhasedFusingActorMaterializer.scala:674)
	at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:491)
	at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:450)
	at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:443)
	at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:629)
	at play.api.libs.streams.ActorFlow$.actorRef(ActorFlow.scala:46)
	at play.api.libs.streams.ActorFlow.actorRef(ActorFlow.scala)
	at play.libs.streams.ActorFlow.actorRef(ActorFlow.java:54)
	at mycontroller.controllers.SockJSRouterController.lambda$sockjs$2(SockJSRouterController.java:81)
	at mycontroller.controllers.SockJSRouterController$$Lambda$1771/0x0000000800e62c40.apply(Unknown Source)
	at play.sockjs.SockJS$1.apply(SockJS.java:134)
	at play.sockjs.core.j.JavaSockJS.$anonfun$withComponents$1(JavaSockJS.scala:23)
	at play.sockjs.core.j.JavaSockJS$$Lambda$1758/0x0000000800e5c040.apply(Unknown Source)
	at play.sockjs.api.SockJS$$anon$1.apply(SockJS.scala:34)
	at play.sockjs.core.transports.WebSocket.$anonfun$framed$2(WebSocket.scala:27)
	at play.sockjs.core.transports.WebSocket$$Lambda$1762/0x0000000800e5f040.apply(Unknown Source)
	at play.api.mvc.WebSocket$.$anonfun$acceptOrResult$1(WebSocket.scala:205)
	at play.api.mvc.WebSocket$$$Lambda$1765/0x0000000800e61040.apply(Unknown Source)
	at play.api.mvc.WebSocket$$anon$1.apply(WebSocket.scala:42)
	at play.core.server.AkkaHttpServer.executeHandler(AkkaHttpServer.scala:370)
	at play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:325)
	at play.core.server.AkkaHttpServer.$anonfun$createServerBinding$1(AkkaHttpServer.scala:189)
	at play.core.server.AkkaHttpServer$$Lambda$934/0x0000000800aa0840.apply(Unknown Source)
	at akka.stream.impl.fusing.MapAsync$$anon$30.onPush(Ops.scala:1261)
	at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:523)

Any thoughts or guidance is highly appreciated.

Header Access‐Control‐Allow‐Origin: *

Header Access‐Control‐Allow‐Origin: * is set in the response of /info
Request 
GET /ws/info?t=1644820694965 HTTP/1.1

Response
Access‐Control‐Allow‐Origin: *

is it possible to disable/set this header value by the app?

PenTesting picks this as a misconfiguration.

API reference for 0.6.x is missing

It seems there are breaking changes from 0.5.x to 0.6.x

For instance, there is no method withActor.
@Override public SockJS sockjs() { SockJS.withActor(MySockJSActor::props); }

It would be nice to have a documentation.

Thanks,

WebSocket actor crashes for large payloads

This issue only happens on the websocket protocol. On XHR streaming, the large payload is passed through to the Sock Actor without an issues. The JSON payload I am sending is 0.5 MB in size.

The following can be observed:
[debug] c.k.c.a.SockActor - Actor started: akka://play-dev-mode/user/StreamSupervisor-0/$$i
[debug] c.k.c.a.SockActor - Actor ended: akka://play-dev-mode/user/StreamSupervisor-0/$$i

I am provisioning the actor as follows:

private static final int STREAMING_QUOTA = 4096;
private static final int SIXTEEN = 16;

@Inject
public SockActorController(ActorSystem actorSystem) {
    this.actorSystem = actorSystem;
}

@Override
public SockJSSettings settings() {
    return new SockJSSettings().withStreamingQuota(STREAMING_QUOTA);
}

@Override
public SockJS sockjs() {
    return SockJS.Json.accept(req -> ActorFlow.<JsonNode,
            JsonNode>actorRef(out -> SockActor.props(out),
            SIXTEEN,
            OverflowStrategy.dropNew(),
            actorSystem).asJava());
}

Is STREAMING_QUOTA the bottleneck here?

Compatibility with Akka Cluster

Hi,

I was wondering if this module can be compatible with Akka Cluster, so we can have more flexibility about load balancing.

Thanks,

WebSocket Re-connection

Does Sockjs/Play-Sockjs support re-connection.
Are there any recommendations around this?

Play2-sockjs performance

I have just moved from native play websockets to Play2-sockjs.
Firefox & IE seems to be much more stable with sockjs & I get wss over https(something play natively lacks dearly)
However I see a performance decrease around 10-20% across all browsers for both ws & wss traffic(no difference between ws & wss) when compared to native play plain websockets. The test was perfomed using a minimalistic echo server where the client does a sock.send(...) in 'onmessage'.

Get IP address

Hi,

I was using Atmosphere-Play until now, and I had the possibility to get the IP address of a resource. Is it possible to do the same thing with play2-sockjs ?

Thanks,

Play 2.7 released

Hi there :)

Play 2.7 is now stable (version 2.7.0). Will you update the module?

Thanks,

Sockjs 0.9.x - Play2.9 Scala3 support

Play 2.9 supports Scala3, however Sockjs Play2.9 supported version, 0.9.0 supports only Scala 2.
Can you please release Sockjs 0.9.x with Scala 3 support

Error in stage [play.sockjs.core.streams.CancellationSuppresser@37e0822a]: Cannot push port (SubSourceOutlet(CancellationSuppresserSubSource)) twice, or before it being pulled

I am seeing this error intermittently in logs, it seems to be happening at close(). I use actor pattern for sockjs websocket handling

akka.event.slf4j.Slf4jLogger$$anonfun$receive$1 $anonfun$applyOrElse$1 Error in stage [play.sockjs.core.streams.CancellationSuppresser@37e0822a]: Cannot push port (SubSourceOutlet(CancellationSuppresserSubSource)) twice, or before it being pulled java.lang.IllegalArgumentException: Cannot push port (SubSourceOutlet(CancellationSuppresserSubSource)) twice, or before it being pulled at akka.stream.stage.GraphStageLogic$SubSourceOutlet.push(GraphStage.scala:1508) at play.sockjs.core.streams.CancellationSuppresser$$anon$1$$anon$4.onPush(CancellationSuppresser.scala:48) at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:523) at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:409) at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:606) at akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:485) at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:581) at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:749) at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$shortCircuitBatch(ActorGraphInterpreter.scala:739) at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:765) at akka.actor.Actor.aroundReceive(Actor.scala:539) at akka.actor.Actor.aroundReceive$(Actor.scala:537) at akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:671) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:614) at akka.actor.ActorCell.invoke(ActorCell.scala:583) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:268) at akka.dispatch.Mailbox.run(Mailbox.scala:229) at akka.dispatch.Mailbox.exec(Mailbox.scala:241) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

WebSocket idle timeout

A very handy feature is to be able to define a Idle Timeout on the Websocket

eg:
SockJSRouter.withWebSocket(true).withHeartbeat(20000).withIdletimeout(10*60);

Websocket message losses

After upgrading to Play2.5.x & play2-sockjs 0.5.0/0.5.1 I am seeing message losses.
SockJS setup

public SockJSSettings settings() {
        return  new SockJSSettings()
            .withWebsocket(true)
            .withHeartbeat(FiniteDuration.create(config.getInt(ConfigHelper.WEBSOCKET_HEARTBEAT), TimeUnit.MILLISECONDS))    
            .withStreamingQuota(4*1024);
    }

With v2.5. upgrade I can see sockjs is buffering multiple messages emitted by the linked Actor, hence I see larger array frames sent to the client
Eg an 'a' frame with 8 array elements with the size of 21846

these large wrapped frames misses messages, for example about 3 messages in the middle are missing, it should be a frame having 11 message elements. Not all wrapping frames misses messages but happens often enough.

From server logs I can see the actor is firing messages correctly to the sockjs router actor & from browser network tab can see the loss.

SockJS client is white listed only to use websocket transport

with v2.4 I see smaller frames of 4k with a single message frames. 2.4 is NO loss and very stable.

java.nio.channels.ClosedChannelException

I'm trying to replace my own sockjs implementation with yours (as it has a lot more attention).

So proxy (nginx) configuration is the same, and I do the same client-side and server-side processing.

What I faced is repeatedly broken and reconnected socket. That's the stacktrace:

    java.nio.channels.ClosedChannelException
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:433)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:128)
    at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:99)
    at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:36)
    at org.jboss.netty.channel.Channels.write(Channels.java:725)
    at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:71)
    at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59)
    at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.handleDownstream(HttpPipeliningHandler.java:106)
    at org.jboss.netty.channel.Channels.write(Channels.java:704)
    at org.jboss.netty.channel.Channels.write(Channels.java:671)
    at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:248)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$iteratee$1$1.apply(PlayDefaultUpstreamHandler.scala:351)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$play$core$server$netty$PlayDefaultUpstreamHandler$$iteratee$1$1.apply(PlayDefaultUpstreamHandler.scala:348)
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$16.apply(Iteratee.scala:503)
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$16.apply(Iteratee.scala:503)
    at scala.Function1$$anonfun$andThen$1.apply(Function1.scala:55)
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$16.apply(Iteratee.scala:503)
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$16.apply(Iteratee.scala:503)
    at play.api.libs.iteratee.Enumeratee$$anon$38$$anon$1$$anonfun$play$api$libs$iteratee$Enumeratee$$anon$$anon$$step$1$$anonfun$apply$12.apply(Enumeratee.scala:207)
    at play.api.libs.iteratee.Enumeratee$$anon$38$$anon$1$$anonfun$play$api$libs$iteratee$Enumeratee$$anon$$anon$$step$1$$anonfun$apply$12.apply(Enumeratee.scala:207)
    at scala.util.Success$$anonfun$map$1.apply(Try.scala:236)
    at scala.util.Try$.apply(Try.scala:191)
    at scala.util.Success.map(Try.scala:236)
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46)
    at scala.concurrent.impl.Future$.apply(Future.scala:31)
    at scala.concurrent.Future$.apply(Future.scala:492)
    at play.api.libs.iteratee.RunQueue.execute(RunQueue.scala:123)
    at play.api.libs.iteratee.RunQueue.schedule(RunQueue.scala:116)
    at play.api.libs.iteratee.RunQueue.schedule(RunQueue.scala:66)
    at play.api.libs.iteratee.RunQueue.scheduleSimple(RunQueue.scala:88)
    at play.api.libs.iteratee.Concurrent$$anon$6.schedule(Concurrent.scala:179)
    at play.api.libs.iteratee.Concurrent$$anon$6.end(Concurrent.scala:219)
    at play.sockjs.core.actors.SockJSActor$SockJSActorSupervisor$$anonfun$receive$2.applyOrElse(SockJSActor.scala:100)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
    at play.sockjs.core.actors.SockJSActor$SockJSActorSupervisor.aroundReceive(SockJSActor.scala:75)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.dungeon.DeathWatch$class.receivedTerminated(DeathWatch.scala:46)
    at akka.actor.ActorCell.receivedTerminated(ActorCell.scala:369)
    at akka.actor.ActorCell.autoReceiveMessage(ActorCell.scala:501)
    at akka.actor.ActorCell.invoke(ActorCell.scala:486)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

provide java api

as title.and provide an api by using actor would be nice too.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.