This commit is contained in:
地平线
2015-09-02 19:35:16 +08:00
parent 51ddecedd4
commit df0c5c9727
3 changed files with 62 additions and 39 deletions

View File

@@ -146,7 +146,7 @@ public abstract class Sncp {
* return "hello" + id; * return "hello" + id;
* } * }
* *
* @MultiRun * @MultiRun(selfrun = false)
* public void createSomeThing(TestBean bean){ * public void createSomeThing(TestBean bean){
* "xxxxx" + bean; * "xxxxx" + bean;
* } * }
@@ -177,25 +177,27 @@ public abstract class Sncp {
* *
* @Override * @Override
* public String updateSomeThing(String id){ * public String updateSomeThing(String id){
* return _updateSomeThing(true, true, id); * return _updateSomeThing(true, true, true, id);
* } * }
* *
* public String _updateSomeThing(boolean cansamerun, boolean candiffrun, String id){ * public String _updateSomeThing(boolean canselfrun, boolean cansamerun, boolean candiffrun, String id){
* String rs = super.updateSomeThing(id); * String rs = super.updateSomeThing(id);
* _client.remote(_convert, _sameGroupTransports, cansamerun, 0, false, false, id); * if (_client== null) return;
* _client.remote(_convert, _diffGroupTransports, candiffrun, 0, true, false, id); * _client.remote(_convert, _sameGroupTransports, cansamerun, 0, true, false, false, id);
* _client.remote(_convert, _diffGroupTransports, candiffrun, 0, true, true, false, id);
* return rs; * return rs;
* } * }
* *
* @Override * @Override
* public void createSomeThing(TestBean bean){ * public void createSomeThing(TestBean bean){
* _createSomeThing(true, true, bean); * _createSomeThing(false, true, true, bean);
* } * }
* *
* public void _createSomeThing(boolean cansamerun, boolean candiffrun, TestBean bean){ * public void _createSomeThing(boolean canselfrun, boolean cansamerun, boolean candiffrun, TestBean bean){
* super.createSomeThing(bean); * if(canselfrun) super.createSomeThing(bean);
* _client.remote(_convert, _sameGroupTransports, cansamerun, 1, false, false, bean); * if (_client== null) return;
* _client.remote(_convert, _diffGroupTransports, candiffrun, 1, true, false, bean); * _client.remote(_convert, _sameGroupTransports, cansamerun, 1, true, false, false, bean);
* _client.remote(_convert, _diffGroupTransports, candiffrun, 1, true, true, false, bean);
* } * }
* } * }
* *
@@ -225,7 +227,6 @@ public abstract class Sncp {
final String clientName = SncpClient.class.getName().replace('.', '/'); final String clientName = SncpClient.class.getName().replace('.', '/');
final String clientDesc = Type.getDescriptor(SncpClient.class); final String clientDesc = Type.getDescriptor(SncpClient.class);
final String convertDesc = Type.getDescriptor(BsonConvert.class); final String convertDesc = Type.getDescriptor(BsonConvert.class);
final String transportDesc = Type.getDescriptor(Transport.class);
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
final String transportsDesc = Type.getDescriptor(Transport[].class); final String transportsDesc = Type.getDescriptor(Transport[].class);
ClassLoader loader = Sncp.class.getClassLoader(); ClassLoader loader = Sncp.class.getClassLoader();
@@ -313,8 +314,9 @@ public abstract class Sncp {
final int index = ++i; final int index = ++i;
{ //原始方法 { //原始方法
mv = new DebugMethodVisitor(cw.visitMethod(ACC_PUBLIC + (method.isVarArgs() ? ACC_VARARGS : 0), method.getName(), methodDesc, null, null)); mv = new DebugMethodVisitor(cw.visitMethod(ACC_PUBLIC + (method.isVarArgs() ? ACC_VARARGS : 0), method.getName(), methodDesc, null, null));
//mv.setDebug(true); mv.setDebug(true);
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
mv.visitInsn(mrun.selfrun() ? ICONST_1 : ICONST_0);
mv.visitInsn(mrun.samerun() ? ICONST_1 : ICONST_0); mv.visitInsn(mrun.samerun() ? ICONST_1 : ICONST_0);
mv.visitInsn(mrun.diffrun() ? ICONST_1 : ICONST_0); mv.visitInsn(mrun.diffrun() ? ICONST_1 : ICONST_0);
int varindex = 0; int varindex = 0;
@@ -335,7 +337,7 @@ public abstract class Sncp {
mv.visitVarInsn(ALOAD, ++varindex); mv.visitVarInsn(ALOAD, ++varindex);
} }
} }
mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "_" + method.getName(), "(ZZ" + methodDesc.substring(1), false); mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "_" + method.getName(), "(ZZZ" + methodDesc.substring(1), false);
if (returnType == void.class) { if (returnType == void.class) {
mv.visitInsn(RETURN); mv.visitInsn(RETURN);
} else if (returnType.isPrimitive()) { } else if (returnType.isPrimitive()) {
@@ -355,14 +357,18 @@ public abstract class Sncp {
mv.visitEnd(); mv.visitEnd();
} }
{ // _方法 { // _方法
mv = new DebugMethodVisitor(cw.visitMethod(ACC_PUBLIC + (method.isVarArgs() ? ACC_VARARGS : 0), "_" + method.getName(), "(ZZ" + methodDesc.substring(1), null, null)); mv = new DebugMethodVisitor(cw.visitMethod(ACC_PUBLIC + (method.isVarArgs() ? ACC_VARARGS : 0), "_" + method.getName(), "(ZZZ" + methodDesc.substring(1), null, null));
//mv.setDebug(true); mv.setDebug(true);
av0 = mv.visitAnnotation(sncpDynDesc, true); av0 = mv.visitAnnotation(sncpDynDesc, true);
av0.visit("index", index); av0.visit("index", index);
av0.visitEnd(); av0.visitEnd();
Label l1 = new Label();
if (returnType == void.class) { // if
mv.visitVarInsn(ILOAD, 1);
mv.visitJumpInsn(IFEQ, l1);
}
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
int varindex = 2; int varindex = 3;
for (Class pt : paramtypes) { for (Class pt : paramtypes) {
if (pt.isPrimitive()) { if (pt.isPrimitive()) {
if (pt == long.class) { if (pt == long.class) {
@@ -381,6 +387,9 @@ public abstract class Sncp {
} }
} }
mv.visitMethodInsn(INVOKESPECIAL, supDynName, method.getName(), methodDesc, false); mv.visitMethodInsn(INVOKESPECIAL, supDynName, method.getName(), methodDesc, false);
if (returnType == void.class) { // end if
mv.visitLabel(l1);
}
if (returnType == void.class) { if (returnType == void.class) {
} else if (returnType.isPrimitive()) { } else if (returnType.isPrimitive()) {
if (returnType == long.class) { if (returnType == long.class) {
@@ -433,42 +442,48 @@ public abstract class Sncp {
mv.visitVarInsn(ALOAD, 0); //传递 _sameGroupTransports mv.visitVarInsn(ALOAD, 0); //传递 _sameGroupTransports
mv.visitFieldInsn(GETFIELD, newDynName, "_sameGroupTransports", transportsDesc); mv.visitFieldInsn(GETFIELD, newDynName, "_sameGroupTransports", transportsDesc);
mv.visitVarInsn(ILOAD, 1); //传递 cansamerun mv.visitVarInsn(ILOAD, 2); //传递 cansamerun
if (index <= 5) { //第几个 SncpAction if (index <= 5) { //第几个 SncpAction
mv.visitInsn(ICONST_0 + index); mv.visitInsn(ICONST_0 + index);
} else { } else {
mv.visitIntInsn(BIPUSH, index); mv.visitIntInsn(BIPUSH, index);
} }
if (paramtypes.length + 2 <= 5) { //参数总数量 if (paramtypes.length + 3 <= 5) { //参数总数量
mv.visitInsn(ICONST_0 + paramtypes.length + 2); mv.visitInsn(ICONST_0 + paramtypes.length + 3);
} else { } else {
mv.visitIntInsn(BIPUSH, paramtypes.length + 2); mv.visitIntInsn(BIPUSH, paramtypes.length + 3);
} }
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
mv.visitInsn(DUP); mv.visitInsn(DUP);
mv.visitInsn(ICONST_0); mv.visitInsn(ICONST_0);
mv.visitInsn(ICONST_0); //第一个参数 cansamerun mv.visitInsn(ICONST_1); //第一个参数 canselfrun
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
mv.visitInsn(AASTORE); mv.visitInsn(AASTORE);
mv.visitInsn(DUP); mv.visitInsn(DUP);
mv.visitInsn(ICONST_1); mv.visitInsn(ICONST_1);
mv.visitInsn(ICONST_0); //第一个参数 cansamerun
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_2);
mv.visitInsn(ICONST_0); //第二个参数 candiffrun mv.visitInsn(ICONST_0); //第二个参数 candiffrun
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
mv.visitInsn(AASTORE); mv.visitInsn(AASTORE);
int insn = 2; int insn = 3;
for (int j = 0; j < paramtypes.length; j++) { for (int j = 0; j < paramtypes.length; j++) {
final Class pt = paramtypes[j]; final Class pt = paramtypes[j];
mv.visitInsn(DUP); mv.visitInsn(DUP);
insn++; insn++;
if (j <= 3) { if (j <= 2) {
mv.visitInsn(ICONST_0 + j + 2); mv.visitInsn(ICONST_0 + j + 3);
} else { } else {
mv.visitIntInsn(BIPUSH, j + 2); mv.visitIntInsn(BIPUSH, j + 3);
} }
if (pt.isPrimitive()) { if (pt.isPrimitive()) {
if (pt == long.class) { if (pt == long.class) {
@@ -496,16 +511,16 @@ public abstract class Sncp {
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, newDynName, "_diffGroupTransports", transportsDesc); mv.visitFieldInsn(GETFIELD, newDynName, "_diffGroupTransports", transportsDesc);
mv.visitVarInsn(ILOAD, 2); //传递 candiffrun mv.visitVarInsn(ILOAD, 3); //传递 candiffrun
if (index <= 5) { //第几个 SncpAction if (index <= 5) { //第几个 SncpAction
mv.visitInsn(ICONST_0 + index); mv.visitInsn(ICONST_0 + index);
} else { } else {
mv.visitIntInsn(BIPUSH, index); mv.visitIntInsn(BIPUSH, index);
} }
if (paramtypes.length + 2 <= 5) { //参数总数量 if (paramtypes.length + 3 <= 5) { //参数总数量
mv.visitInsn(ICONST_0 + paramtypes.length + 2); mv.visitInsn(ICONST_0 + paramtypes.length + 3);
} else { } else {
mv.visitIntInsn(BIPUSH, paramtypes.length + 2); mv.visitIntInsn(BIPUSH, paramtypes.length + 3);
} }
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
@@ -518,19 +533,25 @@ public abstract class Sncp {
mv.visitInsn(DUP); mv.visitInsn(DUP);
mv.visitInsn(ICONST_1); mv.visitInsn(ICONST_1);
mv.visitInsn(ICONST_1); //第二个参数 candiffrun
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_2);
mv.visitInsn(ICONST_0); //第二个参数 candiffrun mv.visitInsn(ICONST_0); //第二个参数 candiffrun
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
mv.visitInsn(AASTORE); mv.visitInsn(AASTORE);
insn = 2; insn = 3;
for (int j = 0; j < paramtypes.length; j++) { for (int j = 0; j < paramtypes.length; j++) {
final Class pt = paramtypes[j]; final Class pt = paramtypes[j];
mv.visitInsn(DUP); mv.visitInsn(DUP);
insn++; insn++;
if (j <= 3) { if (j <= 2) {
mv.visitInsn(ICONST_0 + j + 2); mv.visitInsn(ICONST_0 + j + 3);
} else { } else {
mv.visitIntInsn(BIPUSH, j + 2); mv.visitIntInsn(BIPUSH, j + 3);
} }
if (pt.isPrimitive()) { if (pt.isPrimitive()) {
if (pt == long.class) { if (pt == long.class) {

View File

@@ -21,19 +21,19 @@ public class DataCacheListenerService implements DataCacheListener, Service {
private DataSource source; private DataSource source;
@Override @Override
@MultiRun(async = true) @MultiRun(selfrun = false, async = true)
public <T> void insertCache(Class<T> clazz, T... entitys) { public <T> void insertCache(Class<T> clazz, T... entitys) {
((DataDefaultSource) source).insertCache(clazz, entitys); ((DataDefaultSource) source).insertCache(clazz, entitys);
} }
@Override @Override
@MultiRun(async = true) @MultiRun(selfrun = false, async = true)
public <T> void updateCache(Class<T> clazz, T... entitys) { public <T> void updateCache(Class<T> clazz, T... entitys) {
((DataDefaultSource) source).updateCache(clazz, entitys); ((DataDefaultSource) source).updateCache(clazz, entitys);
} }
@Override @Override
@MultiRun(async = true) @MultiRun(selfrun = false, async = true)
public <T> void deleteCache(Class<T> clazz, Serializable... ids) { public <T> void deleteCache(Class<T> clazz, Serializable... ids) {
((DataDefaultSource) source).deleteCache(clazz, ids); ((DataDefaultSource) source).deleteCache(clazz, ids);
} }

View File

@@ -19,9 +19,11 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface MultiRun { public @interface MultiRun {
boolean samerun() default true; //是否同组节点也运营指定操作 boolean selfrun() default true; //当前本地实例是否运行指定操作只有当指定操作的方法的返回值为void时该值才有效。
boolean diffrun() default true; //是否同组节点也运指定操作 boolean samerun() default true; //是否同组节点也运指定操作
boolean diffrun() default true; //是否不同组节点也运行指定操作
boolean async() default true; //分布式运行是否采用异步模式 boolean async() default true; //分布式运行是否采用异步模式
} }