How to Register Marshaller and Schema for pojo containing LinkedHashMap<String,Object>
birari.kumar Feb 22, 2017 6:41 AMHello Team,
I am using infinispan server 8.2.4.
I need to store the data into RemoteCache<String, Employee> where Employee class contains one instance variable i.e LinkedHashMap<String, InnerEmployee > pair = new LinkedHashMap<String,InnerEmployee>();
I have created .proto file for the same and registered using ctx.registerProtoFiles().
But I am facing difficulty while registering marshallers for linkedHashMap I can not use writer.writeCollection().
How to register this marshaller containing LinkedHashMap ?
1] createRemoteCacheManager :
public RemoteCacheManager createRemoteCacheManager(String remoteAddress) throws TransportException{ RemoteCacheManager remoteCacheManager = null; try { ConfigurationBuilder clientBuilder = new ConfigurationBuilder(); Properties properties = getConfigurationProperties(); properties.put("infinispan.client.hotrod.server_list", remoteAddress + ":11222"); clientBuilder.connectionPool().withProperties(properties); clientBuilder.marshaller(new ProtoStreamMarshaller()); remoteCacheManager = new RemoteCacheManager(clientBuilder.build()); registerSchemasAndMarshallers(remoteCacheManager); }catch (TransportException exception) { LOG.error("TransportException in createRemoteCacheManager : " + exception.getMessage()); throw new TransportException("TransportException",new InetSocketAddress(11222)); }catch (Exception exception) { LOG.error("Exception in createRemoteCacheManager : " + exception.getMessage()); } return remoteCacheManager; }
2] 2] registerSchemasAndMarshallers :
private void registerSchemasAndMarshallers(RemoteCacheManager remoteCacheManager) throws IOException { SerializationContext ctx = ProtoStreamMarshaller.getSerializationContext(remoteCacheManager); ctx.registerProtoFiles(FileDescriptorSource.fromResources(InfinispanConstant.EMPLOYEE_RESOURCE)); ctx.registerMarshaller(new EmployeeMarshaller()); ctx.registerMarshaller(new InnerEmployeeMarshaller()); // Register the schemas with the server too RemoteCache<String, String> metadataCache = remoteCacheManager.getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME); metadataCache.put(InfinispanConstant.EMPLOYEE_RESOURCE, readResource(InfinispanConstant.EMPLOYEE_RESOURCE)); String errors = metadataCache.get(ProtobufMetadataManagerConstants.ERRORS_KEY_SUFFIX); if (errors != null) { throw new IllegalStateException("Some Protobuf schema files contain errors:\n" + errors); } }
3] Employee.java
import java.util.LinkedHashMap; public class Employee { private LinkedHashMap<String, InnerEmployee> pair; public Employee() { this.pair = new LinkedHashMap<String, Employee.InnerEmployee>(); } public LinkedHashMap<String, InnerEmployee> getPair() { return pair; } public void setPair(LinkedHashMap<String, InnerEmployee> pair) { this.pair = pair; } public class InnerEmployee { private String empNo; private String name; private String dateOfBirth; public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(String dateOfBirth) { this.dateOfBirth = dateOfBirth; } @Override public String toString() { return "Employee [empNo=" + empNo + ", name=" + name + ", dateOfBirth=" + dateOfBirth + "]"; } } }
4] EMPLOYEE_RESOURCE.proto
option java_package = "com.auruspay.infinispan.pojo"; option java_outer_classname = "Employee"; /* @Indexed(true) */ message Employee { repeated MapFieldEntry pairs = 1; } message MapFieldEntry { optional string key = 1; optional InnerEmployee value = 2; } message InnerEmployee { optional string empNo = 1; optional string name = 2; optional string dateOfBirth = 3; }
5] InnerEmployeeMarshaller.java
package com.auruspay.infinispan.marshaller; import java.io.IOException; import org.infinispan.protostream.MessageMarshaller; import com.auruspay.infinispan.pojo.Employee; public class InnerEmployeeMarshaller implements MessageMarshaller<Employee.InnerEmployee> { @Override public Class<? extends Employee.InnerEmployee> getJavaClass() { return Employee.InnerEmployee.class; } @Override public String getTypeName() { return "com.auruspay.infinispan.proto.InnerEmployee"; } @Override public Employee.InnerEmployee readFrom(ProtoStreamReader reader) throws IOException { Employee employee = new Employee(); Employee.InnerEmployee emp = employee. new InnerEmployee(); emp.setEmpNo(reader.readString("empNo")); emp.setName(reader.readString("name")); emp.setDateOfBirth(reader.readString("dateOfBirth")); return emp; } @Override public void writeTo(ProtoStreamWriter writer,Employee.InnerEmployee emp) throws IOException { writer.writeString("empNo", emp.getEmpNo()); writer.writeString("name", emp.getName()); writer.writeString("dateOfBirth", emp.getDateOfBirth()); } }
6] How EmployeeMarshaller should be designed ?
Thanks In Advance !!!