diff --git a/metadata.keystore b/core/metadata.keystore
similarity index 100%
rename from metadata.keystore
rename to core/metadata.keystore
diff --git a/core/pom.xml b/core/pom.xml
new file mode 100644
index 0000000..5f552ee
--- /dev/null
+++ b/core/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+
+
+ com.inteligr8.alfresco
+ annotations-platform-module
+ 1.0-SNAPSHOT
+ ../
+
+
+ annotations-core-platform-module
+ jar
+
+
+ 22.22
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.40
+ true
+
+
+
+ com.inteligr8.ootbee:beedk-acs-platform-self-rad-tile:[1.1.0,1.2.0)
+
+ com.inteligr8.ootbee:beedk-acs-platform-module-tile:[1.1.0,1.2.0)
+
+ com.inteligr8.ootbee:beedk-acs-platform-self-it-tile:[1.1.0,1.2.0)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rad.ps1 b/core/rad.ps1
similarity index 100%
rename from rad.ps1
rename to core/rad.ps1
diff --git a/rad.sh b/core/rad.sh
similarity index 100%
rename from rad.sh
rename to core/rad.sh
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/AssociationTypeConstrainable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/AssociationTypeConstrainable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/AssociationTypeConstrainable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/AssociationTypeConstrainable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/Asynchronous.java b/core/src/main/java/com/inteligr8/alfresco/annotations/Asynchronous.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/Asynchronous.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/Asynchronous.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/Authorizable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/Authorizable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/Authorizable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/Authorizable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/Authorized.java b/core/src/main/java/com/inteligr8/alfresco/annotations/Authorized.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/Authorized.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/Authorized.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/AuthorizedAsSystem.java b/core/src/main/java/com/inteligr8/alfresco/annotations/AuthorizedAsSystem.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/AuthorizedAsSystem.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/AuthorizedAsSystem.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/IfChildAssociationIsPrimary.java b/core/src/main/java/com/inteligr8/alfresco/annotations/IfChildAssociationIsPrimary.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/IfChildAssociationIsPrimary.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/IfChildAssociationIsPrimary.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/IfNodeExists.java b/core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeExists.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/IfNodeExists.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeExists.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/IfNodeHasAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeHasAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/IfNodeHasAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeHasAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/IfNodeOfType.java b/core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeOfType.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/IfNodeOfType.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/IfNodeOfType.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/IfNotNull.java b/core/src/main/java/com/inteligr8/alfresco/annotations/IfNotNull.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/IfNotNull.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/IfNotNull.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/JobSynchronized.java b/core/src/main/java/com/inteligr8/alfresco/annotations/JobSynchronized.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/JobSynchronized.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/JobSynchronized.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/NodeAspectConstrainable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/NodeAspectConstrainable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/NodeAspectConstrainable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/NodeAspectConstrainable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/NodeTypeConstrainable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/NodeTypeConstrainable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/NodeTypeConstrainable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/NodeTypeConstrainable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/Threadable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/Threadable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/Threadable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/Threadable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/Threaded.java b/core/src/main/java/com/inteligr8/alfresco/annotations/Threaded.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/Threaded.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/Threaded.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/TransactionalRetryable.java b/core/src/main/java/com/inteligr8/alfresco/annotations/TransactionalRetryable.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/TransactionalRetryable.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/TransactionalRetryable.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodOrParameterAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodOrParameterAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodOrParameterAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractMethodOrParameterAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/RetryingTransactionAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractRetryingTransactionAspect.java
similarity index 95%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/RetryingTransactionAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractRetryingTransactionAspect.java
index 6950d8d..f4d9859 100644
--- a/src/main/java/com/inteligr8/alfresco/annotations/aspect/RetryingTransactionAspect.java
+++ b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractRetryingTransactionAspect.java
@@ -10,13 +10,13 @@ import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransacti
import org.alfresco.service.transaction.TransactionService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclarePrecedence;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
import org.springframework.transaction.IllegalTransactionStateException;
import org.springframework.transaction.annotation.Transactional;
@@ -41,22 +41,24 @@ import com.inteligr8.alfresco.annotations.util.TransactionalAnnotationAdapter;
* @see org.springframework.transaction.annotation.Transactional
* @see com.inteligr8.alfresco.annotations.TransactionalRetryable
*/
-@Aspect
@DeclarePrecedence("com.inteligr8.alfresco.annotations.aspect.AuthorizedAspect, com.inteligr8.alfresco.annotations.aspect.RetryingTransactionAspect")
-public class RetryingTransactionAspect {
+public abstract class AbstractRetryingTransactionAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
+ @Autowired
+ private ApplicationContext context;
+
@Autowired
private TransactionService txService;
+ public abstract String getJtaInterfaceName();
+
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional) && execution(* *(..))")
public void isTransactionalAnnotated() {
}
- @Pointcut("@annotation(" + JtaTransactionalAnnotationAdapter.JTA_INTERFACE_NAME + ") && execution(* *(..))")
- public void isJtaTransactionalAnnotated() {
- }
+ public abstract void isJtaTransactionalAnnotated();
@Pointcut("@annotation(com.inteligr8.alfresco.annotations.TransactionalRetryable) && execution(* *(..))")
public void isTransactionalRetryableAnnotated() {
@@ -86,9 +88,9 @@ public class RetryingTransactionAspect {
if (txl != null)
return new SpringTransactionalAnnotationAdapter((Transactional) txl);
- txl = this.getOptionalAnnotation(method, JtaTransactionalAnnotationAdapter.JTA_INTERFACE_NAME);
+ txl = this.getOptionalAnnotation(method, this.getJtaInterfaceName());
if (txl != null)
- return JtaTransactionalAnnotationAdapter.cast(txl);
+ return this.context.getAutowireCapableBeanFactory().getBean(JtaTransactionalAnnotationAdapter.class, txl);
return null;
}
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractWarnOnceService.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractWarnOnceService.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractWarnOnceService.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AbstractWarnOnceService.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/ApplicableParameterCallback.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ApplicableParameterCallback.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/ApplicableParameterCallback.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ApplicableParameterCallback.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/AsyncAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AsyncAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/AsyncAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AsyncAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/AuthorizedAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AuthorizedAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/AuthorizedAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/AuthorizedAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/ChildIsPrimaryAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ChildIsPrimaryAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/ChildIsPrimaryAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ChildIsPrimaryAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/JobLockAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/JobLockAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/JobLockAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/JobLockAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeAspectAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeAspectAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeAspectAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeAspectAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeTypeAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeTypeAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeTypeAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NodeTypeAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/NotNullAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NotNullAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/NotNullAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/NotNullAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/OperableNodeAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/OperableNodeAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/OperableNodeAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/OperableNodeAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/QNameBasedAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/QNameBasedAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/QNameBasedAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/QNameBasedAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/aspect/ThreadedAspect.java b/core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ThreadedAspect.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/aspect/ThreadedAspect.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/aspect/ThreadedAspect.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/job/AsyncJob.java b/core/src/main/java/com/inteligr8/alfresco/annotations/job/AsyncJob.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/job/AsyncJob.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/job/AsyncJob.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncProcessException.java b/core/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncProcessException.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/service/AsyncProcessException.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncProcessException.java
diff --git a/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncService.java b/core/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncService.java
similarity index 100%
rename from src/main/java/com/inteligr8/alfresco/annotations/service/AsyncService.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/service/AsyncService.java
diff --git a/src/main/javax-tx/com/inteligr8/alfresco/annotations/service/impl/MqAsyncService.java b/core/src/main/java/com/inteligr8/alfresco/annotations/service/impl/AbstractMqAsyncService.java
similarity index 57%
rename from src/main/javax-tx/com/inteligr8/alfresco/annotations/service/impl/MqAsyncService.java
rename to core/src/main/java/com/inteligr8/alfresco/annotations/service/impl/AbstractMqAsyncService.java
index 339f8c1..ffc02f3 100644
--- a/src/main/javax-tx/com/inteligr8/alfresco/annotations/service/impl/MqAsyncService.java
+++ b/core/src/main/java/com/inteligr8/alfresco/annotations/service/impl/AbstractMqAsyncService.java
@@ -22,24 +22,12 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
-import java.util.UUID;
import java.util.function.Supplier;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.cache.SimpleCache;
@@ -57,8 +45,6 @@ import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.Pair;
-import org.apache.activemq.ActiveMQConnectionFactory;
-import org.apache.activemq.jms.pool.PooledConnectionFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.quartz.JobKey;
@@ -76,15 +62,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEvent;
import org.springframework.extensions.surf.util.AbstractLifecycleBean;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.inteligr8.alfresco.annotations.AuthorizedAsSystem;
import com.inteligr8.alfresco.annotations.Threadable;
-import com.inteligr8.alfresco.annotations.Threaded;
-import com.inteligr8.alfresco.annotations.TransactionalRetryable;
import com.inteligr8.alfresco.annotations.job.AsyncJob;
import com.inteligr8.alfresco.annotations.service.AsyncProcessException;
import com.inteligr8.alfresco.annotations.service.AsyncService;
@@ -93,17 +72,14 @@ import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
/**
- * This class provides integration with MQ for the asynchronous method executions.
- *
* @author brian@inteligr8.com
*/
-@Component("async.mq")
-public class MqAsyncService extends AbstractLifecycleBean implements AsyncService, InitializingBean, DisposableBean, Threadable {
+public abstract class AbstractMqAsyncService extends AbstractLifecycleBean implements AsyncService, InitializingBean, DisposableBean, Threadable {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final JobKey jobKey = new JobKey("mq-async", "inteligr8-annotations");
- private final Pattern typePattern = Pattern.compile("v([0-9]+):([^:#]+)#(.+)");
- private final ObjectMapper om = new ObjectMapper();
+ protected final Pattern typePattern = Pattern.compile("v([0-9]+):([^:#]+)#(.+)");
+ protected final ObjectMapper om = new ObjectMapper();
@Value("${inteligr8.async.mq.enabled}")
protected boolean enabled;
@@ -150,13 +126,11 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
@Autowired
protected TransactionService txService;
- private String hostname;
+ protected String hostname;
- private PooledConnectionFactory factory;
+ protected SimpleCache, String>, Method> methodCache;
- private SimpleCache, String>, Method> methodCache;
-
- private ThreadLocal isAsync = ThreadLocal.withInitial(new Supplier() {
+ protected ThreadLocal isAsync = ThreadLocal.withInitial(new Supplier() {
@Override
public Boolean get() {
return false;
@@ -164,12 +138,12 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
});
@Override
- public void afterPropertiesSet() throws Exception {
+ public final void afterPropertiesSet() throws Exception {
this.init();
}
@Override
- public void destroy() throws Exception {
+ public final void destroy() throws Exception {
this.uninit();
}
@@ -186,15 +160,6 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
} catch (UnknownHostException uhe) {
this.hostname = "unknown";
}
-
- ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(this.url);
-
- PooledConnectionFactory pool = new PooledConnectionFactory();
- pool.setConnectionFactory(factory);
- pool.setMaxConnections(this.maxConnections);
- pool.start();
-
- this.factory = pool;
if (this.workerThreads <= 0)
throw new AlfrescoRuntimeException("The 'inteligr8.async.mq.workerThreads' property must be positive");
@@ -202,8 +167,6 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
@PreDestroy
protected void uninit() {
- if (this.factory != null)
- this.factory.stop();
}
@Override
@@ -241,7 +204,7 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
@Override
public boolean isEnabled() {
- return enabled;
+ return this.enabled;
}
@Override
@@ -254,183 +217,7 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
return this.isAsync.get();
}
- @Override
- @Transactional
- public void poll() throws AsyncProcessException {
- this.logger.trace("poll()");
- this.isAsync.set(true);
-
- try {
- Connection mqcon = this.factory.createConnection(this.username, this.password);
- try {
- mqcon.setClientID(this.clientId + "-service-" + this.hostname);
-
- Session mqsession = mqcon.createSession(true, Session.CLIENT_ACKNOWLEDGE);
- try {
- this.logger.debug("Polling messages for asynchronous policy execution");
- this.pollErrors(mqsession);
- this.pollMain(mqsession);
- } finally {
- mqsession.close();
- }
- } finally {
- mqcon.close();
- }
- } catch (JMSException je) {
- throw new AsyncProcessException("A JMS messaging issue occurred", je);
- }
- }
-
- private void pollErrors(Session mqsession) throws JMSException {
- this.logger.debug("Polling previously errored messages");
-
- Queue mqqueue = mqsession.createQueue(this.errorQueueName);
- Set msgIds = new HashSet<>();
- int ackd = 0;
-
- MessageConsumer consumer = mqsession.createConsumer(mqqueue);
- try {
- while (!Thread.currentThread().isInterrupted()) {
- Boolean processed = this.pollTx(mqsession, consumer, msgIds);
- if (processed == null) {
- break;
- } else if (processed.booleanValue()) {
- ackd++;
- }
- }
- } finally {
- consumer.close();
- }
-
- this.logger.info("Successfully processed {} of {} previously errored messages", ackd, msgIds.size());
- }
-
- private void pollMain(Session mqsession) throws JMSException {
- this.logger.debug("Polling ongoing messages ...");
-
- Queue mqqueue = mqsession.createQueue(this.queueName);
- this.pollMainThreaded(mqsession, mqqueue);
- }
-
- @Threaded(name = "mq-poll", join = true)
- private void pollMainThreaded(Session mqsession, Queue mqqueue) throws JMSException {
- MessageConsumer consumer = mqsession.createConsumer(mqqueue);
- try {
- while (!Thread.currentThread().isInterrupted()) {
- pollTx(mqsession, consumer, null);
- }
- } finally {
- consumer.close();
- }
- }
-
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- @TransactionalRetryable(maxRetries = 3)
- @AuthorizedAsSystem
- private Boolean pollTx(Session mqsession, MessageConsumer consumer, Set msgIds) throws JMSException {
- Message mqmsg = consumer.receive();
-
- if (msgIds != null && !msgIds.add(mqmsg.getJMSMessageID())) {
- this.logger.debug("Received a message again; assuming we have (re)tried all errored messages: {}", mqmsg.getJMSMessageID());
- return null;
- }
-
- try {
- if (this.processIncomingMessage(mqsession, mqmsg, msgIds != null)) {
- mqmsg.acknowledge();
- return true;
- }
- } catch (RuntimeException | Error e) {
- this.logger.error("An unexpected issue occurred", e);
- }
-
- return false;
- }
-
- private boolean processIncomingMessage(Session mqsession, Message mqmsg, boolean isErrorQueue) throws JMSException {
- String msgId = mqmsg.getJMSMessageID();
- this.logger.debug("Received message: {}", msgId);
-
- String type = mqmsg.getJMSType();
- Matcher matcher = this.typePattern.matcher(type);
- if (!matcher.find()) {
- this.logger.warn("The queue has a message ('{}') with an unsupported JMS type: {}", msgId, type);
- return false;
- }
-
- try {
- Class> beanClass = Class.forName(matcher.group(2));
- this.logger.trace("Preparing to execute using bean type: {}", beanClass);
- Object bean = this.getApplicationContext().getBean(beanClass);
- this.logger.trace("Found qualifying bean: {}", bean);
-
- String methodName = matcher.group(3);
- Method method = this.findMethod(beanClass, methodName);
- this.logger.trace("Found qualifying method: {}", method);
- Parameter[] params = method.getParameters();
-
- Object[] args = new Object[params.length];
-
- for (int a = 0; a < args.length; a++) {
- Object arg = mqmsg.getObjectProperty("arg" + a);
- if (arg == null)
- continue;
-
- args[a] = this.unmarshal(params[a], arg);
- }
-
- switch (method.getName()) {
- case "onLoadDynamicModel":
- args[1] = args[0];
- args[0] = this.loadModel((NodeRef) args[1]);
- }
-
- method.invoke(bean, args);
- } catch (ClassNotFoundException cnfe) {
- this.logger.error("A bean could not be found; will try on next restart");
- this.logger.error("The bean '{}' could not be found: {}", matcher.group(2), cnfe.getMessage());
- if (isErrorQueue)
- return false;
- this.moveToErrorQueue(mqsession, mqmsg);
- } catch (IOException ie) {
- this.logger.warn("This should never happen: " + ie.getMessage());
- // return to queue and retry indefinitely
- return false;
- } catch (NoSuchMethodException nsme) {
- this.logger.error("A bean enum argument could not be constructed; will try on next restart");
- this.logger.error("An argument could not be The bean '{}' could not be found: {}", matcher.group(2), nsme.getMessage());
- if (isErrorQueue)
- return false;
- this.moveToErrorQueue(mqsession, mqmsg);
- } catch (IllegalAccessException iae) {
- this.logger.error("A bean method was not accessible (public); will try on next restart");
- this.logger.warn("The bean '{}' method '{}' is not accessible: {}", matcher.group(2), matcher.group(3), iae.getMessage());
- if (isErrorQueue)
- return false;
- this.moveToErrorQueue(mqsession, mqmsg);
- } catch (InstantiationException | InvocationTargetException ie) {
- this.logger.error("A bean method execution failed; will try on next restart");
- this.logger.warn("The bean '{}' method '{}' execution failed: {}", matcher.group(2), matcher.group(3), ie.getMessage());
- if (isErrorQueue)
- return false;
- this.moveToErrorQueue(mqsession, mqmsg);
- }
-
- return true;
- }
-
- private void moveToErrorQueue(Session mqsession, Message mqmsg) throws JMSException {
- Queue mqqueue = mqsession.createQueue(this.errorQueueName);
-
- MessageProducer producer = mqsession.createProducer(mqqueue);
- try {
- producer.send(mqmsg);
- } finally {
- producer.close();
- }
- }
-
- private Method findMethod(Class> clazz, String methodName) {
+ protected Method findMethod(Class> clazz, String methodName) {
Pair, String> key = new Pair<>(clazz, methodName);
Method method = this.methodCache.get(key);
if (method != null) {
@@ -466,53 +253,11 @@ public class MqAsyncService extends AbstractLifecycleBean implements AsyncServic
this.push(bean, method.getName(), Arrays.asList(joinPoint.getArgs()));
}
-
- @Transactional
- public void push(Object callbackBean, String callbackMethod, List