Giter Club home page Giter Club logo

heartbeat-coroutines's Introduction

라이브러리 유지보수가 힘들어서 디스코드 채널을 만들었습니다. https://discord.gg/xgfTA8DP8H

libraries

io.github.monun.tap-api Maven Central

io.github.monun.kommand-api Maven Central

io.github.monun.invfx-api Maven Central

io.github.monun.heartbeat-coroutines Maven Central

heartbeat-coroutines's People

Contributors

dayo05 avatar dytroc avatar monun avatar sul0 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

Watchers

 avatar  avatar

heartbeat-coroutines's Issues

Paper 1.19 이상에서 에러가 발생합니다.

버전 & 환경

  • OS : Arch Linux x86_64 (6.4.8-arch1-1)
  • IDE : IntelliJ IDEA Ultimate 2023.1.3
  • JDK : openjdk 20.0.2

버그 내용

코드는 아래와 같습니다. (예제 코드와 거의 같습니다.)

override fun onEnable() {
        HeartbeatScope().launch {
            val suspension = Suspension()
            suspension.delay(3000L)
            logger.info("Hello")
        }
    }

Gradle은 아래와 같고 ShadowJar로 빌드했습니다.

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.9.0'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

group = 'space.zlfn'
version = '0.1'

repositories {
    mavenCentral()
    maven {
        name = "papermc-repo"
        url = "https://repo.papermc.io/repository/maven-public/"
    }
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/groups/public/"
    }
}

dependencies {
    compileOnly "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
    implementation("io.github.monun:heartbeat-coroutines:0.0.5")
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

.....
전체 Gradle
plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.9.0'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

group = 'space.zlfn'
version = '0.1'

repositories {
    mavenCentral()
    maven {
        name = "papermc-repo"
        url = "https://repo.papermc.io/repository/maven-public/"
    }
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/groups/public/"
    }
}

dependencies {
    compileOnly "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
    implementation("io.github.monun:heartbeat-coroutines:0.0.5")
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

def targetJavaVersion = 17
java {
    def javaVersion = JavaVersion.toVersion(targetJavaVersion)
    sourceCompatibility = javaVersion
    targetCompatibility = javaVersion
    if (JavaVersion.current() < javaVersion) {
        toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
    }
}

tasks.withType(JavaCompile).configureEach {
    if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
        options.release = targetJavaVersion
    }
}

processResources {
    def props = [version: version]
    inputs.properties props
    filteringCharset 'UTF-8'
    filesMatching('paper-plugin.yml') {
        expand props
    }
}
compileKotlin {
    kotlinOptions {
        jvmTarget = "17"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "17"
    }
}

이렇게 빌드한 플러그인을 페이퍼 1.20.1#117에서 실행시켰을 때, 아래와 같은 에러가 발생합니다.

[20:01:54 ERROR]: Error occurred while enabling HelloMessage v0.1 (Is it up to date?)
java.lang.ExceptionInInitializerError: null
	at io.github.monun.heartbeat.coroutines.HeartbeatCoroutineKt.HeartbeatScope(HeartbeatCoroutine.kt:68) ~[HelloMessage-0.1-all.jar:?]
	at space.zlfn.hellomessage.HelloMessage.onEnable(HelloMessage.kt:24) ~[HelloMessage-0.1-all.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189) ~[paper-1.20.1.jar:git-Paper-117]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.1.jar:git-Paper-117]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.20.1.jar:git-Paper-117]
	at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:551) ~[paper-1.20.1.jar:git-Paper-117]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:636) ~[paper-1.20.1.jar:git-Paper-117]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:435) ~[paper-1.20.1.jar:git-Paper-117]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.1.jar:git-Paper-117]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1101) ~[paper-1.20.1.jar:git-Paper-117]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318) ~[paper-1.20.1.jar:git-Paper-117]
	at java.lang.Thread.run(Thread.java:1623) ~[?:?]
Caused by: java.lang.ClassCastException: class io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader cannot be cast to class org.bukkit.plugin.java.PluginClassLoader (io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader and org.bukkit.plugin.java.PluginClassLoader are in unnamed module of loader java.net.URLClassLoader @67424e82)
	at io.github.monun.heartbeat.coroutines.Downstream.pullPlugin(Downstream.kt:26) ~[HelloMessage-0.1-all.jar:?]
	at io.github.monun.heartbeat.coroutines.HeartbeatCoroutine.<clinit>(HeartbeatCoroutine.kt:14) ~[HelloMessage-0.1-all.jar:?]
	... 14 more

반면 똑같은 코드를 1.18로 빌드(ShadowJar)해서 Paper 1.18.2#338에서 실행했을 때는 에러 없이 코드가 작동했습니다.

README.md 오타

README의 FSM 예시 when 부분 오류

Boolean과 Int 비교

README.md 오타

Coroutine 예제에 damageAll()이 damaegAll()로 적혀 있음

JavaPlugin 생명주기의 CoroutineScope 가 제공되지 않습니다.

문제 요약

Plugman 등을 통해서 Heartbeat Coroutines를 사용하는 플러그인을 핫리로드할 경우, Heartbeat Coroutines를 사용하는 플러그인 전부의 코루틴이 중단됩니다. 이는 Heartbeat Coroutines가 실제로는 JavaPlugin 생명주기의 CoroutineScope를 제공하는 것이 아님을 시사합니다.

문제 설명

Heartbeat Coroutines를 사용하는 플러그인을 두 개 만들어보겠습니다.

//HelloMessage1
override fun onEnable() {
    HeartbeatScope().launch {
        while(true) {
            logger.info("Hello, HeartBeat1!")
            val sus = Suspension()
            sus.delay(1000L)
        }
    }
}
//HelloMessage2
override fun onEnable() {
    HeartbeatScope().launch {
        while(true) {
            logger.info("Hello, HeartBeat2!")
            val sus = Suspension()
            sus.delay(1000L)
        }
    }
}

그리고 plugman 등으로 둘 중 하나만 리로드합니다.

[19:01:36 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:37 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:37 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:38 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:38 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:39 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:39 INFO]: [HelloMessage1] Hello, HeartBeat1!
> plugman reload HelloMessage1
[19:01:40 INFO]: [HelloMessage1] Disabling HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Loading server plugin HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Enabling HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:40 INFO]: [PlugMan] HelloMessage1 has been reloaded.
[19:01:41 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:42 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:43 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:44 INFO]: [HelloMessage1] Hello, HeartBeat1!

그러면 위와 같이 HelloMessage1을 리로드하였음에 불구, HelloMessage2의 코루틴도 중단된 것을 볼 수 있습니다.
(리로드는 HelloMessage1 만 되었기 때문에, HelloMessage2의 메시지는 더 이상 나오지 않게 됩니다.)

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.