Git Product home page Git Product logo

cloudevents-player's Introduction

CloudEvents Player

Build amd64 arm64

It is an application that can send and receive CloudEvents. Its purpose is to be deployed on a Knative Eventing environment so that users can monitor received events in the Activity section and also send events of the desired type to see if it is being forwarded back to the application through the broker.

It supports both Structured and Binary content mode.

The application has a web interface in which you can define the events you want to send to the broker:

create event

On the right-hand side all the emitted and received events will be listed. In the image below there are two received and one emitted event.

activity

And you will also be able to display the payload of the event.

event

Running the container image

You can expect to have built container images in arm64 and amd64 architectures in quay.io/ruben/cloudevents-player:v1.3

Podman

podman run -p 8080:8080 -e PLAYER_MODE=LOCAL --rm quay.io/ruben/cloudevents-player:v1.3

Docker

docker run -p 8080:8080 -e PLAYER_MODE=LOCAL --rm quay.io/ruben/cloudevents-player:v1.3

Running the binary

First you will have to build the application. See the Build section for more details. Then you can start the application locally with the following command.

PLAYER_MODE=LOCAL ./target/cloudevents-player-1.3-SNAPSHOT-runner

Running on Kubernetes

Requirements

  • Knative serving
  • Knative eventing
  • kubectl
  • kn

Create the broker

Let's use the kn CLI to create an InMemoryChannel-backed Broker.

$ kn broker create example-broker
Broker 'example-broker' successfully created in namespace 'eventing-demo'.

Let's confirm the Broker is created and ready.

$ kn broker list                 
NAME             URL                                                                                AGE   CONDITIONS   READY   REASON
example-broker   http://broker-ingress.knative-eventing.svc.cluster.local/eventing-demo/example-broker   20s   6 OK / 6     True   

Create the Knative Service

If you have the kn cli available you can just create the broker with the CLI

$ kn service create cloudevents-player \
--image quay.io/ruben/cloudevents-player:latest

Creating service 'cloudevents-player' in namespace 'eventing-demo':

  0.224s Configuration "cloudevents-player" is waiting for a Revision to become ready.
  6.043s ...
  6.044s Ingress has not yet been reconciled.
  6.045s Waiting for load balancer to be ready
  6.248s Ready to serve.

Service 'cloudevents-player' created to latest revision 'cloudevents-player-00001' is available at URL:
https://cloudevents-player-eventing-demo.apps.example.com

Bind the service with the broker

It is possible to connect the Cloudevents Player with the broker in different ways.

  1. Create a SinkBinding. This is the easiest one and works for any type of broker. It injects the K_SINK environment variable into the Knative Service. The service is rolled out and starts using it for sending events.
kn source binding create ce-player-binding --subject "Service:serving.knative.dev/v1:cloudevents-player" --sink broker:example-broker
  1. Define the BROKER_NAME and BROKER_NAMESPACE environment variables to the Deployment, through the Service spec. The BROKER_URI is calculated from these values as http://broker-ingress.knative-eventing.svc.cluster.local/{broker_namespace}/{broker_name}. This option is only compatible with the In-Memory Broker.
## The BROKER_NAMESPACE env var is only required if the broker is in a different namespace

kn service update --env BROKER_NAME=example-broker --env BROKER_NAMESPACE=other-ns cloudevents-player
  1. Define the BROKER_URI. As a last resort you can manually define the BROKER_URI of the Broker. This will take precedence over any other variable.
kn service update --env BROKER_URI=http://other-ingress.other-ns.svc.cluster.local/foo/bar cloudevents-player

Try out the Service URL, you will be able to send events but your events will not be consumed by any service.

$ CLOUDEVENTS_URL=$(kn service describe cloudevents-player -o url)
$ curl -vk $CLOUDEVENTS_URL \
        -H "Content-Type: application/json" \
        -H "Ce-Id: 123456789" \
        -H "Ce-Specversion: 1.0" \
        -H "Ce-Type: some-type" \
        -H "Ce-Source: command-line" \
        -d '{"msg":"Hello CloudEvents!"}'

Create the Knative trigger

In order for the Cloudevents Player to subscribe to events from the broker you need to create a trigger

kn trigger create cloudevents-trigger --sink cloudevents-player  --broker example-broker                                             

Manual deployment

As an alternative, you can deploy the application manually by using the knative.yaml file

$ kubectl apply -n myproject -f deploy/knative.yaml
service.serving.knative.dev/cloudevents-player created
trigger.eventing.knative.dev/cloudevents-player created
sinkbinding.sources.knative.dev/ce-player-binding created
broker.eventing.knative.dev/example-broker created

