Волокна против потоков: HTreeMap.put()

Я программирую многопоточный сервер, используя волокна из параллельной вселенной:

Главный сайт: http://docs.paralleluniverse.co/quasar/

Волокно: http://docs.paralleluniverse.co/quasar/javadoc/co/paralleluniverse/fibers/Fiber.html

HTreeMap: http://www.mapdb.org/javadoc/latest/mapdb/org/mapdb/HTreeMap.html

Я использую MapDB для реализации брокера сообщений: http://www.mapdb.org/

Каждое волокно должно иметь ссылку на карту / базу данных, предоставленную MapDB, чтобы он мог вызвать метод HTreeMap.put(), чтобы добавить себя на карту, чтобы другие волокна могли использовать HTreeMap.get() и получить ссылку на него. Волокно для маршрутизации сообщений.

Когда я пытаюсь вызвать HTreeMap.put() из любого Fiber, Fiber кажется зависает бесконечно, пытаясь поместить данные в карту. Это либо то, либо само волокно завершается при выполнении функции HTreeMap.put(), а другие потоки в приложении поддерживают его работу (не знаю почему). Если я использую более объемный класс Thread из стандартной Java, он работает без проблем. Мне было интересно, почему это так, и если я делаю что-то не так?

Я не могу позволить себе использовать потоки, так как мне нужно порождать их миллионами, а стандартные потоки Java не так масштабируются.

Это мой класс Брокера:

import aci89.proximity.BrokerID;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;

import java.io.File;
import java.util.Date;

public class MessageBroker
{
    private DB database;
    private DBMaker databaseMaker;
    private HTreeMap<String, BrokerID> messageBrokerMap;

    public MessageBroker()
    {
        File databaseFile = new File("MessageBrokerDatabase");

        databaseMaker = DBMaker.newFileDB(databaseFile);
        database = databaseMaker.make();

        messageBrokerMap = database.getHashMap("MessageBrokerDatabase");
    }

    public void addBrokerID(String emailAddress, BrokerID brokerID)
    {
        if (!messageBrokerMap.containsKey(emailAddress))
        {
            messageBrokerMap.put(emailAddress, brokerID);
        }
    }

    public void removeBrokerID(String emailAddress)
    {
        messageBrokerMap.remove(emailAddress);
        System.out.println((new Date()).toString() +
        " [INFORMATION] User " +
        emailAddress +
        " removed their details from the message broker");
    }

    public BrokerID getBrokerID(String emailAddress)
    {
        BrokerID brokerID = messageBrokerMap.get(emailAddress);
        return brokerID;
    }
}

Это мой код, который я выполняю в своем Fiber для добавления в HTreeMap:

BrokerID brokerID = new BrokerID(Fiber.currentFiber(), queue);
messageBroker.addBrokerID(emailAddress, brokerID);

BrokerID - мой пользовательский объект:

package aci89.proximity;

import co.paralleluniverse.fibers.Fiber;

import java.util.Queue;

public class BrokerID
{
    private Fiber fiber;
    private Queue queue;

    public BrokerID(Fiber fiber, Queue queue)
    {
        this.fiber = fiber;
        this.queue = queue;
    }

    public Fiber getFiber()
    {
        return fiber;
    }

    public Queue getQueue()
    {
        return queue;
    }
}

0 ответов

Другие вопросы по тегам