Hi Denis,

        This is not what I want ,but it works for my service.
        Thank you!

Jiang

> 在 2015年11月11日,下午9:00,Denis Magda <dma...@gridgain.com> 写道:
> 
> Hi Jiang,
> 
> I'm a bit confused why you can't give different names to the services located 
> in different modules. If each service has a different name then my approach 
> will work for you, doesn't it?
> 
>       But if my service is by ModuleA.ExampleServiceImpl call 
> ModuleB.ExampleServiceImpl,
>       and ModuleB.ExampleServiceImpl call other complicated service.
> 
> 
> Could you provide me with the code showing what you're trying to achieve.
> 
> BTW, you use service notion in the thread. Probably you can implement 
> everything using Ignite Services module:
> https://apacheignite.readme.io/docs/service-grid 
> <https://apacheignite.readme.io/docs/service-grid>
> What do you think?
> 
> 
> Regards,
> Denis
> 
> On 11/11/2015 5:54 AM, 姜 为 wrote:
>> 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 <dma...@gridgain.com 
>>> <mailto:dma...@gridgain.com> <mailto:dma...@gridgain.com 
>>> <mailto:dma...@gridgain.com>>> 写道:
>>> 
>>> 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> 
>>> <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
>>>>  
>>>> <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:dma...@gridgain.com 
>>>>> <mailto:dma...@gridgain.com>>dma...@gridgain.com 
>>>>> <mailto:dma...@gridgain.com><mailto:dma...@gridgain.com 
>>>>> <mailto:dma...@gridgain.com>>> 写道:
>>>>> 
>>>>> 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> 
>>>>> <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> 
>>>>>> <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 <dma...@gridgain.com 
>>>>>>> <mailto:dma...@gridgain.com> <mailto:dma...@gridgain.com 
>>>>>>> <mailto:dma...@gridgain.com>>> 写道:
>>>>>>> 
>>>>>>> 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:ydswcy...@gmail.com 
>>>>>>>> <mailto:ydswcy...@gmail.com>>ydswcy...@gmail.com 
>>>>>>>> <mailto:ydswcy...@gmail.com><mailto:ydswcy...@gmail.com 
>>>>>>>> <mailto:ydswcy...@gmail.com>>> 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:dma...@gridgain.com 
>>>>>>>>>> <mailto:dma...@gridgain.com>>dma...@gridgain.com 
>>>>>>>>>> <mailto:dma...@gridgain.com><mailto:dma...@gridgain.com 
>>>>>>>>>> <mailto:dma...@gridgain.com>>> 写道:
>>>>>>>>>> 
>>>>>>>>>> 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://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/ 
>>>>>>>>> <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