ネイティブな Java で Binlog ログをリスンする方法

Javaでは、binlogイベントをリッスンする以下の方法があります。

  1. MySQL コネクタ / J を使用する: MySQL コネクタ / J は、MySQL データベースに接続するために使用できる、公式に提供されている Java ドライバです。binlog ログをリッスンするために使用できる BinaryLogClient というクラスを提供しています。最初に、プロジェクトに MySQL コネクタ / J の依存関係を追加する必要があります。その後、次のコードを使用して binlog ログをリッスンできます。
import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.EventData;
import com.github.shyiko.mysql.binlog.event.EventListener;
import com.github.shyiko.mysql.binlog.event.Event;
import java.io.IOException;
public class BinlogListener {
public static void main(String[] args) throws IOException {
BinaryLogClient client = new BinaryLogClient("localhost", 3306, "username", "password");
client.registerEventListener(new EventListener() {
@Override
public void onEvent(Event event) {
EventData data = event.getData();
// 处理binlog事件
}
});
client.connect();
}
}
  1. CanalはMySQLデータベースのbinlog解析ツールとして利用できるオープンソースツールで、JavaクライアントAPIを使用してbinlogの監視が可能です。Canalを利用するためには、プロジェクトに依存関係を追加する必要があります。そのうえで、binlogを監視するには次のコードを使用できます。
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.CanalEntry.EntryType;
import com.alibaba.otter.canal.protocol.CanalEntry.RowChange;
import com.alibaba.otter.canal.protocol.CanalEntry.RowData;
import com.alibaba.otter.canal.protocol.Message;
import java.net.InetSocketAddress;
public class BinlogListener {
public static void main(String[] args) {
CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("localhost", 11111),
"example", "", "");
connector.connect();
connector.subscribe(".*\\..*");
while (true) {
Message message = connector.get(100);
for (CanalEntry.Entry entry : message.getEntries()) {
if (entry.getEntryType() == EntryType.ROWDATA) {
RowChange rowChange = null;
try {
rowChange = RowChange.parseFrom(entry.getStoreValue());
} catch (Exception e) {
throw new RuntimeException("解析binlog失败", e);
}
for (RowData rowData : rowChange.getRowDatasList()) {
// 处理binlog事件
}
}
}
connector.ack(message.getId());
}
}
}

具体的なニーズやプロジェクトの状況に応じて、2 つの一般的な方法からログを監視する方法を選択できます。

bannerAds