-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
306 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package com.huifer.kafka.core.excephandler; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
|
||
@Slf4j | ||
public class DefaultExceptionHandler implements ExceptionHandler { | ||
|
||
|
||
public boolean support(Throwable t) { | ||
return true; | ||
} | ||
|
||
public void handle(Throwable t, String message) { | ||
if (t instanceof InterruptedException) { | ||
log.error("Maybe it is shutting down. Or interruped when handing the message:\t" + message, t); | ||
} else { | ||
log.error("Failed to handle the message: \t" + message, t); | ||
} | ||
} | ||
} |
220 changes: 220 additions & 0 deletions
220
docs/spring/cs3b8ea258-6644-11ee-ac02-acde48001122.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
/** | ||
* Copyright 2009-2019 the original author or authors. | ||
* <p> | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* <p> | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* <p> | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package org.apache.ibatis.scripting.xmltags; | ||
|
||
import org.apache.ibatis.parsing.GenericTokenParser; | ||
import org.apache.ibatis.session.Configuration; | ||
|
||
import java.util.Map; | ||
|
||
/** | ||
* for 标签解析 | ||
* | ||
* @author Clinton Begin | ||
*/ | ||
public class ForEachSqlNode implements SqlNode { | ||
public static final String ITEM_PREFIX = "__frch_"; | ||
|
||
private final ExpressionEvaluator evaluator; | ||
private final String collectionExpression; | ||
private final SqlNode contents; | ||
private final String open; | ||
private final String close; | ||
private final String separator; | ||
private final String item; | ||
private final String index; | ||
private final Configuration configuration; | ||
|
||
public ForEachSqlNode(Configuration configuration, SqlNode contents, String collectionExpression, String index, String item, String open, String close, String separator) { | ||
this.evaluator = new ExpressionEvaluator(); | ||
this.collectionExpression = collectionExpression; | ||
this.contents = contents; | ||
this.open = open; | ||
this.close = close; | ||
this.separator = separator; | ||
this.index = index; | ||
this.item = item; | ||
this.configuration = configuration; | ||
} | ||
|
||
private static String itemizeItem(String item, int i) { | ||
return ITEM_PREFIX + item + "_" + i; | ||
} | ||
|
||
@Override | ||
public boolean apply(DynamicContext context) { | ||
Map<String, Object> bindings = context.getBindings(); | ||
final Iterable<?> iterable = evaluator.evaluateIterable(collectionExpression, bindings); | ||
if (!iterable.iterator().hasNext()) { | ||
return true; | ||
} | ||
boolean first = true; | ||
applyOpen(context); | ||
int i = 0; | ||
for (Object o : iterable) { | ||
DynamicContext oldContext = context; | ||
if (first || separator == null) { | ||
context = new PrefixedContext(context, ""); | ||
} else { | ||
context = new PrefixedContext(context, separator); | ||
} | ||
int uniqueNumber = context.getUniqueNumber(); | ||
// Issue #709 | ||
if (o instanceof Map.Entry) { | ||
@SuppressWarnings("unchecked") | ||
Map.Entry<Object, Object> mapEntry = (Map.Entry<Object, Object>) o; | ||
applyIndex(context, mapEntry.getKey(), uniqueNumber); | ||
applyItem(context, mapEntry.getValue(), uniqueNumber); | ||
} else { | ||
applyIndex(context, i, uniqueNumber); | ||
applyItem(context, o, uniqueNumber); | ||
} | ||
contents.apply(new FilteredDynamicContext(configuration, context, index, item, uniqueNumber)); | ||
if (first) { | ||
first = !((PrefixedContext) context).isPrefixApplied(); | ||
} | ||
context = oldContext; | ||
i++; | ||
} | ||
applyClose(context); | ||
context.getBindings().remove(item); | ||
context.getBindings().remove(index); | ||
return true; | ||
} | ||
|
||
private void applyIndex(DynamicContext context, Object o, int i) { | ||
if (index != null) { | ||
context.bind(index, o); | ||
context.bind(itemizeItem(index, i), o); | ||
} | ||
} | ||
|
||
private void applyItem(DynamicContext context, Object o, int i) { | ||
if (item != null) { | ||
context.bind(item, o); | ||
context.bind(itemizeItem(item, i), o); | ||
} | ||
} | ||
|
||
private void applyOpen(DynamicContext context) { | ||
if (open != null) { | ||
context.appendSql(open); | ||
} | ||
} | ||
|
||
private void applyClose(DynamicContext context) { | ||
if (close != null) { | ||
context.appendSql(close); | ||
} | ||
} | ||
|
||
private static class FilteredDynamicContext extends DynamicContext { | ||
private final DynamicContext delegate; | ||
private final int index; | ||
private final String itemIndex; | ||
private final String item; | ||
|
||
public FilteredDynamicContext(Configuration configuration, DynamicContext delegate, String itemIndex, String item, int i) { | ||
super(configuration, null); | ||
this.delegate = delegate; | ||
this.index = i; | ||
this.itemIndex = itemIndex; | ||
this.item = item; | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getBindings() { | ||
return delegate.getBindings(); | ||
} | ||
|
||
@Override | ||
public void bind(String name, Object value) { | ||
delegate.bind(name, value); | ||
} | ||
|
||
@Override | ||
public String getSql() { | ||
return delegate.getSql(); | ||
} | ||
|
||
@Override | ||
public void appendSql(String sql) { | ||
GenericTokenParser parser = new GenericTokenParser("#{", "}", content -> { | ||
String newContent = content.replaceFirst("^\\s*" + item + "(?![^.,:\\s])", itemizeItem(item, index)); | ||
if (itemIndex != null && newContent.equals(content)) { | ||
newContent = content.replaceFirst("^\\s*" + itemIndex + "(?![^.,:\\s])", itemizeItem(itemIndex, index)); | ||
} | ||
return "#{" + newContent + "}"; | ||
}); | ||
|
||
delegate.appendSql(parser.parse(sql)); | ||
} | ||
|
||
@Override | ||
public int getUniqueNumber() { | ||
return delegate.getUniqueNumber(); | ||
} | ||
|
||
} | ||
|
||
|
||
private class PrefixedContext extends DynamicContext { | ||
private final DynamicContext delegate; | ||
private final String prefix; | ||
private boolean prefixApplied; | ||
|
||
public PrefixedContext(DynamicContext delegate, String prefix) { | ||
super(configuration, null); | ||
this.delegate = delegate; | ||
this.prefix = prefix; | ||
this.prefixApplied = false; | ||
} | ||
|
||
public boolean isPrefixApplied() { | ||
return prefixApplied; | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getBindings() { | ||
return delegate.getBindings(); | ||
} | ||
|
||
@Override | ||
public void bind(String name, Object value) { | ||
delegate.bind(name, value); | ||
} | ||
|
||
@Override | ||
public void appendSql(String sql) { | ||
if (!prefixApplied && sql != null && sql.trim().length() > 0) { | ||
delegate.appendSql(prefix); | ||
prefixApplied = true; | ||
} | ||
delegate.appendSql(sql); | ||
} | ||
|
||
@Override | ||
public String getSql() { | ||
return delegate.getSql(); | ||
} | ||
|
||
@Override | ||
public int getUniqueNumber() { | ||
return delegate.getUniqueNumber(); | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/** | ||
* Copyright 2009-2019 the original author or authors. | ||
* <p> | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* <p> | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* <p> | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package org.apache.ibatis.transaction; | ||
|
||
import java.sql.Connection; | ||
import java.sql.SQLException; | ||
|
||
/** | ||
* | ||
* Wraps a database connection. | ||
* Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close. | ||
* | ||
* @author Clinton Begin | ||
*/ | ||
public interface Transaction { | ||
|
||
/** | ||
* 获取数据库连接 | ||
* Retrieve inner database connection. | ||
* @return DataBase connection | ||
* @throws SQLException | ||
*/ | ||
Connection getConnection() throws SQLException; | ||
|
||
/** | ||
* 事务提交 | ||
* Commit inner database connection. | ||
* @throws SQLException | ||
*/ | ||
void commit() throws SQLException; | ||
|
||
/** | ||
* 事务回滚 | ||
* Rollback inner database connection. | ||
* @throws SQLException | ||
*/ | ||
void rollback() throws SQLException; | ||
|
||
/** | ||
* 关闭事务 | ||
* Close inner database connection. | ||
* @throws SQLException | ||
*/ | ||
void close() throws SQLException; | ||
|
||
/** | ||
* 获取超时时间 | ||
* Get transaction timeout if set. | ||
* @throws SQLException | ||
*/ | ||
Integer getTimeout() throws SQLException; | ||
|
||
} |