考虑这样的通用方法定义:
public static <T> T getParameter(final Context context, final ContextParameter contextParameter, final Class<T> clazz) {
return (T) context.get(contextParameter.name());
}
Run Code Online (Sandbox Code Playgroud)
在尝试像List <String>这样的通用对象之前,可以完美地获取任何类型的对象.我能使它工作的唯一方法是这样的:
final List<String> fileNames =
(List<String>) ContextUtils.getParameter(context,
ContextParameter.EOF_FILE_NAMES_TO_ZIP, List.class);
Run Code Online (Sandbox Code Playgroud)
但这需要额外的演员阵容,从而消除了使用该方法的目的.有没有办法提供List<String>.class或类似的方法?(我知道类型擦除可以防止List<String>存在,但也许有办法做到这一点).
注意:使其工作我的意思是没有类型安全警告.我知道代码可以正常工作,但它不是类型安全的.
我想知道我何时创建自己的无限流,Stream.generate标准库中的Streams如何停止...
例如,当您有一个包含记录的列表时:
List<Record> records = getListWithRecords();
records.stream().forEach(/* do something */);
Run Code Online (Sandbox Code Playgroud)
流不会无限并且永远运行,但是当遍历列表中的所有项时它将停止.但是这有什么作用呢?相同的功能适用于由Files.lines(path)(源:http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/)创建的流.
第二个问题,如何Stream.generate以相同的方式停止创建流?
我一直想知道应该如何处理这种异常现象:
但是,如何避免JPA LazyInitialization异常呢?DTO转换可能需要Lazy Fetched数据,但由于服务层处理了事务,因此无法进行转换.
有一些我能想到的方法,但都是丑陋的.将DTO转换放在服务层中对我来说似乎是最好的.
当我偶然发现一些我不明白为什么这样做的事情时,我正在查看反应流规范的Publisher(AsyncIterablePublisher.java)的示例实现.
static interface Signal {};
enum Cancel implements Signal { Instance; };
enum Subscribe implements Signal { Instance; };
enum Send implements Signal { Instance; };
Run Code Online (Sandbox Code Playgroud)
说实话,我不是这样一个高级程序员,而是写这篇文章的人,我确信有理由这样做.但是我也无法解释为什么它会比这更好(这就是我会这样做的).
enum Signal {
Cancel,
Subscribe,
Send;
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么会更好吗?优点缺点?
在用于配置步骤的Spring Batch 文档中,清晰的图片描述了如何执行读取过程和写入.
read
process
...
read
process
// until #amountOfReadsAndProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)
对应(根据文件):
List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
Object item = itemReader.read()
Object processedItem = itemProcessor.process(item);
items.add(processedItem);
}
itemWriter.write(items);
Run Code Online (Sandbox Code Playgroud)
但是,当我在读取器的read方法中调试并设置断点并在处理器的process方法中设置断点时,我看到以下行为:
read
...
read
// until #amountOfReads = commit interval
process
...
process
// until #amountOfProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)
那么文档错了吗?或者我错过了一些配置,使其行为像文档(没有找到任何东西).
我遇到的问题是每个后续读取现在取决于处理器的状态.读取器是并行读取两个源的复合,取决于其中一个源中的读取项,在一次读取操作期间仅读取第一个,第二个或两个源.但是要在处理器中进行读取的源的状态.目前唯一的解决方案是使用commit-interval 1,这对于性能来说不是最佳的.
我必须处理一个包含预定义记录布局的固定宽度文件,存在多种类型的记录,并且记录的第一个字符决定了它的类型。因为它是固定宽度,所以在一行中并不总是可以容纳整个记录类型,所以第二个字符是记录的序列号。例如:
0This is the header record------------------------------------
1This is another record always existing out of one lin--------
21This is a record that can be composed out of multiple parts.
22This is the second part of record type 2--------------------
21This is a new record of type 2, first part.-----------------
22This is the second part of record type 2--------------------
23This is the third part of record type 2---------------------
...
Run Code Online (Sandbox Code Playgroud)
使用 Stream API,我想解析这个文件:
Stream<String> lines = Files.lines(Paths.get(args[1]));
lines.map(line -> RecordFactory.createRecord(line)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是由于这个流是逐行传递的,当它解析记录类型 2 的第一行(记录类型 2 …
所以我试图解析一个xml并将其解组成一个程序.这是xml的示例:
<MaintenanceTransaction:provideCommunicationEvents_BatchRequest
xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MaintenanceTransaction:maintenanceTransaction>
<MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:identifier>FINACLE</MaintenanceTransaction:identifier>
</MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:transactionDate>2014-06-21T19:00:32.356+01:00</MaintenanceTransaction:transactionDate>
<MaintenanceTransaction:maintenanceTransactionType>PRE-NOTIFICATION
</MaintenanceTransaction:maintenanceTransactionType>
<MaintenanceTransaction:maintenanceEntries>
<MaintenanceTransaction:hasNewValues xsi:type="MaintenanceTransaction:DepositArrangement">
<MaintenanceTransaction:enterpriseId xsi:type="MaintenanceTransaction:ArrangementIdentifier">
<MaintenanceTransaction:identifier>222000000322</MaintenanceTransaction:identifier>
<MaintenanceTransaction:enterpriseIdType>Term Deposit</MaintenanceTransaction:enterpriseIdType>
</MaintenanceTransaction:enterpriseId>
<MaintenanceTransaction:maturityDate>2014-10-08</MaintenanceTransaction:maturityDate>
</MaintenanceTransaction:hasNewValues>
</MaintenanceTransaction:maintenanceEntries>
</MaintenanceTransaction:maintenanceTransaction>
</MaintenanceTransaction:provideCommunicationEvents_BatchRequest>
Run Code Online (Sandbox Code Playgroud)
xsd定义为:
<xsd:schema xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:include schemaLocation="./commonIFWxsd/IFWXML.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Event.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Arrangement.xsd" />
<!-- end of TYPES REQUIRED FOR PARAMETERS -->
<xsd:complexType name="provideCommunicationEvents_BatchRequest">
<xsd:sequence>
<xsd:element name="maintenanceTransaction" type="MaintenanceTransaction:MaintenanceTransaction" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<!-- TYPES REQUIRED FOR PARAMETERS -->
<xsd:element name="provideCommunicationEvents_BatchRequest" type="MaintenanceTransaction:provideCommunicationEvents_BatchRequest" />
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
使用我的StaxEventItemReader和Jaxb2Marshaller的以下设置:
<bean id="uploadEventMessageReader" parent="abstractUploadEventMessageReader" scope="step">
<property name="resource" value="file:#{jobExecutionContext['fileToProcess']}"/>
<property name="fragmentRootElementName" …Run Code Online (Sandbox Code Playgroud) java ×4
java-8 ×2
java-stream ×2
spring-batch ×2
dto ×1
enums ×1
generics ×1
infinite ×1
jaxb ×1
jpa ×1
lambda ×1
stax ×1
transactions ×1
type-erasure ×1