Pure Java ZeroMQ

Related tags

Messaging jeromq
Overview

JeroMQ

Pure Java implementation of libzmq (http://zeromq.org).

CircleCI Quality Gate Status Coverage Status Maven Central Javadocs

Features

  • Based on libzmq 4.1.7.

  • ZMTP/3.0 (http://rfc.zeromq.org/spec:23).

  • tcp:// protocol and inproc:// is compatible with zeromq.

  • ipc:// protocol works only between jeromq (uses tcp://127.0.0.1:port internally).

  • Securities

  • Performance that's not too bad, compared to native libzmq.

  • Exactly same developer experience with zeromq and jzmq.

Unsupported

  • ipc:// protocol with zeromq. Java doesn't support UNIX domain socket.

  • pgm:// protocol. Cannot find a pgm Java implementation.

  • norm:// protocol. Cannot find a Java implementation.

  • tipc:// protocol. Cannot find a Java implementation.

  • GSSAPI mechanism is not yet implemented.

  • TCP KeepAlive Count, Idle, Interval cannot be set via Java but as OS level.

  • Interrupting threads is still unsupported: library is NOT Thread.interrupt safe.

Contributing

Contributions welcome! See CONTRIBUTING.md for details about the contribution process and useful development tasks.

Usage

Maven

Add it to your Maven project's pom.xml:

    <dependency>
      <groupId>org.zeromq</groupId>
      <artifactId>jeromq</artifactId>
      <version>0.5.2</version>
    </dependency>

    <!-- for the latest SNAPSHOT -->
    <dependency>
      <groupId>org.zeromq</groupId>
      <artifactId>jeromq</artifactId>
      <version>0.5.3-SNAPSHOT</version>
    </dependency>

    <!-- If you can't find the latest snapshot -->
    <repositories>
      <repository>
        <id>sonatype-nexus-snapshots</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
          <enabled>false</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
       </repository>
    </repositories>

Ant

To generate an ant build file from pom.xml, issue the following command:

mvn ant:ant

Getting started

Simple example

Here is how you might implement a server that prints the messages it receives and responds to them with "Hello, world!":

import org.zeromq.SocketType;
import org.zeromq.ZMQ;
import org.zeromq.ZContext;

public class hwserver
{
    public static void main(String[] args) throws Exception
    {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.REP);
            socket.bind("tcp://*:5555");

            while (!Thread.currentThread().isInterrupted()) {
                // Block until a message is received
                byte[] reply = socket.recv(0);

                // Print the message
                System.out.println(
                    "Received: [" + new String(reply, ZMQ.CHARSET) + "]"
                );

                // Send a response
                String response = "Hello, world!";
                socket.send(response.getBytes(ZMQ.CHARSET), 0);
            }
        }
    }
}

More examples

The JeroMQ translations of the zguide examples are a good reference for recommended usage.

Documentation

For API-level documentation, see the Javadocs.

This repo also has a doc folder, which contains assorted "how to do X" guides and other useful information about various topics related to using JeroMQ.

License

All source files are copyright © 2007-2020 contributors as noted in the AUTHORS file.

Free use of this software is granted under the terms of the Mozilla Public License 2.0. For details see the file LICENSE included with the JeroMQ distribution.

