Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Creating processes using the Active MQ interface #6183

Open
wants to merge 20 commits into
base: master
Choose a base branch
from

Conversation

matthias-ronge
Copy link
Collaborator

You can use this function to create processes using the Active MQ interface. Examples:

Without a catalog (all data is passed):

import java.util.*;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Main {
    public static void main(String[] args) { try {

        // Serververbindung
        Connection connection = new ActiveMQConnectionFactory("tcp://localhost:61616").createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("KitodoProduction.CreateNewProcesses.Queue");
        MessageProducer producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // Daten
        String processTitle = "TestAMQ";

        MapMessage message = session.createMapMessage();
        message.setString("id", processTitle); // "Betreff" (für Logging)

        message.setInt("project", 1); // Projekt-ID
        message.setInt("template", 3); // Produktionsvorlagen-ID
        message.setString("title", processTitle); // Vorgangstitel
        // message.setInt("parent", 14); // Elternvorgang

        Map<String, Object> metadata = new HashMap<>();
        metadata.put("docType", "Monograph"); // DocType

        List<String> collections = Arrays.asList("Drucke", "Varia.Drucke"); // Kollektionen
        metadata.put("singleDigCollection", collections);

        Map<String, Object> author = new HashMap<>(); // Metadatengruppe
        author.put("RoleCode", "aut");
        author.put("FirstName", "Max");
        author.put("LastName", "Mustermann");
        metadata.put("Person", author);

        message.setObject("metadata", metadata);

        // Daten senden
        producer.send(message);

        // Ende
        session.close();
        connection.close();

    } catch (Exception e) { e.printStackTrace(); }}
}

Or, use a catalog import:

import java.util.*;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Main {
    public static void main(String[] args) { try {

        // Serververbindung
        Connection connection = new ActiveMQConnectionFactory("tcp://localhost:61616").createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("KitodoProduction.CreateNewProcesses.Queue");
        MessageProducer producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // Daten
        String katKey = "1752355024";

        MapMessage message = session.createMapMessage();
        message.setString("id", katKey); // "Betreff" (für Logging)

        message.setInt("project", 1); // Projekt-ID
        message.setInt("template", 3); // Produktionsvorlagen-ID

        // Import-Einstellungen
        Map<String, Object> import1 = new HashMap<>();
        import1.put("importconfiguration", 1);
        import1.put("value", katKey);

        message.setObject("import", Arrays.asList(import1));

        // Daten senden
        producer.send(message);

        // Ende
        session.close();
        connection.close();

    } catch (Exception e) { e.printStackTrace(); }}
}

@matthias-ronge
Copy link
Collaborator Author

Metadata groups are supported. See also in the “send class” above:

Map<String, Object> author = new HashMap<>();
author.put("RoleCode", "aut");
author.put("FirstName", "Max");
author.put("LastName", "Mustermann");
metadata.put("Person", author);

@aetherfaerber
Copy link

We have already tested this branch several times and it works well for us so far.

@solth what would be needed for this to be merged?

@solth
Copy link
Member

solth commented Sep 23, 2024

@solth what would be needed for this to be merged?

For starters, there are conflicts that need to be resolved before this pull request can be merged. Additionally, it is a draft, so it seems @matthias-ronge is still working on it and hasn't deemed it ready for review, yet, himself.

@aetherfaerber
Copy link

aetherfaerber commented Sep 27, 2024

I must limit my previous statement to some extent.

We had tested creating processes by importing metadata froam a catalog. It works fine. We have now tested creating a process and passing its metadata vie ActiveMQ and have not been able to get it to work. We used the code given above but the only metadata field that was not empty aftewards was DocType. Of course we adapted the example to include only metadata fields that we have defined in our ruleset.
Could this be caused by our ruleset or does the functionality not work properly?

Also @matthias-ronge could you please comment on the previous statement? Is this a draft or a real PR? Can you add documentation and resolve the merge conflicts?

@matthias-ronge
Copy link
Collaborator Author

I had initially set the pull request as a draft to see if it would be sufficient to all your testings as well. Then I forgot to change it.

I will resolve the merge conflicts and I will take a closer look to the metadata, to see if this is a bug in the program or in the example code. Expect my reply soon.

@aetherfaerber
Copy link

aetherfaerber commented Oct 2, 2024

I will resolve the merge conflicts and I will take a closer look to the metadata, to see if this is a bug in the program or in the example code. Expect my reply soon.

Thank you for looking into it. FWIW, here is the sample code we used, adapted to our ruleset:

import java.util.*;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Main {
    public static void main(String[] args) { try {

        // Serververbindung
        Connection connection = new ActiveMQConnectionFactory("tcp://localhost:61616").createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("KitodoProduction.CreateNewProcesses.Queue");
        MessageProducer producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // Daten
        String processTitle = "TestAMQ9";

        MapMessage message = session.createMapMessage();
        message.setString("id", processTitle); // "Betreff" (für Logging)

        message.setInt("project", 2); // Projekt-ID
        message.setInt("template", 1); // Produktionsvorlagen-ID
        message.setString("title", processTitle); // Vorgangstitel

        Map<String, Object> metadata = new HashMap<>();
        metadata.put("document_type", "ThematicFile");
        metadata.put("delivery", "Lieferung42"); 
        metadata.put("archiveName", "archive42"); 
        metadata.put("ArcinsysID", "iid42");
        metadata.put("stockID", "stock42");
        metadata.put("stockUnitID", "stockunit42");
        metadata.put("unitID", "unit42");

        message.setObject("metadata", metadata);

        // Daten senden
        producer.send(message);

        // Ende
        session.close();
        connection.close();

    } catch (Exception e) { e.printStackTrace(); }}
}

The created process has no metadata besides the doctype.

@matthias-ronge
Copy link
Collaborator Author

I was able to reproduce the error. The code forgot to specify the location of the metadata storage, so when saving, it didn't know where to put it, and discarded it. I have now fixed that; the metadata is currently always stored in dmdSec, others are not yet possible.

@matthias-ronge matthias-ronge marked this pull request as ready for review October 2, 2024 11:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants