I have a program that requests values from RTI DDS based on a list of points (DynamicIoRunnable below). The DyamicIoRunnable will request a data instance for each point in the predefined list, it will put the data in a list and once it goes through all items in a predefined list, pass it onto a processor thread (DDSProcessor below - this is slimmed down to the relevant portion) through a shared BlockingQueue. This processor thread will process each item in the list and create a custom object (PointData) for each. To debug this problem, the DynamicIoRunnable only has a single predefined point so I can easily identify it. The issue is, that I am adding the PointData to a list and printing it out as it builds. The print statement before the add always shows the correct value, but as I iterate through the array with print statements after every add, after a few items, previous items change to different data and I am unsure how. Anyone see where things could be altered?
I have a sample results attached below. It shows the first corruption after a few cycles (the first 2 items that were initially added to the list change completely - this does get worse over a few more items and is always older items though I see no consistent pattern as to what the data changes to, when it will change or how many will change).
Shared Queue
public static BlockingQueue<Object> messageProcQueue = new LinkedBlockingQueue<Object>();
DynamicIoRunnable
public void run()
{
try
{
List<PointData> temp = new ArrayList();
for (PredefData a : TrendApp.predefPointList)
{
if (a.getDdsHandle() != null)
{
Object ioData = dds.getTopicRef().get(pv.getTypeString(a.getPointType().value())).read_io(a.getDdsHandle(), io -> io);
if (ioData != null)
{
PointData val = new PointData(a.getMachineId(), a.getPointType(), a.getIoId(), a.getSubfield(), a.getConfigId(), ioData);
temp.add(val);
}
}
}
TrendApp.messageProcQueue.put(temp);
} catch (Exception e)
{
errorLog.error("Unable to add dynamic IO to message processing queue");
e.printStackTrace();
}
}
DDSProcessor
private static List<PointData> writeBuffer = new ArrayList<PointData>();
if (a instanceof PointData)
{
PointData req = (PointData) a;
// Add new point to the buffer
System.out.println("Enter Point Data: " + req.getData());
writeBuffer.add(req);
for (int x = 0; x < writeBuffer.size(); x++)
{
System.out.println("Building Buffer = " + writeBuffer.get(x).getData());
}
}
PointData Object
private int machineId;
private jPointType pointType;
private int ioId;
private String subfield;
private int configId;
private long timestamp;
private Object data;
public PointData(int machineId, jPointType pointType, int ioId, String subfield, int configId, Object data)
{
this.machineId = machineId;
this.ioId = ioId;
this.pointType = pointType;
this.subfield = subfield;
this.configId = configId;
this.data = data;
}
Example Results
Add Point Data to list:
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0