Search in sources :

Example 1 with KieContainerCommandService

use of org.kie.server.services.api.KieContainerCommandService in project droolsjbpm-integration by kiegroup.

the class KieServerMDB method onMessage.

public void onMessage(Message message) {
    JMSConnection connect = null;
    try {
        String username = null;
        String password = null;
        try {
            username = message.getStringProperty(USER_PROPERTY_NAME);
            password = message.getStringProperty(PASSWRD_PROPERTY_NAME);
        } catch (JMSException jmse) {
            logger.warn("Unable to retrieve user name and/or password, from message");
        }
        if (username != null && password != null) {
            JMSSecurityAdapter.login(username, password);
        } else {
            logger.warn("Unable to login to JMSSecurityAdapter, user name and/or password missing");
        }
        KieContainerCommandService executor = null;
        // 0. Get msg correlation id (for response)
        String msgCorrId = null;
        try {
            msgCorrId = message.getJMSCorrelationID();
        } catch (JMSException jmse) {
            String errMsg = "Unable to retrieve JMS correlation id from message! " + ID_NECESSARY;
            throw new JMSRuntimeException(errMsg, jmse);
        }
        // for backward compatibility default to KieServer
        String targetCapability = getStringProperty(message, TARGET_CAPABILITY_PROPERTY_NAME, "KieServer");
        String containerId = getStringProperty(message, CONTAINER_ID_PROPERTY_NAME, null);
        String conversationId = getStringProperty(message, CONVERSATION_ID_PROPERTY_NAME, null);
        int interactionPattern = getIntProperty(message, INTERACTION_PATTERN_PROPERTY_NAME, REQUEST_REPLY_PATTERN);
        // 1. get marshalling info
        MarshallingFormat format = null;
        String classType = null;
        try {
            classType = message.getStringProperty(CLASS_TYPE_PROPERTY_NAME);
            if (!message.propertyExists(SERIALIZATION_FORMAT_PROPERTY_NAME)) {
                format = MarshallingFormat.JAXB;
            } else {
                int intFormat = message.getIntProperty(SERIALIZATION_FORMAT_PROPERTY_NAME);
                logger.debug("Serialization format (int) is {}", intFormat);
                format = MarshallingFormat.fromId(intFormat);
                logger.debug("Serialization format is {}", format);
                if (format == null) {
                    String errMsg = "Unsupported marshalling format '" + intFormat + "' from message " + msgCorrId + ".";
                    throw new JMSRuntimeException(errMsg);
                }
            }
        } catch (JMSException jmse) {
            String errMsg = "Unable to retrieve property '" + SERIALIZATION_FORMAT_PROPERTY_NAME + "' from message " + msgCorrId + ".";
            throw new JMSRuntimeException(errMsg, jmse);
        }
        // 2. get marshaller
        Marshaller marshaller = getMarshaller(containerId, format);
        logger.debug("Selected marshaller is {}", marshaller);
        // 3. deserialize request
        CommandScript script = unmarshallRequest(message, msgCorrId, marshaller, format);
        logger.debug("Target capability is {}", targetCapability);
        for (KieServerExtension extension : kieServer.getServerExtensions()) {
            KieContainerCommandService tmp = extension.getAppComponents(KieContainerCommandService.class);
            if (tmp != null && extension.getImplementedCapability().equalsIgnoreCase(targetCapability)) {
                executor = tmp;
                logger.debug("Extension {} returned command executor {} with capability {}", extension, executor, extension.getImplementedCapability());
                break;
            }
        }
        if (executor == null) {
            throw new IllegalStateException("No executor found for script execution");
        }
        // 4. process request
        ServiceResponsesList response = executor.executeScript(script, format, classType);
        if (interactionPattern < UPPER_LIMIT_REPLY_INTERACTION_PATTERNS) {
            connect = startConnectionAndSession();
            logger.debug("Response message is about to be sent according to selected interaction pattern {}", interactionPattern);
            // 5. serialize response
            Message msg = marshallResponse(connect.getSession(), msgCorrId, format, marshaller, response);
            // set conversation id for routing
            if (containerId != null && (conversationId == null || conversationId.trim().isEmpty())) {
                try {
                    KieContainerInstance containerInstance = kieServer.getServerRegistry().getContainer(containerId);
                    if (containerInstance != null) {
                        ReleaseId releaseId = containerInstance.getResource().getResolvedReleaseId();
                        if (releaseId == null) {
                            releaseId = containerInstance.getResource().getReleaseId();
                        }
                        conversationId = ConversationId.from(KieServerEnvironment.getServerId(), containerId, releaseId).toString();
                    }
                } catch (Exception e) {
                    logger.warn("Unable to build conversation id due to {}", e.getMessage(), e);
                }
            }
            try {
                if (conversationId != null) {
                    msg.setStringProperty(CONVERSATION_ID_PROPERTY_NAME, conversationId);
                }
            } catch (JMSException e) {
                logger.debug("Unable to set conversation id on response message due to {}", e.getMessage());
            }
            // 6. send response
            sendResponse(connect.getSession(), msgCorrId, format, msg);
        } else {
            logger.debug("Response message is skipped according to selected interaction pattern {}", FIRE_AND_FORGET_PATTERN);
        }
    } finally {
        if (connect != null) {
            // Only attempt to close the connection/session if they were actually created
            try {
                closeConnectionAndSession(connect);
            } catch (JMSRuntimeException runtimeException) {
                logger.error("Error while attempting to close connection/session", runtimeException);
            } finally {
                JMSSecurityAdapter.logout();
            }
        } else {
            JMSSecurityAdapter.logout();
        }
    }
}
Also used : ServiceResponsesList(org.kie.server.api.model.ServiceResponsesList) Marshaller(org.kie.server.api.marshalling.Marshaller) Message(javax.jms.Message) TextMessage(javax.jms.TextMessage) MarshallingFormat(org.kie.server.api.marshalling.MarshallingFormat) KieServerExtension(org.kie.server.services.api.KieServerExtension) CommandScript(org.kie.server.api.commands.CommandScript) JMSException(javax.jms.JMSException) KieContainerCommandService(org.kie.server.services.api.KieContainerCommandService) ReleaseId(org.kie.server.api.model.ReleaseId) NamingException(javax.naming.NamingException) JMSException(javax.jms.JMSException) KieContainerInstance(org.kie.server.services.api.KieContainerInstance)

