IllegalArgumentException при использовании ChronicleMap - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь написать программу, используя карту хроники. Я написал сервер UDP, который будет транслировать сообщение каждые 1 сек. UDP-клиент получит сообщение и сохранит его в хронической карте. Программы указаны ниже:

Программа сервера UDP:

public class UDPServer {

    public static void main(String[] args) {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket();
            byte[] buf = new byte[256];
            String messg = "Hello UDP Server\n";
            String transmittedMsg = null;
            int count = 0;

            while (true) {
                transmittedMsg = count + "";
                buf = transmittedMsg.getBytes();
                InetAddress address = InetAddress.getByName ("127.0.0.1");
                DatagramPacket packet = new DatagramPacket (buf, buf.length, address, 4000);
                socket.send(packet);

                Thread.sleep(1000);
                count++;
            }
        } catch (SocketTimeoutException ex) {
            System.out.println("Timeout error: " + ex.getMessage());
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Client error: " + ex.getMessage());
            ex.printStackTrace();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } finally {
            socket.close();
        }
    }
}

Программа клиента UDP:

public class UDPClient {

    public static void main(String[] args) {
        DatagramSocket socket = null;
        DatagramPacket packet = null;
        byte[] buf = new byte[256];
        ChronicleMap<String, String> cr = null;

        try {
            socket = new DatagramSocket(4000);
            InetAddress address = InetAddress.getByName ("127.0.0.1");

            while (true) {
                packet = new DatagramPacket(buf, buf.length, address, 5000);
                socket.receive(packet);
                String received = new String(packet.getData());
                System.out.println(received);

                cr = ChronicleMapBuilder.of(String.class, String.class)
                        .name("test-map")
                        .averageKey("Message")
                        .averageValue("0")
                        .entries(1)
                        .actualChunkSize(100)
                        .actualSegments(1)
                        .createPersistedTo(new File("D://test.txt"));

                cr.put("Message", received);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cr != null) {
                cr.close();
            }
        }
    }
}

Ниже приведено исключение, которое я получаю:

java.lang.IllegalArgumentException: ChronicleMap{name=test-map, file=D:\test.txt, identityHashCode=11583403}: Entry is too large: requires 68 chunks, 9 is maximum.
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.allocReturnCode(CompiledMapQueryContext.java:1805)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.allocReturnCodeGuarded(CompiledMapQueryContext.java:123)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.alloc(CompiledMapQueryContext.java:3468)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.initEntryAndKey(CompiledMapQueryContext.java:3502)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.putEntry(CompiledMapQueryContext.java:3995)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.doInsert(CompiledMapQueryContext.java:4184)
    at net.openhft.chronicle.map.MapEntryOperations.insert(MapEntryOperations.java:153)
    at net.openhft.chronicle.map.impl.CompiledMapQueryContext.insert(CompiledMapQueryContext.java:4107)
    at net.openhft.chronicle.map.MapMethods.put(MapMethods.java:88)
    at net.openhft.chronicle.map.VanillaChronicleMap.put(VanillaChronicleMap.java:724)
    at udp.client.UDPClient.main(UDPClient.java:38)

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 18 октября 2019

Очевидно, что полученная вами запись намного больше, чем

averageKey("Message")
averageValue("0")

, которую вы указали.

Вы также смешиваете конфигурации высокого уровня: averageKey(), averageValue(),entries() и низкоуровневые: actualChunkSize(), actualSegments(), что не рекомендуется.

...