Hi Denis:

        I tried compute.call(new ExampleServiceImplA());

        But if my service is by ModuleA.ExampleServiceImpl call 
ModuleB.ExampleServiceImpl,
        and ModuleB.ExampleServiceImpl call other complicated service.
        
        The ModuleA only has ExampleServiceImpl there is none ModuleB.other 
service.
        It does not work.


> 在 2015年11月10日,下午9:55,Denis Magda <[email protected] 
> <mailto:[email protected]>> 写道:
> 
> It should fail because you send your service impl inside of Callable
> compute.call(new Callable(new ExampleServiceImplA()));
> 
> Callable is loaded by application class loader and presents on both the 
> sender and receiver. This leads to the situation when the receiver tries to 
> loads ExampleServiceImplA using the app class loader as well.
> 
> To avoid this try to implement IgniteCallable by ExampleServiceImplA and send 
> the task this way:
> 
> compute.call(new ExampleServiceImplA());
> 
> 
> > I think. If I have lots of type servers. It will be ExampleServiceImpl1 2 3 
> > 4 5….,will look very bloated.
> 
> You can use java 8 closures sending a particular one depending on a server 
> type. Will it work for you?
> https://apacheignite.readme.io/docs/distributed-closures 
> <https://apacheignite.readme.io/docs/distributed-closures>
> 
> 
> Regards,
> Denis
> On 11/10/2015 4:31 PM, 姜 为 wrote:
>> Hi Denis,
>> 
>>      I tried your suggested,  here is the code : 
>> <https://github.com/wmz7year/ignite-test/commit/4eaa4231e165eaa4de00dab94cd394f629e68497>https://github.com/wmz7year/ignite-test/commit/4eaa4231e165eaa4de00dab94cd394f629e68497
>>  
>> <https://github.com/wmz7year/ignite-test/commit/4eaa4231e165eaa4de00dab94cd394f629e68497>
>>      
>>      But I still got ClassNotFoundException.
>> 
>>      <邮件附件.png>
>> 
>> 
>>      I think. If I have lots of type servers. It will be ExampleServiceImpl1 
>> 2 3 4 5….,will look very bloated.
>>      
>> 
>>> 在 2015年11月10日,下午8:02,Denis Magda < 
>>> <mailto:[email protected]>[email protected] 
>>> <mailto:[email protected]>> 写道:
>>> 
>>> Jiang,
>>> 
>>> This exception happens exactly because you have two implementations with 
>>> the same name. If the names were different you wouldn't get to the point of 
>>> checksum validation.
>>> Here I fully share Val's opinion that checksum's verification shouldn't be 
>>> optional and it's a responsibility of an application to take care of such 
>>> situations.
>>> 
>>> I see the following approaches you can use in your code to get required 
>>> behavior:
>>> 
>>> 1) As suggested below use the approach with Serializable + 
>>> serialVersionUID. It will work;
>>> 
>>> 2) More preferable is to have different implementations with different 
>>> names (ExampleServiceImpl1, ExampleServiceImpl2, etc...). Is there any 
>>> reasons you can't use this straightforward approach?
>>> When the implementations are ready you can put their classes onto every 
>>> machine in order to have them in the classpath or you can leverage 
>>> IgniteConfiguration.peerClassLoadingEnabled feature.
>>> The feature allows to load missing classes from a machine that sends 
>>> compute based tasks onto a machine that will execute a task and you don't 
>>> need to copy implementations' classes manually at all. 
>>> You can read more on this here: 
>>> https://apacheignite.readme.io/docs/zero-deployment 
>>> <https://apacheignite.readme.io/docs/zero-deployment>
>>> 
>>> Regards,
>>> Denis
>>> 
>>> On 11/10/2015 10:39 AM, 姜 为 wrote:
>>>> Hi:
>>>> 
>>>>    Here is example: https://github.com/wmz7year/ignite-test 
>>>> <https://github.com/wmz7year/ignite-test>
>>>> 
>>>>    First start ModuleB, then start ModuleA.
>>>> 
>>>>    ModuleB ExampleServiceImpl has three field.
>>>> 
>>>>     ModuleA ExampleServiceImpl has only one field.
>>>> 
>>>>    Then throw Exception :
>>>> 
>>>>    <邮件 附件.png>
>>>>> 在 2015年11月10日,下午2:48,Denis Magda <[email protected] 
>>>>> <mailto:[email protected]>> 写道:
>>>>> 
>>>>> Hi,
>>>>> 
>>>>> +1 to Val.
>>>>> 
>>>>> Actually if you have different class names on different machines 
>>>>> (DataEntity, ServiceEntity) I don't realize how you can get to the 
>>>>> checksum validation stage.
>>>>> In my understanding you should have caught ClassNotFoundException.
>>>>> 
>>>>> Provide me with a full runnable example, I'll run and see what you're 
>>>>> trying to implement and at which point you fail.
>>>>> 
>>>>> --
>>>>> Denis
>>>>> 
>>>>> On 11/10/2015 9:30 AM, Valentin Kulichenko wrote:
>>>>>> Hi,
>>>>>> 
>>>>>> I'm against optional checksum verification. It's not safe, adds one more
>>>>>> configuration property and I don't see any use case that can require 
>>>>>> this.
>>>>>> 
>>>>>> I also don't completely understand what you're trying to achieve. Can you
>>>>>> please describe the sequence of serialization/deserialization events that
>>>>>> you expect in your application?
>>>>>> 
>>>>>> -Val
>>>>>> 
>>>>>> On Mon, Nov 9, 2015 at 5:13 PM, 姜 为 < 
>>>>>> <mailto:[email protected]>[email protected] 
>>>>>> <mailto:[email protected]>> wrote:
>>>>>> 
>>>>>>> Hi:
>>>>>>> 
>>>>>>>         The implementations name maybe not same.
>>>>>>> 
>>>>>>>         Like my example:
>>>>>>> 
>>>>>>>         class DataEntity {
>>>>>>>                 Integer id;
>>>>>>>                 string name;
>>>>>>>                 Integer age;
>>>>>>> 
>>>>>>>                 ….. and other
>>>>>>> 
>>>>>>>                 Externalizable.read(in){
>>>>>>>                         if(in.readBoolean()) {
>>>>>>>                 id = in.readInt();
>>>>>>>             }
>>>>>>>                         same as name,age...
>>>>>>>                 }
>>>>>>> 
>>>>>>>         Externalizable.write(out){
>>>>>>>             out.writeBoolean(id != null);
>>>>>>>             if(id != null) {
>>>>>>>                 out.writeInt(id);
>>>>>>>             }
>>>>>>>             same as name,age...
>>>>>>>         }
>>>>>>>         }
>>>>>>> 
>>>>>>>         class ServiceEntity {
>>>>>>>                 Integer id;
>>>>>>>                 Integer age;
>>>>>>> 
>>>>>>>                 …. and other
>>>>>>> 
>>>>>>>                 Externalizable.read(in){
>>>>>>>                         if(in.readBoolean()) {
>>>>>>>                 id = in.readInt();
>>>>>>>             }
>>>>>>>             if(in.readBoolean()) {
>>>>>>>                 in.readString(); // ignore name
>>>>>>>             }
>>>>>>>             if(in.readBoolean()) {
>>>>>>>                 age = in.readInt();
>>>>>>>             }
>>>>>>>                         … and other
>>>>>>>                 }
>>>>>>> 
>>>>>>>         Externalizable.write(out){
>>>>>>>             out.writeBoolean(id != null);
>>>>>>>             if(id != null) {
>>>>>>>                 out.writeInt(id);
>>>>>>>             }
>>>>>>>             out.writeBoolean(false); // null for name
>>>>>>>                        out.writeBoolean(age != null);
>>>>>>>             if(age != null) {
>>>>>>>                 out.writeInt(age);
>>>>>>>             }
>>>>>>>                     … and other
>>>>>>>         }
>>>>>>>         }
>>>>>>> 
>>>>>>>         The other implementation class can be serialized and 
>>>>>>> deserialized
>>>>>>> custom rules by Externalizable.read and Externalizable.write.
>>>>>>>         Each of the different types of servers property needs are
>>>>>>> different,it does not require a complete serialization.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> 在 2015年11月9日,下午10:22,Denis Magda < 
>>>>>>>> <mailto:[email protected]>[email protected] 
>>>>>>>> <mailto:[email protected]>> 写道:
>>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> As I understand both servers have different implementations but the
>>>>>>> names of those implementations are the same, correct?
>>>>>>>> Because otherwise I don't see how your code could get to the point of
>>>>>>> checksum validation if one implementation's name is ServiceEntity while 
>>>>>>> the
>>>>>>> other's is DataEntity.
>>>>>>>> If my assumptions above are correct then I would recommend to do the
>>>>>>> following:
>>>>>>>> 1) Extend Serializable instead of Externalizable
>>>>>>>> 
>>>>>>>> interface Entity extends Serializable {
>>>>>>>>     .....
>>>>>>>> }
>>>>>>>> 
>>>>>>>> 2) Add custom serialVersionUID to each implementation. This will help
>>>>>>> you get rid off checksum related exception
>>>>>>>> class EntityImpl implements Entity {
>>>>>>>> private static final long serialVersionUID = 0L;
>>>>>>>> ......
>>>>>>>> }
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Regards,
>>>>>>>> Denis
>>>>>>>> 
>>>>>>>> On 11/8/2015 3:27 PM, 姜 为 wrote:
>>>>>>>>> Hi guys:
>>>>>>>>> 
>>>>>>>>>      I’m using ignite 1.4.
>>>>>>>>>      In IgniteCompute.call will transfer of an object to the cluster.
>>>>>>>>>     The object should implement Serializable or Externalizable
>>>>>>> interface.
>>>>>>>>>     OptimizedClassDescriptor.read method will check whether the object
>>>>>>> is in the same class.
>>>>>>>>>     In my use case,I have some type of servers in cluster.
>>>>>>>>>     The server type A will check the business,and the server type B
>>>>>>> will persistent data.
>>>>>>>>>     There is a entity interface Entity extends Externalizable have
>>>>>>> different implementations on different servers.
>>>>>>>>>     Such like this:
>>>>>>>>> 
>>>>>>>>>     interface Entity extends Externalizable {
>>>>>>>>>      method a();
>>>>>>>>>      method b();
>>>>>>>>>              method c();
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      class  ServiceEntity implements Entity {
>>>>>>>>>      method a(){
>>>>>>>>>              // do something...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      method b(){
>>>>>>>>>              // do something...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      method c(){
>>>>>>>>>              throw new UnsupportedException...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      Externalizable.read...
>>>>>>>>>      Externalizable.write...
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>>     class DataEntity implements Entity {
>>>>>>>>>      method a(){
>>>>>>>>>              // do something...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      method b(){
>>>>>>>>>              throw new UnsupportedException...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      method c(){
>>>>>>>>>              // do something...
>>>>>>>>>      }
>>>>>>>>> 
>>>>>>>>>      Externalizable.read...
>>>>>>>>>      Externalizable.write...
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>     And IgniteCompute.call(new IgniteCallable(
>>>>>>>>>              public Object call(){
>>>>>>>>>                      Entity.a() or b and c;..
>>>>>>>>>              }
>>>>>>>>>      ));
>>>>>>>>> 
>>>>>>>>>    Different implementations of the same class are to achieve read and
>>>>>>> write methods.
>>>>>>>>>    But OptimizedClassDescriptor.read will check the class sum and 
>>>>>>>>> throw
>>>>>>> ClassNotFoundException.
>>>>>>>>>    I recommend verifyChecksum object set as optional,and I really need
>>>>>>> is change.
>>>>>>>>>    Here is my pr:
>>>>>>>>>    https://issues.apache.org/jira/browse/IGNITE-1854 
>>>>>>>>> <https://issues.apache.org/jira/browse/IGNITE-1854> <
>>>>>>> https://issues.apache.org/jira/browse/IGNITE-1854 
>>>>>>> <https://issues.apache.org/jira/browse/IGNITE-1854>> <
>>>>>>> https://issues.apache.org/jira/browse/IGNITE-1854 
>>>>>>> <https://issues.apache.org/jira/browse/IGNITE-1854>> <
>>>>>>> https://issues.apache.org/jira/browse/IGNITE-1854 
>>>>>>> <https://issues.apache.org/jira/browse/IGNITE-1854>>
>>>>>>>>>        
>>>>>>>>> <https://github.com/apache/ignite/pull/200/>https://github.com/apache/ignite/pull/200/
>>>>>>>>>  <https://github.com/apache/ignite/pull/200/> <
>>>>>>> https://github.com/apache/ignite/pull/200/ 
>>>>>>> <https://github.com/apache/ignite/pull/200/>> <
>>>>>>> https://github.com/apache/ignite/pull/200/ 
>>>>>>> <https://github.com/apache/ignite/pull/200/>> <
>>>>>>> https://github.com/apache/ignite/pull/200/ 
>>>>>>> <https://github.com/apache/ignite/pull/200/>>
>>>>>>>>> 
>>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to