On 3/18/2025 3:51 PM, Arne Vajhøj wrote:
I am happy to report that Spring Batch 4.3 works fine on
VMS x86-64 (and probably also on VMS Itanium, but not on
VMS Alpha due to too old Java version).
For database, XML, JSON and CSV the following jar files:
The code and configuration is the same as on any other platform.
Spring Batch can read/write from/to relational databases and a few NoSQL databases
as well: MongoDB, Neo4J and Redis.
Obviously it does not read/write VMS index-sequential files out of the box.
But since I happen to have a library allowing JVM languages to access VMS
index-sequential files, then creating a wrapper allowing Sping Batch to access
them was tempting.
So I did.
First the simple model with only one index-sequential file.
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.support.AbstractItemStreamItemReader;
import dk.vajhoej.isam.IsamException;
import dk.vajhoej.isam.IsamResult;
import dk.vajhoej.isam.IsamSource;
import dk.vajhoej.record.RecordException;
public class SingleIsamItemReader<T> extends AbstractItemStreamItemReader<T> {
private IsamSource source;
private Class<T> type;
private IsamResult<T> result;
public IsamSource getSource() {
return source;
}
public void setSource(IsamSource source) {
this.source = source;
}
public Class<T> getType() {
return type;
}
public void setType(Class<T> type) {
this.type = type;
}
@Override
public void open(ExecutionContext ec) {
try {
result = source.readStart(type);
} catch (IsamException e) {
throw new RuntimeException(e);
} catch (RecordException e) {
throw new RuntimeException(e);
}
}
@Override
public T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(result.read()) {
return result.current();
} else {
return null;
}
}
@Override
public void close() {
try {
result.close();
source.close();
} catch (IsamException e) {
throw new RuntimeException(e);
}
}
}
<bean id="foobarSource" class="dk.vajhoej.isam.local.LocalIsamSource">
<constructor-arg value="foobar.isq"/>
<constructor-arg value="dk.vajhoej.vms.rms.IndexSequential"/>
<constructor-arg value="true"/>
</bean>
<bean id="foobarReader" class="SingleIsamItemReader">
<property name="source" ref="foobarSource" />
<property name="type" value="somepackage.Foobar"/>
</bean>
import java.util.List;
import org.springframework.batch.item.support.AbstractItemStreamItemWriter;
import dk.vajhoej.isam.IsamSource;
public class SingleIsamItemWriter<T> extends AbstractItemStreamItemWriter<T> {
private IsamSource source;
public IsamSource getSource() {
return source;
}
public void setSource(IsamSource source) {
this.source = source;
}
@Override
public void write(List<? extends T> items) throws Exception {
for(T item : items) {
source.create(item);
}
}
}
<bean id="foobarSource" class="dk.vajhoej.isam.local.LocalIsamSource">
<constructor-arg value="foobar.isq"/>
<constructor-arg value="dk.vajhoej.vms.rms.IndexSequential"/>
<constructor-arg value="false"/>
</bean>
<bean id="foobarReader" class="SingleIsamItemWriter">
<property name="source" ref="foobarSource" />
</bean>
Arne