Skip to content

Instantly share code, notes, and snippets.

@eungju
eungju / BulkheadInterceptor.kt
Created Sep 9, 2021
OkHttp 지표 수집과 장애 격리
View BulkheadInterceptor.kt
import io.github.resilience4j.bulkhead.Bulkhead
import okhttp3.Interceptor
import okhttp3.Response
class BulkheadInterceptor(private val bulkhead: Bulkhead) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response =
bulkhead.executeCallable { chain.proceed(chain.request()) }
}
@eungju
eungju / RestdocsDsl.kt
Last active Jul 2, 2022
Spring REST Docs Kotlin DSL
View RestdocsDsl.kt
import org.springframework.restdocs.headers.HeaderDescriptor
import org.springframework.restdocs.headers.HeaderDocumentation
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation
import org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse
import org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint
import org.springframework.restdocs.payload.FieldDescriptor
import org.springframework.restdocs.payload.PayloadDocumentation
import org.springframework.restdocs.payload.SubsectionDescriptor
import org.springframework.restdocs.request.ParameterDescriptor
import org.springframework.restdocs.request.RequestDocumentation
@eungju
eungju / FixZipkinV2Reporter.kt
Last active Jun 13, 2021
jaeger-zipkin이 객체의 private 필드에 접근하지 않게 한다.
View FixZipkinV2Reporter.kt
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import io.jaegertracing.zipkin.internal.V2SpanConverter
import java.lang.reflect.Field
import java.lang.reflect.Modifier
import java.lang.invoke.MethodHandles
import java.lang.invoke.VarHandle
class FixZipkinV2Reporter(gson: Gson = PRIVACY_RESPECTING_GSON) {
init {
View BulkheadClientInterceptor.kt
import io.github.resilience4j.bulkhead.Bulkhead
import io.github.resilience4j.bulkhead.utils.BulkheadUtils
import io.grpc.CallOptions
import io.grpc.Channel
import io.grpc.ClientCall
import io.grpc.ClientInterceptor
import io.grpc.ClientInterceptors
import io.grpc.ForwardingClientCallListener
import io.grpc.Metadata
import io.grpc.MethodDescriptor
@eungju
eungju / TRawHttpSocket.java
Last active May 11, 2018
RawHTTP libthrift TTransport
View TRawHttpSocket.java
import com.athaydes.rawhttp.core.EagerBodyReader;
import com.athaydes.rawhttp.core.EagerHttpResponse;
import com.athaydes.rawhttp.core.MethodLine;
import com.athaydes.rawhttp.core.RawHttp;
import com.athaydes.rawhttp.core.RawHttpHeaders;
import com.athaydes.rawhttp.core.RawHttpRequest;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@eungju
eungju / CircuitBreakerMetrics.kt
Last active Apr 12, 2018
Timeout CircuitBreaker
View CircuitBreakerMetrics.kt
interface CircuitBreakerMetrics {
fun executionCompleted(name: String, latency: Double) = Unit
}
@eungju
eungju / RxTest.kt
Last active Nov 26, 2017
Catch UndeliverableException
View RxTest.kt
@Test
fun simple() {
val observable = Observable.create<Int> { emitter ->
emitter.onNext(1)
emitter.onError(IOException("Timeout"))
}
observable
.take(1)
.subscribe({ assertEquals(1, it) }, { assertTrue(it is UndeliverableException) })
}
@eungju
eungju / Correct.kt
Last active Aug 29, 2017
Rx에서 reactive base type 만들 때 자주 하는 실수
View Correct.kt
override fun connectDevice(userDeviceRef: UserDeviceRef, deviceAttributes: DeviceAttributes, nodeRef: PilsnerRef): Completable
= Completable.fromRunnable {
rwLock.write {
devicePresences[userDeviceRef.deviceId] = Presence(userDeviceRef, deviceAttributes, nodeRef)
userDevices.put(userDeviceRef.userId, userDeviceRef.deviceId)
}
}
override fun getPresencesOfUser(userId: UserId): Single<List<Presence>>
= Single.fromCallable {
@eungju
eungju / Headers.kt
Last active Jul 21, 2017
HTTP 헤더 이름은 왜 타입을 안만드나?
View Headers.kt
class Http {
data class HeaderName(val name: String) : Comparable<HeaderName> {
override fun compareTo(other: HeaderName): Int = name.compareTo(other.name, true)
fun get(headers: MultiMap): String? = headers.get(name)
fun set(headers: MultiMap, value: String): Unit { headers.set(name, value) }
fun copyIfExist(from: MultiMap, to: MultiMap) {
get(from)?.let { set(to, it) }
}
@eungju
eungju / README.md
Last active Jul 5, 2022
Kotlin let run apply also
View README.md

let

inline fun <T, R> T.let(block: (T) -> R): R = block(this)

run

inline fun <T, R> T.run(block: T.() -> R): R = block()

apply