That worked perfectly, thanks a lot!

It seems you can also cast a lambda to serializable:

...
return new LambdaStrategy((Predicate<Integer> & Serializable)(x) -> false);
...

Sam



On 9 September 2015 at 09:27, Denis Magda <[email protected]> wrote:

> Sam,
>
> I've figured out a reason.
>
> In order to serialize and deserialize a lambda expression the expression
> must be referred by a Serializable reference or must be cast to
> Serializable. This is a compiler requirement.
>
> To make your code workable you can extend Predicate with your own
> interface that extends Serializable as well:
>
> class LambdaStrategy extends Strategy {
>     private final SerializablePredicate<Integer> predicate;
>
>     public LambdaStrategy(SerializablePredicate<Integer> predicate) {
>         this.predicate = predicate;
>     }
> }
> interface SerializablePredicate<T> extends Predicate<T>, *Serializable* {
>
> }
>
>
> This is not the only one existed solution. Take a look at
> ComputeClosureExample source code that is a part of Apache Ignite.
>
>
> Regards,
> Denis
>
>
> On 9/9/2015 10:33 AM, Sam Adams wrote:
>
> Thanks!
> On 9 Sep 2015 07:42, "Denis Magda" < <[email protected]>
> [email protected]> wrote:
>
>> Sam,
>>
>> I'll check this on my side and will return with an answer soon.
>>
>>
>> Thanks,
>> Denis
>>
>> On 9/8/2015 4:51 PM, Sam Adams wrote:
>>
>> Here's a slightly simplified, self-contained class.
>>
>> Returning Strategy works, returning LambdaStrategy fails.
>>
>> Thanks,
>>
>> Sam
>>
>> ---
>>
>> package simulator;
>>
>> import static java.util.stream.Collectors.toList;
>>
>> import java.util.Collection;
>> import java.util.List;
>> import java.util.function.Predicate;
>> import java.util.stream.IntStream;
>>
>> import org.apache.ignite.Ignite;
>> import org.apache.ignite.Ignition;
>> import org.apache.ignite.cluster.ClusterGroup;
>> import org.apache.ignite.lang.IgniteCallable;
>>
>> public class IgniteLambdaTest {
>> public static void main(String args[]) throws Exception {
>> new IgniteLambdaTest().run();
>> }
>> protected void run() {
>> try (Ignite ignite =
>> Ignition.start("C:\\Development\\ignite\\libs\\vrs\\ignite-config.xml")) {
>> ClusterGroup remotes = ignite.cluster().forRemotes();
>> List<TestJob> jobs = IntStream.range(0, 100).mapToObj((x) -> new
>> TestJob()).collect(toList());
>> Collection<Strategy> result = ignite.compute(remotes).call(jobs);
>> result.stream().forEach(System.out::println);
>> }
>> }
>> static class TestJob implements IgniteCallable<Strategy> {
>> private static final long serialVersionUID = 1L;
>> @Override
>> public Strategy call() throws Exception {
>> //return new Strategy();
>> return new LambdaStrategy((x) -> false);
>> }
>> }
>> }
>>
>> class Strategy {
>> }
>>
>> class LambdaStrategy extends Strategy {
>> private final Predicate<Integer> predicate;
>> public LambdaStrategy(Predicate<Integer> predicate) {
>> this.predicate = predicate;
>> }
>> }
>>
>> On 8 September 2015 at 14:20, Denis Magda < <[email protected]>
>> [email protected]> wrote:
>>
>>> Please, see below
>>>
>>> On 9/8/2015 4:03 PM, Sam Adams wrote:
>>>
>>> Hi,
>>>
>>> I have peer class loading enabled in my XML config:
>>>
>>>         <property name="peerClassLoadingEnabled" value="true"/>
>>>
>>> I assume this is equivalent?
>>>
>>> Yes, it is.
>>>
>>>
>>> Making TestJob static doesn't fix the issue.
>>>
>>> Is SimulationJob class also marked with 'static'?
>>>
>>> Is LambdaStrategy defined as an inner class? If so, then please make
>>> sure that it's labeled with 'static' as well.
>>>
>>>
>>> Regards,
>>> Denis
>>>
>>>
>>> Thanks,
>>>
>>> Sam
>>>
>>> On 8 September 2015 at 12:37, Denis Magda < <[email protected]>
>>> [email protected]> wrote:
>>>
>>>> Hi Sam,
>>>>
>>>> Lambda should work fine.
>>>>
>>>> Please try to do the following and let me know if anything helps.
>>>> - enable peer-class loading feature with
>>>> IgniteConfiguration.setPeerClassLoading;
>>>> - mark TestJob class with static keyword. This will avoid serialization
>>>> of an enclosing class TestJob belongs to.
>>>>
>>>> Regards,
>>>> Denis
>>>>
>>>>
>>>> On 9/8/2015 2:20 PM, Sam Adams wrote:
>>>>
>>>> Hi,
>>>> It looks like I'm unable to return a lambda from a compute job.
>>>> Here is the stack trace:
>>>> Exception in thread "main" class org.apache.ignite.IgniteException:
>>>> Failed to find class with given class loader for unmarshalling (make sure
>>>> same version of all classes are available on all nodes or enable
>>>> peer-class-loading): sun.misc.Launcher$AppClassLoader@c387f44 at
>>>> org.apache.ignite.internal.util.IgniteUtils.convertException(IgniteUtils.java:684)
>>>> at
>>>> org.apache.ignite.internal.IgniteComputeImpl.call(IgniteComputeImpl.java:352)
>>>> at simulator.IgniteLambdaTest.run(IgniteLambdaTest.java:40) at
>>>> simulator.IgniteLambdaTest.main(IgniteLambdaTest.java:31) Caused by: class
>>>> org.apache.ignite.IgniteCheckedException: Failed to find class with given
>>>> class loader for unmarshalling (make sure same version of all classes are
>>>> available on all nodes or enable peer-class-loading):
>>>> sun.misc.Launcher$AppClassLoader@c387f44 at
>>>> org.apache.ignite.marshaller.optimized.OptimizedMarshaller.unmarshal(OptimizedMarshaller.java:242)
>>>> at
>>>> org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:693)
>>>> at
>>>> org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:932)
>>>> at
>>>> org.apache.ignite.internal.processors.task.GridTaskProcessor$JobMessageListener.onMessage(GridTaskProcessor.java:1156)
>>>> at
>>>> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:761)
>>>> at
>>>> org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:59)
>>>> at
>>>> org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:724)
>>>> at
>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>>>> at
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>>>> at java.lang.Thread.run(Thread.java:745) Caused by:
>>>> java.lang.ClassNotFoundException:
>>>> simulator.IgniteLambdaTest$SimulationJob$$Lambda$144/739267424 at
>>>> java.lang.Class.forName0(Native Method) at
>>>> java.lang.Class.forName(Class.java:348) at
>>>> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:7911)
>>>> at
>>>> org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:177)
>>>> at
>>>> org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.classDescriptor(OptimizedMarshallerUtils.java:252)
>>>> at
>>>> org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readObjectOverride(OptimizedObjectInputStream.java:246)
>>>> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365) at
>>>> org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readFields(OptimizedObjectInputStream.java:419)
>>>> at
>>>> org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readSerializable(OptimizedObjectInputStream.java:507)
>>>> at
>>>> org.apache.ignite.marshaller.optimized.OptimizedClassDescriptor.read(OptimizedClassDescriptor.java:751)
>>>> at
>>>> org.apache.ignite.marshaller.optimized.OptimizedObjectInputStream.readObjectOverride(OptimizedObjectInputStream.java:252)
>>>> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365) at
>>>> org.apache.ignite.marshaller.optimized.OptimizedMarshaller.unmarshal(OptimizedMarshaller.java:236)
>>>> ... 9 more
>>>> Here is a minimal test case:
>>>>
>>>> protected void run() throws Exception {
>>>> try (Ignite ignite = Ignition.start(igniteConfigPath)) {
>>>> ClusterGroup remotes = ignite.cluster().forRemotes();
>>>> List<SimulationJob> jobs = IntStream.range(0, 100).mapToObj((x) -> new
>>>> TestJob()).collect(toList());
>>>> Collection<LambdaStrategy<?>> result =
>>>> ignite.compute(remotes).call(jobs);
>>>> result.stream().forEach(System.out::println);
>>>> }
>>>> }
>>>> class TestJob implements IgniteCallable<LambdaStrategy<?>> {
>>>> @Override
>>>> public LambdaStrategy<Object> call() throws Exception {
>>>> return new LambdaStrategy<Object>((x) -> false);
>>>> }
>>>> }
>>>>
>>>> Is this a known issue/limitation?
>>>>
>>>> Thanks,
>>>>
>>>> Sam
>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>

Reply via email to