Версия Portable for Hazelcast: Преобразование даты в длинные исключения исключения в предикатах

Я пытаюсь использовать com.hazelcast.nio.serialization.VersionedPortable для сериализации для класса Customer. Это не поддерживает сериализацию даты по умолчанию. Таким образом, мы должны преобразовать его в Long

@Override
public void writePortable(PortableWriter writer) throws IOException {
    if (dob != null) {
        Long dobLong = dob.getTime();
        writer.writeLong(DOB_FIELD, dobLong);
    } else {
        writer.writeLong(DOB_FIELD, -1);
    }
}

@Override
public void readPortable(PortableReader reader) throws IOException {
    if (reader.hasField(DOB_FIELD)) {
        Long dobLong = reader.readLong(DOB_FIELD);
        dob = dobLong == -1 ? null : new Date(dobLong);
    }
}

В CustomerService у меня есть findCustomersByDob, который использует com.hazelcast.query.Predicate

public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
    Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart);
    Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd);
    Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
    return idToCustomerMap.values(andPredicate);
}

в idToCustomerMap.values ​​(andPredicate); Я получаю следующее исключение.

java.lang.IllegalArgumentException: Невозможно преобразовать [Вторник 01, 00:00:00 IST 1980] в long в com.hazelcast.query.impl.TypeConverters$LongConverter.convert(TypeConverters.java:159) в com.hazelcast.query.impl.IndexImpl.convert(IndexImpl.java:154) в com.hazelcast.query.impl.IndexImpl.getSubRecords(IndexImpl.java:148) в com.hazelcast.query.Predicates$GreaterLessPredicate.filter(Predicates). на com.hazelcast.query.Predicates$AndPredicate.filter(Predicates.java:477) на com.hazelcast.query.impl.IndexService.query(IndexService.java:97) на com.hazelcast.map.impl.operation.QueryOperation.run(QueryOperation.java:92) в com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:137) в com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.un.java:309) в com.hazelcast.spi.impl.operationexecutor.classic.OperationThread.processPacket(OperationThread.java:142) в com.hazelcast.spi.impl.operationexecutor.classic.OperationThread.process(OperationThread.java:115) в com.hazelcast.spi.impl.operationexecutor.classic.OperationThread.doRun(OperationThread.java:101) в com.hazelcast.spi.impl.operationexecutor.classic.OperationThread.run(OperationThread.java:76) в ------ Завершить удаленный и начать локальную трассировку стека ------.(Неизвестный источник) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolveApplicationResponse(InvocationFuture.java:384) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolveApplicationResponseOrThrowException(InvocationFuture.java:334) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.get) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.get(InvocationFuture.java:204) в com.hazelcast.map.impl.client.AbstractMapQueryRequest.collectResults(AbstractMapQueryRequest.java:103 в com.hav.map.impl.client.AbstractMapQueryRequest.invoke(AbstractMapQueryRequest.java:77) в com.hazelcast.client.impl.client.InvocationClientRequest. 379) в java.util.concurrent.ThreadPoolExecutor.runWorker(неизвестный источник) в java.util.concurrent.ThreadPoolExecutor$Worker.run(неизвестный источник) в java.lang.Thread.run(неизвестный источник) в com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76) в com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:92) в ------ Завершить удаленный и начать локальную трассировку стека --- ---. (Неизвестный источник) в com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveResponse(ClientInvocationFuture.java:147) в com.hazelcast.client.spi.impl.ClientInvocationFuture.get(ClientInvocationFuture.java) в com.hazelcast.client.spi.impl.ClientInvocationFuture.get(ClientInvocationFuture.java:89) в com.hazelcast.client.spi.ClientProxy.invoke(ClientProxy.java:151) в com.hazelcast.client.proxy.ClientMapProxy.values ​​(ClientMapProxy.java:837) в com.foo.hazelcast.client.services.CustomerService.findCustomersByDob(CustomerServiceImpl.java:99) по адресу com.foo.hazelcast.client.services.CustomerServiceTest.searchCustomersByDobRange(CustomerServiceTest.java:104) по адресу sun.reflect.NativeMethodAccessor.hode (.jpg). Неизвестный источник) по адресу sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник) по адресу java.lang.reflect.Method.invoke(Неизвестный источник) по адресу org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod). org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) в org.junit.internal InvokeMethod.evaluate(InvokeMethod.java:17) в org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) по адресу org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) по адресу org.springframework.test.alletateCateTateTextej.jt RunAfterTestMethodCallbacks.java:86) по адресу org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) по адресу org.junit.runners.ParentRunner.runLeaf(ParentRunnerfrara: org: org: org: org: org: org: org: org: org: org: org: ifra.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJRunner.jr ParentRunner.java:290) в org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) в org.junit.runner.Parent. получить доступ к $000(ParentRunner.java:58) по адресу org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) в org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statements.RunAfterTests.ellcallCallCateCateCateCateCate.junit.runners..run(JUnit4TestReference.java:50) в org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) в org.eclipse.jdt.internal.junit.runner.RemoteTestTunner.RunoteTestTunner.java:459) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.Runner (Remote)) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Хотя очевидно, что исключение из-за этой специальной обработки Date, я хотел бы знать точную причину TypeConversion здесь. Я читал, что Hazelcast поддерживает данные в сериализованной форме. Так что это не должно быть проблемой, верно?

Кроме того, как мне преодолеть эту проблему?

РЕДАКТИРОВАТЬ: я исправил эту проблему, передавая date.getTime () в предикатах, а также

public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
    Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart.getTime());
    Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd.getTime());
    Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
    return idToCustomerMap.values(andPredicate);
}

Я предполагаю, что это потому, что Hazelcast поддерживает данные в сериализованной форме и, следовательно, запутывается, когда пытается долго сравнивать с датой в предикате.

Тем не менее, этот подход определенно не чище. Есть ли более чистый способ избежать этого в версии Portable?

1 ответ

@ Vinodhini-chockalingam, Portable предназначен для работы с разными языками, а не только с Java. Таким образом, вы можете написать значение из NodeJs и прочитать его из Java с помощью Portable. Вот почему вы не можете написать java.util.Date Объект для переноса напрямую. Вам необходимо преобразовать его в поддерживаемый тип.

И так как вы пишете Date как долго, Hazelcast распознает это поле как долго. Только вы знаете, что это поле даты. Затем, когда вам нужно запустить предикат, так как вы пишете это поле как долго, Hazelcast ожидает сравнения длинных значений. Это причина.

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