/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.cluster; import com.liferay.portal.kernel.cluster.Clusterable; import com.liferay.portal.kernel.cluster.ClusterableInvokerUtil; import com.liferay.portal.kernel.cluster.NullClusterable; import com.liferay.portal.kernel.nio.intraband.rpc.IntrabandRPCUtil; import com.liferay.portal.kernel.resiliency.spi.SPI; import com.liferay.portal.kernel.resiliency.spi.SPIUtil; import com.liferay.portal.spring.aop.AnnotationChainableMethodAdvice; import java.io.Serializable; import java.lang.reflect.Method; import java.util.concurrent.Future; import org.aopalliance.intercept.MethodInvocation; /** * @author Shuyang Zhou */ public class SPIClusterableAdvice extends AnnotationChainableMethodAdvice<Clusterable> { @Override public void afterReturning(MethodInvocation methodInvocation, Object result) throws Throwable { Clusterable clusterable = findAnnotation(methodInvocation); if (clusterable == NullClusterable.NULL_CLUSTERABLE) { return; } SPI spi = SPIUtil.getSPI(); IntrabandRPCUtil.execute( spi.getRegistrationReference(), new MethodHandlerProcessCallable<Serializable>( ClusterableInvokerUtil.createMethodHandler( clusterable.acceptor(), methodInvocation.getThis(), methodInvocation.getMethod(), methodInvocation.getArguments()))); } @Override public Object before(MethodInvocation methodInvocation) throws Throwable { Clusterable clusterable = findAnnotation(methodInvocation); if (clusterable == NullClusterable.NULL_CLUSTERABLE) { return null; } if (!clusterable.onMaster()) { return null; } SPI spi = SPIUtil.getSPI(); Future<Serializable> futureResult = IntrabandRPCUtil.execute( spi.getRegistrationReference(), new MethodHandlerProcessCallable<Serializable>( ClusterableInvokerUtil.createMethodHandler( clusterable.acceptor(), methodInvocation.getThis(), methodInvocation.getMethod(), methodInvocation.getArguments()))); Object result = futureResult.get(); Method method = methodInvocation.getMethod(); Class<?> returnType = method.getReturnType(); if (returnType == void.class) { result = nullResult; } return result; } @Override public Clusterable getNullAnnotation() { return NullClusterable.NULL_CLUSTERABLE; } }