The following resources are created:

  • InMemory Broker: The Broker that will receive and forward the events
  • Knative Service: Pointing to the image and mounting the volume from the configMap
  • SinkBinding: Binding the Knative service to the Broker
  • Trigger: To subscribe to any message in the Broker

Build

It is a Quarkus application with a React frontend. In order to build the application use any of the following alternatives:

JVM Build

Build

mvn clean package

Run

$ java -Dplayer.mode=LOCAL -jar target/quarkus-app/quarkus-run.jar
...
2022-06-24 18:39:07,794 INFO  [io.und.websockets] (main) UT026003: Adding annotated server endpoint class com.redhat.syseng.tools.cloudevents.resources.MessagesSocket for path /socket
2022-06-24 18:39:08,130 INFO  [io.qua.sma.ope.run.OpenApiRecorder] (main) Default CORS properties will be used, please use 'quarkus.http.cors' properties instead
2022-06-24 18:39:08,216 INFO  [io.quarkus] (main) cloudevents-player 1.3-SNAPSHOT on JVM (powered by Quarkus 2.16.1.Final) started in 0.879s. Listening on: http://0.0.0.0:8080
2022-06-24 18:39:08,217 INFO  [io.quarkus] (main) Profile prod activated. 
2022-06-24 18:39:08,217 INFO  [io.quarkus] (main) Installed features: [cdi, hibernate-validator, kubernetes-client, rest-client, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, smallrye-openapi, vertx, websockets, websockets-client] 

Quarkus dev mode

$ mvn quarkus:dev -Dplayer.mode=LOCAL
...
Listening for transport dt_socket at address: 5005
...
[INFO] --- quarkus-maven-plugin:1.0.1.Final:dev (default-cli) @ cloudevents-player ---
Listening for transport dt_socket at address: 5005
2022-06-24 18:51:43,172 INFO  [io.und.websockets] (Quarkus Main Thread) UT026003: Adding annotated server endpoint class com.redhat.syseng.tools.cloudevents.resources.MessagesSocket for path /socket

2022-06-24 18:51:43,229 WARN  [org.jbo.res.res.i18n] (Quarkus Main Thread) RESTEASY002155: Provider class io.cloudevents.http.restful.ws.CloudEventsProvider is already registered.  2nd registration is being ignored.
2022-06-24 18:51:43,513 INFO  [io.quarkus] (Quarkus Main Thread) cloudevents-player 1.3-SNAPSHOT on JVM (powered by Quarkus 2.16.1.Final) started in 2.543s. Listening on: http://localhost:8080
2022-06-24 18:51:43,514 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-06-24 18:51:43,515 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, hibernate-validator, kubernetes-client, rest-client-reactive, rest-client-reactive-jackson, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, smallrye-openapi, swagger-ui, vertx, websockets, websockets-client]

Native build

Build

mvn clean install -Pnative

Run

$ ./target/cloudevents-player-1.3-SNAPSHOT-runner -Dplayer.mode=LOCAL
...
2022-06-24 18:48:11,565 INFO  [io.quarkus] (main) cloudevents-player 1.3-SNAPSHOT native (powered by Quarkus 2.16.1.Final) started in 0.022s. Listening on: http://0.0.0.0:8080
2022-06-24 18:48:11,565 INFO  [io.quarkus] (main) Profile prod activated. 
2022-06-24 18:48:11,565 INFO  [io.quarkus] (main) Installed features: [cdi, hibernate-validator, kubernetes-client, rest-client-reactive, rest-client-reactive-jackson, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, smallrye-openapi, swagger-ui, vertx, websockets, websockets-client]
2022-06-24 18:48:17,028 INFO  [com.git.rur.clo.ser.MessageService] (ForkJoinPool.commonPool-worker-3) Player mode LOCAL - broker: http://localhost:8080/

Skip frontend build

The skipFrontend profile will not run npm commands. Useful when you are just changing Java code.

mvn clean package -PskipFrontend

Build the container image

mvn clean package -Dcontainer -Dquarkus.native.container-build=true

Configuration

The Cloudevents Player can be configured by:

  • System properties. Usually in lower case and separated by dots e.g. player.mode
  • Environment variables. In upper case and separated by underscores e.g. PLAYER_MODE

These are the configuration options provided in the Cloudevents Player.

  • PLAYER_MODE
  • BROKER_URI
  • BROKER_NAME
  • BROKER_NAMESPACE

In the KNATIVE mode it will also look for the K_SINK environment variable injected after defining a SinkBinding.

For more configuration options refer to the Quarkus documentation

Player Mode

