How to Register Marshaller and Schema for pojo containing LinkedHashMap<String,Object>
Hello Team,
I am using infinispan server 8.2.4.
I need to store the data into RemoteCache
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 RemoteCachemetadataCache = 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 pair; public Employee() { this.pair = new LinkedHashMap (); } public LinkedHashMap getPair() { return pair; } public void setPair(LinkedHashMap 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 { @Override public Class 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 !!!
Responses