我正在使用Spring批处理应用程序,该应用程序使用JPA Persistence写入数据库.我有一个场景,我必须在写入期间跳过异常,并且作业必须继续而不会失败.
假设我有10条记录要写,而记录6会抛出一个SQL异常(表或视图不存在.)我需要跳过这条记录并继续下一条记录.
我尝试实现skippable-exception-classes但是无法跳过异常并且作业失败.该作业在持久性操作期间抛出SQL异常(不在write()方法中抛出异常).
'skippable-exception-classes'是否真的适用于JPA层中发生的任何异常?例如,如果在JPA提交期间发生了一些异常,是否真的可以使用'skippable-exception-classes'处理异常并阻止作业回滚所有提交到目前为止?请帮忙!
<batch:job id="advDataExtJob" job-repository="jobRepository"
incrementer="myIncrementerImpl" restartable="false">
<batch:step id="myStep">
<batch:tasklet transaction-manager="transactionManager"
task-executor="taskExecutor" allow-start-if-complete="true">
<batch:chunk reader="myReader" processor="myProcessor"
writer="MyWriter" commit-interval="1000" skip-limit="10">
<batch:skip-policy>
<bean class="org.springframework.batch.core.step.skip.AlwaysSkipItemSkipPolicy" scope="step"/>
</batch:skip-policy>
<batch:skippable-exception-classes>
<batch:include class="java.lang.Throwable"/>
</batch:skippable-exception-classes>
</batch:chunk>
<batch:listeners>
<batch:listener ref="StepListener"/>
<batch:listener ref="advExtStepListener"/>
<batch:listener ref="ItemWriteListener"/>
<batch:listener ref="ItemSkipListener"/>
</batch:listeners>
</batch:tasklet>
</batch:step>
<batch:validator ref="dataExtJobValidator"/>
<batch:listeners>
<batch:listener ref="dataExtJobListener"/>
<batch:listener ref="advExtJobListener"/>
</batch:listeners>
</batch:job>
Run Code Online (Sandbox Code Playgroud)
跳过监听器如下
项目跳过监听器如下
@Override
public void onSkipInRead(Throwable t) {
System.out.println("skipped item: {} " + t.toString());
}
@Override
public void onSkipInWrite(Object item, Throwable t) { …Run Code Online (Sandbox Code Playgroud) 如何从WebSphere MQ读取消息而不从队列中删除原始消息?
我有一个 Spring 应用程序,它从 WebSphere MQ 读取消息。阅读后,我有一个处理方法,它将处理从队列中检索的数据。
步骤1:
response = jmsTemplate.receive();
//Message automatically removed from queue.
Run Code Online (Sandbox Code Playgroud)
第2步:
process(response);
Run Code Online (Sandbox Code Playgroud)
process 方法中有可能抛出异常。如果出现异常,我需要将消息保留在队列中。
是否可以?他们有办法仅在用户确认后删除该消息吗?
我尝试添加以下内容:
jmsTemplate.setSessionAcknowledgeMode(javax.jms.Session.CLIENT_ACKNOWLEDGE);
Run Code Online (Sandbox Code Playgroud)
...但该消息仍然被删除。
JmsTemplate创建代码片段:
JndiConnectionFactorySupport connectionFactoryBean = new JndiConnectionFactorySupport();
connectionFactoryBean.setBindingsDir(this.bindingDir);
connectionFactoryBean
.setConnectionFactoryName(connectionFactoryName);
connectionFactoryBean.afterPropertiesSet();
jmsTemplate.setConnectionFactory(connectionFactoryBean.getObject());
JndiDestinationResolver destinationResolver = new JndiDestinationResolver();
destinationResolver.setJndiTemplate(connectionFactoryBean
.getJndiTemplate());
jmsTemplate.setDestinationResolver(destinationResolver);
jmsTemplate.setReceiveTimeout(20000);
jmsTemplate.setDefaultDestinationName(this.defaultDestinationName);
Run Code Online (Sandbox Code Playgroud)
尝试了jmsTemplate.execute()如下方法:
@SuppressWarnings({ "unused", "unchecked" })
Message responseMessage = (Message) jmsTemplate.execute(
new SessionCallback() {
public Object doInJms(Session session)
throws JMSException {
MessageConsumer consumer = session
.createConsumer(jmsTemplate.getDestinationResolver().resolveDestinationName(session, "QUEUE_NAME", false));
Message response = consumer.receive(1); …Run Code Online (Sandbox Code Playgroud)