1

私は 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 で行われる作業から分離し、非同期にしたいと考えています。ただし、リスナーは、既にデータベースに存在するという通知を受け取ったことに依存する可能性があります。したがって、トランザクションがコミットされるまでメッセージを送信したくない (または少なくとも受信しない) ようにします。

これに対する標準的なアプローチはありますか?これを達成する方法について、人々はどのようなアドバイスを持っていますか?

4

2 に答える 2

0

保留中のステータスでレコードをデータベースに書き込むことができます。次に、その保留ステータスに基づいて保留中のレコードについてデータベースをポーリングします。このプロセスは、現在の同期処理を効果的に分離し、達成したいことを支援します。

于 2012-10-06T14:02:58.363 に答える
0

Spring Integration 2.2の新しいトランザクション同期は、探しているものですか? Release Candidate が出ているので、最終バージョンはすぐに利用可能になるはずですが、いつになるかはわかりません.

于 2012-10-11T18:20:22.120 に答える