私は Spring Integration を使用しており、次のシナリオがあります。今日、エンティティが保存、更新、または削除されたときに、Dao がパブリッシュ/サブスクライブ チャネルにイベントを送信するようにしています。基本的には次のように実装されます。
イベント ゲートウェイ インターフェイス:
public interface DaoEventGateway {
@Gateway
void sendEvent(EntityEvent event);
}
DAO:
public class ADao {
private DaoEventGateway gateway;
public void save(A aEntity) {
... do some stuff to save it.
fireEvent(aEntity, EntityType.SAVE);
}
protected void fireEvent(A entity, EventType eventType) {
if (eventGateway != null) {
EntityEvent event =
new EntityEvent(entity, eventType);
eventGateway.sendEvent(event);
}
}
}
イベントのある種のリスナー:
public class AEventLoggingService {
public void receiveEvent(Event event) {
A event = event.getEntity();
Long id = event.getId();
... look up some associations based on the id ...
... log something about the event ...
}
}
次のように構成します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd">
<int:publish-subscribe-channel id="aEventChannel" />
<int:gateway id="aEventGateway" service-interface="com.factorlab.persistence.DaoEventGateway"
default-request-channel="aEventChannel">
<int:method name="sendEvent" request-channel="aEventChannel" />
</int:gateway>
<bean id="aDao" class="com.factorlab.ADao">
<property name="eventGateway" ref="aEventGateway" />
</bean>
<int:service-activator input-channel="aEventChannel"
ref="aEventLoggingService" method="receiveEvent" />
</beans>
現在、すべてのサブスクライバーがパブリッシャーと同じスレッド (および同じトランザクション) で動作していると思われるため、パフォーマンス以外はすべて正常に動作しています。
リスナーによって行われる作業を DAO で行われる作業から分離し、非同期にしたいと考えています。ただし、リスナーは、既にデータベースに存在するという通知を受け取ったことに依存する可能性があります。したがって、トランザクションがコミットされるまでメッセージを送信したくない (または少なくとも受信しない) ようにします。
これに対する標準的なアプローチはありますか?これを達成する方法について、人々はどのようなアドバイスを持っていますか?