Cloudevents Player comes with 2 modes defined in the PLAYER_MODE environment variable:

  • LOCAL: Received events are forwarded to the loopback broker. This mode is just for development and testing
  • KNATIVE (default): The application will get the current namespace it is running in and will use the BROKER_NAME environment variable to decide which broker to connect to (default is the default broker).
# Local Mode
# system property
./target/cloudevents-player-1.3-SNAPSHOT-runner -Dplayer.mode=LOCAL

# environment variable
PLAYER_MODE=LOCAL ./target/cloudevents-player-1.3-SNAPSHOT-runner

# Knative Mode
# system property
./target/cloudevents-player-1.3-SNAPSHOT-runner -Dplayer.mode=KNATIVE

# environment variable
PLAYER_MODE=KNATIVE ./target/cloudevents-player-1.3-SNAPSHOT-runner

Broker URI

Sets the BROKER_URI where the messages will be sent to. It will always be localhost:8080 for LOCAL mode. Overrides the name and namespace properties.

# with a system property
./target/cloudevents-player-1.3-SNAPSHOT-runner -Dbroker.uri=http://some-broker:1234

# or using an environment variable
BROKER_URI=http://some-broker:1234 ./target/cloudevents-player-1.3-SNAPSHOT-runner

Broker Name and Namespace

Define the broker name and namespace to guess the broker URI. The default broker name is default and the default namespace will be the current namespace.

# system property
./target/cloudevents-player-1.3-SNAPSHOT-runner -Dbroker.name=example -Dbroker.namespace=other
...
2022-06-24 19:08:53,681 INFO  [com.git.rur.clo.ser.MessageService] (ForkJoinPool.commonPool-worker-3) Player mode KNATIVE - broker: http://broker-ingress.knative-eventing.svc.cluster.local/other/example

# environment variable
BROKER_NAME=example BROKER_NAMESPACE=other ./target/cloudevents-player-1.3-SNAPSHOT-runner
...
2022-06-24 19:08:53,681 INFO  [com.git.rur.clo.ser.MessageService] (ForkJoinPool.commonPool-worker-3) Player mode KNATIVE - broker: http://broker-ingress.knative-eventing.svc.cluster.local/other/example

CORS

By default the cloudevents player will allow all origins but it is possible to defined the allowed origins with the following environment variable:

  - name: QUARKUS_HTTP_CORS_ORIGINS
    value: https://cloudevents-player-myns.apps.example.com

See the Quarkus CORS documentation for more configuration parameters.

cloudevents-player's People

Contributors

evankanderson avatar mvazquezc avatar ruromero avatar snyk-bot avatar tqvarnst 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

Watchers

 avatar  avatar  avatar

cloudevents-player's Issues

Can't send cloudevents to knative broker type of MTChannelBasedBroker

I deployed Knative v0.25.0 with Istio 1.11.2 gateway and network layer, and use kn to create service. I found error in istio-proxy log with status code 400, and in mt broker log, there is a warning on datacontenttype context attribute can't be parsed properly. And I read the code of the broker, with the warning, it'll return 400 and reject the event.

How to fix this?

Page fails over HTTPS endpoint

Page cannot load when the page is exposed through a TLS route and the WS endpoint is not secured

The page at https://cloudevents-player.apps.example.com/ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://cloudevents-player.apps.example.com'. This request has been blocked; this endpoint must be available over WSS.

Enhance broker integration

The BROKER_NAME and BROKER_NAMESPACE generates a BROKER_URI http://broker-ingress.knative-eventing.svc.cluster.local/<namespace>/<name> but this only works for the InMemoryChannel-Broker.

The Kafka broker uses the kafka-broker-ingress service making this configuration option unusable.

Besides, during deployment it requires an extra step to fetch the BROKER_URI from the broker and set it to the deployment.

For that reason it would be good to leverage the SinkBinding custom resource for such integration. The SinkBinding injects a K_SINK environment variable with the broker endpoint to the deployment. That solution will also allow to simplify the Knative Service definition by removing all the environment variables.

RESTEASY002020: Unhandled asynchronous exception, sending back 500: java.lang.NullPointerException

After running for some time, cludevents-player UI stops working.
The error that is visible in the browser console is the following:

Screenshot 2023-03-01 at 15 36 31

When I check the pod logs, I can see it is full of the following errors:

