You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Wasim Bari (Jira)" <ji...@apache.org> on 2020/09/09 09:24:00 UTC

[jira] [Commented] (IGNITE-13415) Unable to read fields value from BinaryObject

    [ https://issues.apache.org/jira/browse/IGNITE-13415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17192734#comment-17192734 ] 

Wasim Bari commented on IGNITE-13415:
-------------------------------------

Both Producer and Consumer run in different jvms

> Unable to read fields value from BinaryObject
> ---------------------------------------------
>
>                 Key: IGNITE-13415
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13415
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 2.7, 2.8.1
>            Reporter: Wasim Bari
>            Priority: Blocker
>
> We are facing issue while retrieving values from binary objects if we use
> custom id mapper.
> We have two ignite clients.
> 1) Producer--> Creates cache and add entries to it.
> 2) Consumer--> Consumes cache entries created by producer. Reads data in
> BinaryObject form and extracts values from it.
> We notice that if we provide custom id mapper then consumer not able to
> fetch values from BinaryObject. It always returns null. However, if we do
> not
> provide custom id mapper, then we are able to fetch values from BinaryObject
> in consumer. Given are the java classes for your reference.
> Employee Class
> package com.myorg.ignite.producerconsumer;
> import java.io.Serializable;
> public class Employee implements Serializable{
>  private String empName;
>  private String deparment;
>  private float height;
>  private int experience;
>  
>  public Employee() {
>  
>  }
>  public Employee(String empName, String department, float height, int
> experience) {
>  this.empName = empName;
>  this.deparment = department;
>  this.height = height;
>  this.experience = experience;
>  }
>  public String getEmpName() {
>  return empName;
>  }
>  public void setEmpName(String empName) {
>  this.empName = empName;
>  }
>  public String getDeparment() {
>  return deparment;
>  }
>  public void setDeparment(String deparment) {
>  this.deparment = deparment;
>  }
>  public float getHeight() {
>  return height;
>  }
>  public void setHeight(float height) {
>  this.height = height;
>  }
>  public int getExperience() {
>  return experience;
>  }
>  public void setExperience(int experience) {
>  this.experience = experience;
>  }
> }
> Utility class for cache creation
> package com.myorg.ignite.producerconsumer;
> import java.util.Arrays;
> import org.apache.ignite.Ignite;
> import org.apache.ignite.Ignition;
> import org.apache.ignite.configuration.BinaryConfiguration;
> import org.apache.ignite.configuration.IgniteConfiguration;
> import org.apache.ignite.logger.slf4j.Slf4jLogger;
> import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
> import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
> import
> org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
> import com.myorg.ignite.custommapper.CustomBinaryIdMapper;
> public class CacheUtil {
>  public static String cacheName = "mycache";
>  public static String instanceName = "local-ignite";
>  
>  public static Ignite getIgniteInstance() {
>  IgniteConfiguration cfg = new IgniteConfiguration();
>  cfg.setIgniteInstanceName(instanceName);
>  cfg.setClientMode(true);
>  cfg.setGridLogger(new Slf4jLogger());
>  cfg.setBinaryConfiguration(getBinaryConfiguration());
>  
>  
>  TcpDiscoverySpi spi = new TcpDiscoverySpi();
>  TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
>  ipFinder.setAddresses(Arrays.asList("localhost"));
>  spi.setLocalPort(37508);
>  spi.setLocalPortRange(10);
>  TcpCommunicationSpi commSpi=new TcpCommunicationSpi();
> commSpi.setLocalPort(37509);
>  spi.setIpFinder(ipFinder);
> cfg.setDiscoverySpi(spi);
>  cfg.setCommunicationSpi(commSpi);
>  
>  return Ignition.start(cfg);
>  }
>  
>  private static BinaryConfiguration getBinaryConfiguration() {
>  BinaryConfiguration bc = new BinaryConfiguration();
>  CustomBinaryIdMapper imlIdMapper = new CustomBinaryIdMapper();
>  bc.setIdMapper(imlIdMapper);
>  return bc;
>  }
> }
> Producer class
> package com.myorg.ignite.producerconsumer;
> import java.io.Serializable;
> import javax.cache.Cache;
> import org.apache.ignite.Ignite;
> import org.apache.ignite.configuration.CacheConfiguration;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> public class CacheProducer {
>  private static final Logger LOG =
> LoggerFactory.getLogger(CacheProducer.class);
>  public static void main(String ...s) {
>  Ignite ignite = CacheUtil.getIgniteInstance();
>  Cache<String, Serializable> cache = createCache(CacheUtil.cacheName, ignite);
>  cache.getAndPut("emp1", new Employee("David", "Transport", 5.8f, 5));
>  cache.close();
>  
>  }
>  private static Cache<String, Serializable> createCache(String cacheName,
> Ignite ignite) {
>  CacheConfiguration<String, Serializable> cacheConfig = new
> CacheConfiguration<String, Serializable>();
>  cacheConfig.setName(cacheName);
>  cacheConfig.setIndexedTypes(String.class, Serializable.class);
>  Cache<String, Serializable> cache =
> ignite.getOrCreateCache(cacheConfig);
>  return cache;
>  }
> }
> Consumer class
> package com.myorg.ignite.producerconsumer;
> import javax.cache.Cache;
> import org.apache.ignite.Ignite;
> import org.apache.ignite.binary.BinaryField;
> import org.apache.ignite.binary.BinaryObject;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> public class CacheConsumer {
>  private static final Logger LOG =
> LoggerFactory.getLogger(CacheConsumer.class);
>  public static void main(String ...s) {
>  Ignite ignite = CacheUtil.getIgniteInstance();
>  //Cache<String, Serializable> cache = getCache(CacheUtil.cacheName,
> ignite);
>  Cache<String, BinaryObject> cache = ignite.cache(CacheUtil.cacheName).withKeepBinary();
>  BinaryObject bo = cache.get("emp1");
>  traversFields(bo, "empName");
>  traversFields(bo, "deparment");
>  traversFields(bo, "height");
>  }
> private static void traversFields(BinaryObject binaryObject, String fieldName) {
>  BinaryField bField = binaryObject.type().field(fieldName);
>  boolean flag = bField.exists(binaryObject);//Value returned is false.
>  Object val = bField.value(binaryObject);//Null value is returned
>  //LOG.info("fieldName - {}, doesFieldExist:{}, value:{}", fieldName, flag, val);
>  System.out.println("fieldName - "+fieldName+", doesFieldExist:"+flag+", value:"+val);
>  }
> }
> CustomID mapper (Note: We created a jar for this class and placed it in libs
> folder for apache ignite)
> package com.myorg.ignite.custommapper;
> import org.apache.ignite.binary.BinaryIdMapper;
> public class CustomBinaryIdMapper implements BinaryIdMapper {
> public int typeId(String typeName) {
>  // TODO Auto-generated method stub
>  System.out.println("Calling typeId, typename:"+typeName);
>  int hashCode = 31*typeName.hashCode()+47;
>  return hashCode;
>  }
> public int fieldId(int typeId, String fieldName) {
>  // TODO Auto-generated method stub
>  System.out.println("Calling fieldId, fieldName:"+fieldName);
>  int hashCode = 31*fieldName.hashCode()+47;
>  return hashCode;
>  }
> }
> ignite config file
> <beans xmlns="http://www.springframework.org/schema/beans"
>  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>  xsi:schemaLocation="http://www.springframework.org/schema/beans
>  http://www.springframework.org/schema/beans/spring-beans.xsd">
>  <bean id="ignite.cfg"
> class="org.apache.ignite.configuration.IgniteConfiguration">
> <property name = "binaryConfiguration">
>  <bean class =
> "org.apache.ignite.configuration.BinaryConfiguration">
>  <property name = "idMapper">
>  <bean class =
> "com.myorg.ignite.custommapper.CustomBinaryIdMapper">
>  </bean>
>  </property>
>  <property name="compactFooter" value="true"/>
>  </bean>
>  </property>
>  
>  <property name="dataStorageConfiguration">
>  <bean
> class="org.apache.ignite.configuration.DataStorageConfiguration">
>  <property name="defaultDataRegionConfiguration">
>  <bean
> class="org.apache.ignite.configuration.DataRegionConfiguration">
>  <property name="persistenceEnabled" value="true"/>
>  </bean>
>  </property>
>  </bean>
>  </property>
>  <property name="discoverySpi">
>  <bean
> class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
>  <property name="ipFinder">
>  
>  
>  <bean
> class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
>  <property name="addresses">
>  <list>
>  
>  <value>127.0.0.1:47500..47502</value>
>  </list>
>  </property>
>  </bean>
>  </property>
>  </bean>
>  </property>
>  </bean>
> </beans>



--
This message was sent by Atlassian Jira
(v8.3.4#803005)