Example 2 with KieContainerCommandService

use of org.kie.server.services.api.KieContainerCommandService in project droolsjbpm-integration by kiegroup.

the class DroolsRestApplicationComponentsService method getAppComponents.

@Override
public Collection<Object> getAppComponents(String extension, SupportedTransports type, Object... services) {
    // skip calls from other than owning extension
    if (!OWNER_EXTENSION.equals(extension)) {
        return Collections.emptyList();
    }
    KieContainerCommandService batchCommandService = null;
    KieServerRegistry context = null;
    for (Object object : services) {
        if (KieContainerCommandService.class.isAssignableFrom(object.getClass())) {
            batchCommandService = (KieContainerCommandService) object;
            continue;
        } else if (KieServerRegistry.class.isAssignableFrom(object.getClass())) {
            context = (KieServerRegistry) object;
            continue;
        }
    }
    List<Object> components = new ArrayList<Object>(1);
    if (SupportedTransports.REST.equals(type)) {
        components.add(new CommandResource(batchCommandService, context));
    }
    return components;
}
Also used : KieServerRegistry(org.kie.server.services.api.KieServerRegistry) ArrayList(java.util.ArrayList) KieContainerCommandService(org.kie.server.services.api.KieContainerCommandService)

Example 3 with KieContainerCommandService

use of org.kie.server.services.api.KieContainerCommandService in project droolsjbpm-integration by kiegroup.

the class KieServerRestApplicationComponentService method getAppComponents.

@Override
public Collection<Object> getAppComponents(String extension, SupportedTransports type, Object... services) {
    // skip calls from other than owning extension
    if (!OWNER_EXTENSION.equals(extension)) {
        return Collections.emptyList();
    }
    KieContainerCommandService batchCommandService = null;
    for (Object object : services) {
        if (KieContainerCommandService.class.isAssignableFrom(object.getClass())) {
            batchCommandService = (KieContainerCommandService) object;
            break;
        }
    }
    List<Object> components = new ArrayList<Object>(1);
    if (SupportedTransports.REST.equals(type)) {
        components.add(new KieServerResource(batchCommandService));
    }
    return components;
}
Also used : ArrayList(java.util.ArrayList) KieContainerCommandService(org.kie.server.services.api.KieContainerCommandService) KieServerResource(org.kie.server.remote.rest.common.resource.KieServerResource)

Aggregations

KieContainerCommandService (org.kie.server.services.api.KieContainerCommandService)3 ArrayList (java.util.ArrayList)2 JMSException (javax.jms.JMSException)1 Message (javax.jms.Message)1 TextMessage (javax.jms.TextMessage)1 NamingException (javax.naming.NamingException)1 CommandScript (org.kie.server.api.commands.CommandScript)1 Marshaller (org.kie.server.api.marshalling.Marshaller)1 MarshallingFormat (org.kie.server.api.marshalling.MarshallingFormat)1 ReleaseId (org.kie.server.api.model.ReleaseId)1 ServiceResponsesList (org.kie.server.api.model.ServiceResponsesList)1 KieServerResource (org.kie.server.remote.rest.common.resource.KieServerResource)1 KieContainerInstance (org.kie.server.services.api.KieContainerInstance)1 KieServerExtension (org.kie.server.services.api.KieServerExtension)1 KieServerRegistry (org.kie.server.services.api.KieServerRegistry)1