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/>>
>>>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>>
>