Comments
  • Problem: JeroMQ still uses LGPL license

    Problem: JeroMQ still uses LGPL license

    Solution: migrate to MPLv2, as explained here http://zeromq.org/area:licensing

    • [x] @trevorbernard
    • [x] @miniway
    • [x] @markif
    • [x] @fernandezpablo85
    • [x] @sjohnr
    • [x] @davipt
    • [x] @ealgell
    • [x] @HeinrichHartmann
    • [x] @capacman
    • [x] @crocket
    • [x] @ipechorin
    • [x] @nicholassm
    • [x] @msteinhoff
    • [x] @markrileybot
    • [x] @sbanacho
    • [x] @kevinkreiser
    • [x] @ifesdjeen
    • [x] @hintjens
    • [x] @vsg
    • [x] @cbusbey
    • [ ] @imleon
    • [x] @kcarlson
    • [ ] @kedzie
    • [ ] @cossin
    • [x] @devinrsmith
    • [x] @pavelbucek
    • [x] @yebenes
    • [x] @zh217
    • [x] @arashthearcher
    • [x] @gsnewmark
    • [x] @baboune

    Could you kindly reply

    I hereby agree to publish my contributions to JeroMQ under the MPLv2 license

    ?

    If you have any objection to relicensing your contributions, let us know the reasons. Thanks!

    opened by c-rack 61
  • PUB - SUB sockets randomly stop working?

    PUB - SUB sockets randomly stop working?

    Hello,

    We are using ZMQ for our server (reactphp/zmq) and our client (zeromq/jeromq). We run multiple instances of the server and each server has several clients connecting to it. We use several other sockets but we are facing an issue with the TCP communication between the PUB socket on the server and the SUB ones on the clients. The issue is very odd as it is not easy to replicate but from time to time the client stops receiving messages from the server. This happens on all of our server instances and their clients once every 2-3 months but we have a new server instance that replicates this issue in around 20 - 30 minutes. Our servers are "identical" and this points us to a network difference.

    We made a simple app that just opens several threads with SUB sockets and listen on the same topic. They all fail eventually but we observed that not all of them fail at the same time. Also, restarting a client solves the issue so we think that the issue is most likely with the client. The server logs indicate that the send is called on the PUB socket and the listening thread is still running on the client calling recvStr on the SUB socket once every several seconds. This points us to a ZMQ issue but we don't know it for sure.

    In any case, right now we are looking into the jeromq implementation but we are wondering if anyone else experienced something like this and maybe has some pointers.

    Thank you.

    opened by vreascul 26
  • ZMQ messages not arriving at destination

    ZMQ messages not arriving at destination

    Hi Guys,

    We have a very strange and critical problem that I need your help! The scenario is that we send a message in client application and for some reason, it didn't arrive to the server application.

    • We use version 0.4.3
    • In the client application, we use DEALER socket (TCP)
    • In the server application, we have a ROUTER socket and Reactor thread that catches the incoming events.
    • In the client application we have one Zcontext and each thread that sends a message from the client creates a shadow socket, creates the DEALER socket, send the message to the server and waits 5 sec for ACK message from the server.

    Part of the client code: ZMsg msg = createMessage() ; msg.send(socket); socket.setReceiveTimeOut(5000); response = socket.recvStr(); In case that we didn't get answer from the server, we assume that there is a network / load issues on the server. BUT in our case! we don't see the message in the server side at all!

    We have some traffic captures and I need your help in order to understand the problem. In a good scenario, we see that the client push data to server: C->S [SYN] S->C [SYN, ACK] C->S [ACK] C->S [PSH, ACK] S->C [ACK] S-C [PSH, ACK] C->S [ACK] C->S [PSH, ACK ... In a bad scenario, which we don't see traffic in the server and not getting ACK message in the client: C->S [SYN] S->C [SYN, ACK] C->S [ACK] S-C [PSH, ACK] C->S [ACK] C->S [RST, ACK] The reset from the client is after the timeout of 5 min.. that we didn't get ACK response. Then, we close the socket in the client with linger 0

    Can you please help? What can be the reason that the messages don't arrive to the server ?

    Thanks! Kobi.

    opened by kmualem 24
  • Enforce code resilience and usage

    Enforce code resilience and usage

    These last weeks, bugs impacting major features were fixed.

    The big thing for me is that these ultra important major features were absolutely never tested: downgrading capabilities, socket reconnection, Android compatibility. I take the responsibilities of my mistakes, and I would like to go forward on that matter and be constructive about it.

    I propose to enforce testing scenarii so no commit will provoke a regression of that level.

    • Downgrading capabilities: We can always introduce some option to force protocol version usage, that will allow to test protocol compatibilities within Jeromq. Not the best, but still a step forward. I would prefer environments set with different versions of libzmq, so testing can connect and exchange messages with them.

    • Socket reconnection: I have currently no idea how we can test that at end-to-end level. Any suggestion would be welcome.

    • Android compatibility Right now the code is compatible with Android API level 10. The thing is that JDKs are not fully implemented depending on the versions (some classes, some methods are missing depending on this level). Is it possible to setup Travis so we can at least run a compilation of the project on Android environment (distribution of devices is here)?

    opened by fredoboulo 23
  • Spinning in Reaper Thread

    Spinning in Reaper Thread

    Hi - The code seems like it can spin in the reaper thread:

    "reaper-1" prio=10 tid=0x00002aaab8c1d800 nid=0x18f3 runnable [0x00000000497e1000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.NativeThread.current(Native Method) at sun.nio.ch.SourceChannelImpl.read(SourceChannelImpl.java:166)

    • locked <0x00000000c3a0c3f8> (a java.lang.Object) at zmq.Signaler.recv(Signaler.java:160) at zmq.Mailbox.recv(Mailbox.java:107) at zmq.SocketBase.process_commands(SocketBase.java:799) at zmq.SocketBase.in_event(SocketBase.java:907) at zmq.Poller.run(Poller.java:231) at java.lang.Thread.run(Thread.java:722)

    We have found it goto 100% CPU. Seems like the channel is non blocking and it runs in a tight loop and therefore spins.

    Has anyone else seen this?

    opened by cwolfinger 23
  • Avoid using system time to measure elapsed time

    Avoid using system time to measure elapsed time

    I ran into a situation today where Poller#poll was blocked for a long time even though a timeout value of 1 second had been passed to poll. I attached a debugger and captured the state displayed in the attached screenshot. As you can see waitMillis has a value of just over an hour even though timeout is set to 1000.

    This can happen because poll uses currentTimeMillis values to measure elapsed time without taking into account that the system clock may be changed in the meantime.

    To avoid this I've updated poll to use nanoTime instead. This way elapsed time is measured correctly regardless of system time changes.

    screen shot 2017-12-20 at 12 08 12

    opened by pepijnve 22
  • client can not pull message which is pushed from server randomly

    client can not pull message which is pushed from server randomly

    We have a router which is using jeromq 0.3.5. It hasn't any business logic and only take charge of message routing(receive a message from upstream system(uss) and send it to downstream system(dss)). All our other business systems(clients) connect to the router(server) by using PUSH-PULL mode. The problem happens randomly as follows:

    1. router can't receive message from uss
    2. dss can't receive message from router All the problems can be fixed by restarting uss、dss and router.But we don't figure it out so far.

    p.s.

    1. We haven't used heartbeat in uss、dss and router
    2. Our OS is CentOS release 6.5
    3. SO_KEEPALIVE OPTION net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75
    opened by rogue2yjg 21
  • Very slow to bind IPC socket

    Very slow to bind IPC socket

    I'm using a PUB/SUB scheme to transport some data on an Android device and have it set up to use IPC. When bind is called it takes 10 seconds to complete the call every time. If I change it to use TCP, it binds immediately. I'd prefer using IPC, but the penalty seems highly unacceptable.

    old issue - possibly resolved 
    opened by billchurch76 21
  • Too many open files

    Too many open files

    I am having this issue after some hours of good working:

    zmq.ZError$IOException: java.io.IOException: Too many open files at zmq.Signaler.make_fdpair(Signaler.java:87) at zmq.Signaler.(Signaler.java:48) at zmq.Mailbox.(Mailbox.java:55) at zmq.Ctx.(Ctx.java:127) at zmq.ZMQ.zmq_ctx_new(ZMQ.java:225) at zmq.ZMQ.zmq_init(ZMQ.java:258) at org.jeromq.ZMQ$Context.(ZMQ.java:173) at org.jeromq.ZMQ.context(ZMQ.java:155) at ... (my files ) at java.lang.Thread.run(Thread.java:744) Caused by: java.io.IOException: Too many open files at sun.nio.ch.IOUtil.makePipe(Native Method) at sun.nio.ch.PipeImpl.(PipeImpl.java:42) at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:50) at java.nio.channels.Pipe.open(Pipe.java:150) at zmq.Signaler.make_fdpair(Signaler.java:85) ... 11 more]]

    I am running this java server in Glassfish. I don't know if it is my fault or I should ask to system admin to check glassfish instance.

    My ZMQ code:

                ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket sender = context.socket(ZMQ.PUSH);
        sender.connect("tcp://127.0.0.1:8083");
        sender.send(device, ZMQ.SNDMORE);
        sender.send("obs", ZMQ.SNDMORE);
        sender.send("["+message+"]", 0);
        sender.close();
            context.term(); 
    

    I have this code inside a class created in a background thread. Each time I get a post to the server, I call new thread and create an instance of this class.

    opened by Biribu 20
  • Runtime Exception w/ Java 8 Lambas in Android

    Runtime Exception w/ Java 8 Lambas in Android

    I did a build from the latest master snapshot on Github, and ran into this error when receiving data on the REP socket.

    I/art: Rejecting re-init on previously-failed class java.lang.Class<zmq.io.StreamEngine$ProducePongMessage>
        Rejecting re-init on previously-failed class java.lang.Class<zmq.io.StreamEngine$ProducePongMessage>
    I/art: Rejecting re-init on previously-failed class java.lang.Class<zmq.io.-$$Lambda$StreamEngine$W0Gv5o5INYywwEmQ5W1uv6x5Tgw>
    E/AndroidRuntime: FATAL EXCEPTION: iothread-2
        Process: com.ravn.havoc, PID: 21413
        java.lang.NoClassDefFoundError: zmq.io.-$$Lambda$StreamEngine$W0Gv5o5INYywwEmQ5W1uv6x5Tgw
            at zmq.io.StreamEngine.<init>(StreamEngine.java:865)
            at zmq.io.net.tcp.TcpConnecter.connectEvent(TcpConnecter.java:149)
            at zmq.io.IOObject.connectEvent(IOObject.java:99)
            at zmq.poll.Poller.run(Poller.java:267)
            at java.lang.Thread.run(Thread.java:818)
    

    The stack references these lines in StreamEngine.java:

        private final Function<Msg, Boolean> processIdentity = this::processIdentityMsg;
        private final Supplier<Msg>          nextIdentity    = this::identityMsg;
    

    Its not clear to me why this is throwing the error...

    opened by kylemallory 19
  • ZMQ.REQ regression since 0.4.0

    ZMQ.REQ regression since 0.4.0

    I am writing a library that communicates with the ZeroMQ server of OpenNMT. This code works using 0.3.6, but hangs on the receiving using any 0.4.x branch.

        public OpenNMTZeroMQClient(String host, int port) {
            this.context = ZMQ.context(2);
            this.socket = context.socket(ZMQ.REQ);
            String hostAddress = "tcp://" + host + ":" + port;
            LOG.info("Connecting to '{}'", hostAddress);
            socket.connect(hostAddress);
        }
    
    
        public void translate(String text) {
            String js = new JSONArray()
                    .put(new JSONObject()
                            .put("src", text))
                    .toString();
            LOG.info("Sending '{}'...", js);
            boolean wasSent = socket.send(js.getBytes(ZMQ.CHARSET), 0);
            if(wasSent) {
                LOG.info("Sent!");
            }
            LOG.info("Receiving...");
            String reply = socket.recvStr();
            LOG.info("Received: '{}'", reply);
        }
    
        public void close() {
            if(this.socket != null) {
                this.socket.close();
            }
            if(this.context != null) {
                this.context.term();
            }
        }
    

    It doesn't actually fail, but it just hangs on the recv() call. The server didn't receive anything, so the problem is probably that the send never happened.

    EDIT: code formatting

    opened by zezke 19
  • Socket#connect hangs for ever on wrong host/port

    Socket#connect hangs for ever on wrong host/port

    Consider this code:

    try (ZContext zContext = new ZContext(); ZMQ.Socket client = zContext.createSocket(SocketType.REQ)) {
                client.setLinger(0);
                client.setSendTimeOut(0);
                client.setReceiveTimeOut(0);
    
                client.setImmediate(false);
    
                client.connect("tcp://" + host + ":" + port);
    

    The connect call blocks the thread for ever if host is for example 223232 and port 22323 (something that doesn't make sense). For my application the host and port rely on user input so that is a problem. Can that be somehow avoided from happening?

    opened by patri9ck 0
  • xSub socket subscription throws IllegalArgumentException

    xSub socket subscription throws IllegalArgumentException

    My system has a broker with two sockets, one xPub and one xSub. When I try to subscribe the xSub socket to all topics I get an IllegalArgumentException with the error message Unknown Option 6. It looks like that the subscription command is internally mapped to the number 6. But there is no switch case option that handles the number 6.

    ZMQ.Socket xSubSocket = context.createSocket(SocketType.XSUB);
    xSubSocket.bind(X_SUB_ADDRESS);
    xSubSocket.subscribe(""); // subscribe to all
    
    Exception in thread "main" java.lang.IllegalArgumentException: Unknown Option 6
    	at zmq.Options.setSocketOpt(Options.java:547)
    	at zmq.SocketBase.setSocketOpt(SocketBase.java:234)
    	at org.zeromq.ZMQ$Socket.setSocketOpt(ZMQ.java:910)
    	at org.zeromq.ZMQ$Socket.subscribe(ZMQ.java:2113)
    

    What's the recommended way to handle this?

    opened by komape 1
  • why pub socket does not reconnect

    why pub socket does not reconnect

    Pub socket and Sub socket lose connection at the same time, but SUB will reconnect, pub does not reconnect, Sub socket can receive messages, but others cannot receive the messages my Pub socket send.

    			ZContext context = new ZContext();
    
    			ZMQ.Socket publisher = this.context.createSocket(SocketType.PUB);
    
    			publisher.setTCPKeepAlive(1);
    			publisher.setTCPKeepAliveIdle(20);
    			publisher.setTCPKeepAliveInterval(10);
    			publisher.setHeartbeatIvl(2*1000);
    			publisher.setHeartbeatTimeout(5*1000);
    			publisher.setHeartbeatTtl(10*1000);
    			publisher.setReconnectIVLMax(2000);
    			publisher.setReconnectIVL(3*1000);
    			publisher.setReconnectIVLMax(10*1000);
    
    			publisher.connect(this.pubURL);
    
    opened by huogan 1
  • The receive queue of subscriber socket is getting full

    The receive queue of subscriber socket is getting full

    We have one publisher and two subscriber applications utilizing ZeroMQ's Pub-Sub pattern without implementing any heartbeat mechanism.

    One application is running on (10.159.251.23) that publishes messages on port 6666: publisher.publisherSocket = zContext.createSocket(SocketType.PUB); publisher.publisherSocket.bind("tcp://*:6666");

    And on the same host (10.159.251.23) another application is running that subscribes to this port 6666: subscriberSocket = zContext.createSocket(SocketType.SUB); subscriberSocket.subscribe("API-PROXY.INITIATOR.RES"); subscriberSocket.connect("10.159.251.23:6666");

    Additionally, there's a different host (10.159.251.22) running the same subscriber application that subscribes to this publisher application on host 10.159.251.23:6666

    The subscriber application on both hosts has been running since last 7 days. However on running netstat -an we see that the receive queue of the subscriber application running on (10.159.251.23) is full: [kaushx@mslt4wct8080 ~]$ netstat -an | grep 6666 tcp6 0 0 :::6666 :::* LISTEN tcp6 0 0 10.159.251.23:52440 10.159.251.22:6666 ESTABLISHED tcp6 0 2588034 10.159.251.23:6666 10.159.251.23:50172 ESTABLISHED tcp6 4196046 0 10.159.251.23:50172 10.159.251.23:6666 ESTABLISHED tcp6 0 0 10.159.251.23:44368 10.159.251.22:6666 ESTABLISHED tcp6 0 0 10.159.251.23:6666 10.159.251.22:45164 ESTABLISHED tcp6 0 0 10.159.251.23:44148 10.159.251.22:6666 ESTABLISHED tcp6 0 0 10.159.251.23:6666 10.159.251.22:45166 ESTABLISHED

    This issue keeps occurring every few weeks which get resolved only on re-starting the subscriber application. Do you have any ideas what might be going wrong? Is there any way to clear the receive queue on reaching some threshold? We're using jeromq-0.5.1

    opened by kaushik-shrestha 0
Owner
The ZeroMQ project
The ZeroMQ project
A modular and portable open source XMPP client library written in Java for Android and Java (SE) VMs

Smack About Smack is an open source, highly modular, easy to use, XMPP client library written in Java for Java SE compatible JVMs and Android. A pure

Ignite Realtime 2.3k Dec 28, 2022
Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.

EventBus EventBus is a publish/subscribe event bus for Android and Java. EventBus... simplifies the communication between components decouples event s

Markus Junginger 24.2k Jan 3, 2023
RabbitMQ Java client

RabbitMQ Java Client This repository contains source code of the RabbitMQ Java client. The client is maintained by the RabbitMQ team at Pivotal. Depen

RabbitMQ 1.1k Jan 7, 2023
Java client for NATS

NATS - Java Client A Java client for the NATS messaging system. A Note on Versions This is version 2.x of the java-nats library. This version is a gro

NATS - The Cloud Native Messaging System 454 Jan 4, 2023
A mod for Fabric that ports Bedrock Edition mechanics to Java Edition. 1.16.x

bedrock-mechanics A mod for Fabric that ports Bedrock Edition mechanics to Java Edition. The controller support should be working on any controller by

Pedro Henrique 6 Oct 24, 2021
KC4Streams - a simple Java library that provides utility classes and standard implementations for most of the Kafka Streams pluggable interfaces

KC4Streams (which stands for Kafka Commons for Streams) is a simple Java library that provides utility classes and standard implementations for most of the Kafka Streams pluggable interfaces.

StreamThoughts 2 Mar 2, 2022
Kafka example - a simple producer and consumer for kafka using spring boot + java

Kafka example - a simple producer and consumer for kafka using spring boot + java

arturcampos 1 Feb 18, 2022
Java binding for ZeroMQ

What is JZMQ? This is the Java language binding for libzmq (aka ZeroMQ, 0MQ). The latest javadocs. Building and Installing JZMQ To build you need to h

The ZeroMQ project 577 Dec 11, 2022
Microserver is a Java 8 native, zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. Supporting pure Microservice or Micro-monolith styles.

Microserver A convenient modular engine for Microservices. Microserver plugins offer seamless integration with Spring (core), Jersey, Guava, Tomcat, G

AOL 936 Dec 19, 2022
Microserver is a Java 8 native, zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. Supporting pure Microservice or Micro-monolith styles.

Microserver is a Java 8 native, zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. Supporting pure Microservice or Micro-monolith styles.

AOL 936 Dec 19, 2022
ASCII renderer in pure java with no external dependencies

Java ASCII Render ASCII renderer in pure java with no external dependencies. Java ASCII Render supports graphical primitives/elements, layers, context

David E. Veliev 140 Dec 12, 2022
A lightweight, simple FTP server. Pure Java, no dependencies.

MinimalFTP A lightweight, simple FTP server. Pure Java, no libraries. Features Although it's named "minimal", it supports a bunch of features: 100% Ja

Guilherme Chaguri 131 Jan 5, 2023
XML/XHTML and CSS 2.1 renderer in pure Java

Flying Saucer OVERVIEW Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML) using CSS 2.1 for layout and formatting

null 1.8k Jan 2, 2023
A pure-Java Markdown processor based on a parboiled PEG parser supporting a number of extensions

:>>> DEPRECATION NOTE <<<: Although still one of the most popular Markdown parsing libraries for the JVM, pegdown has reached its end of life. The pro

Mathias 1.3k Nov 24, 2022
A JSON Schema validation implementation in pure Java, which aims for correctness and performance, in that order

Read me first The current version of this project is licensed under both LGPLv3 (or later) and ASL 2.0. The old version (2.0.x) was licensed under LGP

Java Json Tools 1.5k Jan 4, 2023
JGit An implementation of the Git version control system in pure Java.

JGit can be imported straight into Eclipse and built and tested from there. It can be built from the command line using Maven or Bazel. The CI builds use Maven and run on Jenkins.

Eclipse Foundation 1k Jul 5, 2021
Telegram API Client and Telegram BOT API Library and Framework in Pure java.

Javagram Telegram API Client and Telegram Bot API library and framework in pure Java. Hello Telegram You can use Javagram for both Telegram API Client

Java For Everything 3 Oct 17, 2021
An embedded database implemented in pure java based on bitcask which is a log-structured hash table for K/V Data.

Baka Db An embedded database implemented in pure java based on bitcask which is a log-structured hash table for K/V Data. Usage import cn.ryoii.baka.B

ryoii 3 Dec 20, 2021
Pure Java implementation of ONCRPC/SUNRPC

ONCRPC4J This is a part of dCache.ORG's NFSv4.1 work. Technically, this is not a fork of Remote Tea RPC library, but formally it is as we was inspired

dCache Project 26 Oct 27, 2022
Pure Java NFSv3 and NFSv4.1 implementation

NFS4J The pure java implementation of NFS server version 3, 4.0 and 4.1 including pNFS extension with nfs4.1-files and flex-files layout types. Buildi

dCache Project 189 Dec 13, 2022