2023-03-01 14:34:50,799 ERROR [org.jbo.res.res.i18n] (ForkJoinPool.commonPool-worker-9) RESTEASY002020: Unhandled asynchronous exception, sending back 500: java.lang.NullPointerException
	at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
	at java.util.TimSort.sort(TimSort.java:234)
	at java.util.Arrays.sort(Arrays.java:1515)
	at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:353)
	at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:503)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
	at com.redhat.syseng.tools.cloudevents.service.MessageService.newEvent(MessageService.java:46)
	at com.redhat.syseng.tools.cloudevents.service.MessageService.receive(MessageService.java:39)
	at com.redhat.syseng.tools.cloudevents.service.MessageService_ClientProxy.receive(MessageService_ClientProxy.zig:213)
	at com.redhat.syseng.tools.cloudevents.resources.MessageReceiverResource.lambda$receive$0(MessageReceiverResource.java:45)
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
	at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1692)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
	at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:497)
	at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)

I am attaching the full log here:
cloudevents-player.log

UI fails with HTTP 403

Running version 1.3 from main branch, in Knative mode.
The console fails with errors like:

POST https://cloudevents-player-dmartino-kafka.apps.ocp-dev01.lab.eng.tlv2.redhat.com/messages net::ERR_ABORTED 403 (Forbidden)

On the same environment, no issues with previous version v1.1 (v1.2 instead is affected by the same problem)

Rename packages

Rename all packages and artifacts to com.github.ruromero.cloudeventsplayer

possible to support ARM images?

I try to learn it using minikube@Mac M1, but the image doesn't exist and I tried to rebuild

$ podman build -t quay.io/ruben/cloudevents-player:latest -f src/main/docker/Dockerfile.native .
STEP 1/6: FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3
Trying to pull registry.access.redhat.com/ubi8/ubi-minimal:8.3...
Getting image source signatures
Checking if image destination supports signatures
Copying blob sha256:56a04d997355c19a50990df9442628967dba3293799b2c058e9e6feae7c00e91
Copying blob sha256:9f2d1a2655b9b1c4e7a454a14b61d91972c2d9c6b5936eca839a994cf6483017
Copying config sha256:161b5eee3a1af34f1f9432ca11debf7abef432824a12418508256c38d1de18fa
Writing manifest to image destination
Storing signatures
STEP 2/6: WORKDIR /work/
--> 0db0961f608
STEP 3/6: COPY target/*-runner /work/application
Error: building at STEP "COPY target/*-runner /work/application": checking on sources under "/var/tmp/libpod_builder2131162895/build": Rel: can't make  relative to /var/tmp/libpod_builder2131162895/build; copier: stat: ["/target/*-runner"]: no such file or directory

Possible to provide arm image or fix dockerfile for it?

Update documentation

The documentation is not up to date with the new packages, versions and references to event content types capabilities.

It would be good to add some badges to show the current build and container statuses

Duplicated media type (concatenated with ",")

I see the following message being posted from the most recent build (12 hours ago):

"root":{
  "attributes":{
    "datacontenttype":string"application/json",
    "id":string"test",
    "mediaType":string"application/json",
    "source":string"knative.dev/test",
    "specversion":string"0.3",
    "type":string"test.testing",
  },
  "data":{
    "message":string"Hello CloudEvents!",
  },
  "extensions":{},
}

Which leads to the following server-side error:

2019-11-18 04:53:10,387 WARN [org.jbo.res.res.i18n] (executor-thread-21) RESTEASY002130: Failed to parse request.: java.lang.IllegalArgumentException: RESTEASY003340: Failure parsing MediaType string: application/json,application/json
at org.jboss.resteasy.plugins.delegates.MediaTypeHeaderDelegate.internalParse(MediaTypeHeaderDelegate.java:113)
at org.jboss.resteasy.plugins.delegates.MediaTypeHeaderDelegate.parse(MediaTypeHeaderDelegate.java:64)
at org.jboss.resteasy.plugins.delegates.MediaTypeHeaderDelegate.fromString(MediaTypeHeaderDelegate.java:29)
at javax.ws.rs.core.MediaType.valueOf(MediaType.java:172)
at org.jboss.resteasy.specimpl.ResteasyHttpHeaders.getMediaType(ResteasyHttpHeaders.java:151)
at org.jboss.resteasy.specimpl.ResteasyHttpHeaders.testParsing(ResteasyHttpHeaders.java:69)
at org.jboss.resteasy.plugins.server.servlet.ServletUtil.extractHttpHeaders(ServletUtil.java:59)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:226)
at io.quarkus.resteasy.runtime.ResteasyFilter.doFilter(ResteasyFilter.java:30)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:160)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:63)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:133)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:65)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:270)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:59)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:116)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:113)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$9$1$1.call(UndertowDeploymentRecorder.java:469)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:250)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:59)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:82)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:290)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:669)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1426)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at java.lang.Thread.run(Thread.java:748)
at org.jboss.threads.JBossThread.run(JBossThread.java:479)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)

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.