확장 된 시간 동안 열려있는 연결을 모니터하기 위해 java.sql.Connection 유형의 하위 클래스에 필드를 추가하려고합니다. (예 : 연결 누출). 필드에 클래스를 추가하면 "<constructor>은 인덱스 2를 정의하지 않습니다."
이
내가 실행하려고 무엇과 : 몇 가지 조사를 바탕으로java.lang.IllegalStateException: net.sourceforge.jtds.jdbc.ConnectionJDBC3(java.lang.String,java.util.Properties) throws java.sql.SQLException does not define an index 2
at net.bytebuddy.asm.Advice$OffsetMapping$ForArgument$Unresolved.resolve(Advice.java:1551)
at net.bytebuddy.asm.Advice$OffsetMapping$ForArgument.resolve(Advice.java:1462)
at net.bytebuddy.asm.Advice$OffsetMapping$ForArgument$Unresolved.resolve(Advice.java:1564)
at net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$ForMethodExit.apply(Advice.java:5818)
at net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$AdviceMethodInliner.visitMethod(Advice.java:5414)
at net.bytebuddy.jar.asm.ClassReader.b(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$AdviceMethodInliner.doApply(Advice.java:5408)
at net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$ForMethodExit$AdviceMethodInliner.apply(Advice.java:5902)
at net.bytebuddy.asm.Advice$AdviceVisitor$WithExitAdvice.onUserEnd(Advice.java:7503)
at net.bytebuddy.asm.Advice$AdviceVisitor.visitMaxs(Advice.java:7251)
at net.bytebuddy.jar.asm.ClassReader.a(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.b(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:2941)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1633)
at net.bytebuddy.dynamic.scaffold.inline.RebaseDynamicTypeBuilder.make(RebaseDynamicTypeBuilder.java:200)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution.apply(AgentBuilder.java:8902)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:9303)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:9266)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1300(AgentBuilder.java:9044)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:9622)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:9572)
at ...
: 나는 내 응용 프로그램 (톰캣에 웹 응용 프로그램) 나는 다음과 같은 오류를 시작
public class TransactionMonitorVisitor {
interface FieldSetter {
void setField(String value);
}
interface FieldGetter {
String getValue();
}
public static class ConnectionConstructorVisitor {
@Advice.OnMethodExit
public static void intercept(@Advice.Origin Constructor<?> constructor,
@Advice.This Object obj,
@FieldProxy("__txUuid__") FieldSetter accessor
) {
String txUuid = UUID.randomUUID().toString();
System.out.println("Visiting constructor: txUuid=" + txUuid + ", obj=" + obj);
accessor.setField(txUuid);
}
}
public static class ConnectionMethodVisitor {
@Advice.OnMethodExit
public static void intercept(@Advice.Origin Method method,
@FieldProxy("__txUuid__") FieldGetter accessor
) {
String methodName = method.getName();
String txUuid = accessor.getValue();
System.out.println("Visiting method: txUuid=" + txUuid + ", method=" + methodName);
}
}
public static void installOn(Instrumentation instrumentation) throws Exception {
new AgentBuilder.Default()
.type(ElementMatchers.isSubTypeOf(Connection.class))
.transform((builder, typeDescription, classLoader, javaModule) ->
builder.defineField("__txUuid__", String.class)
.visit(Advice.to(ConnectionConstructorVisitor.class).on((ElementMatchers.isConstructor())))
.visit(Advice.to(ConnectionMethodVisitor.class).on(ElementMatchers.nameMatches("commit|rollback|close")))
)
.with(AgentBuilder.Listener.StreamWriting.toSystemError())
.installOn(instrumentation);
System.out.println("Installed :: " + TransactionMonitorVisitor.class.getName());
}
}
, 나는 .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
을 추가하려고했지만 위와 같은 오류가 발생합니다.
RedefinitionStrategy.RETRANSFORMATION
과 함께 .disableClassFormatChanges()
을 사용하는 다른 곳을 보았지만 여전히 오류가 발생하지 않습니다. 새로운 오류는 다음과 같습니다.
java.lang.IllegalStateException: Cannot define field for frozen type: class net.sourceforge.jtds.jdbc.ConnectionJDBC3
at net.bytebuddy.dynamic.scaffold.InstrumentedType$Frozen.withField(InstrumentedType.java:1149)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Adapter$FieldDefinitionAdapter.materialize(DynamicType.java:3159)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.visit(DynamicType.java:2571)
at com.calabrio.athena.tx.TransactionMonitorVisitor.lambda$installOn$0(TransactionMonitorVisitor.java:70)
at com.calabrio.athena.tx.TransactionMonitorVisitor$$Lambda$1/1528637575.transform(Unknown Source)
at net.bytebuddy.agent.builder.AgentBuilder$Transformer$Compound.transform(AgentBuilder.java:2335)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution.apply(AgentBuilder.java:8899)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:9303)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:9266)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1300(AgentBuilder.java:9044)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:9622)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:9572)
내가 할 수있는 일이 가능합니까? 그렇다면 내가 누락 된 것은 무엇인가?