wip: flow task start

This commit is contained in:
loveuer
2024-04-03 16:46:25 +08:00
parent 4718532458
commit bb56271348
11 changed files with 381 additions and 155 deletions

View File

@ -2,44 +2,78 @@ package xfile
import (
"context"
"fmt"
"github.com/loveuer/nfflow/internal/model"
"io"
"errors"
"github.com/loveuer/nfflow/internal/interfaces"
"github.com/loveuer/nfflow/internal/sqlType"
"github.com/sirupsen/logrus"
"os"
)
type LocalFile struct {
writer io.Writer
cfg struct {
MaxSize int
Path string
}
writer *os.File
Path string `json:"path"`
MaxLine int `json:"max_line"`
}
func (lf *LocalFile) init() error {
func NewFileOutput(cfg sqlType.JSONB) (interfaces.Output, error) {
var (
err error
ins = &LocalFile{}
)
if _, err = os.Stat(lf.cfg.Path); !os.IsNotExist(err) {
return fmt.Errorf("file=%s already exist", lf.cfg.Path)
if err = cfg.Bind(ins); err != nil {
return nil, err
}
if lf.writer, err = os.OpenFile(lf.cfg.Path, os.O_CREATE|os.O_RDWR, 0644); err != nil {
return fmt.Errorf("openfile=%s err=%v", lf.cfg.Path, err)
if _, err = os.Stat(ins.Path); !errors.Is(err, os.ErrNotExist) {
return nil, errors.New("file already exist")
}
if ins.writer, err = os.OpenFile(ins.Path, os.O_CREATE|os.O_RDWR, 0644); err != nil {
return nil, err
}
return ins, nil
}
func (lf *LocalFile) Start(ctx context.Context, rowCh <-chan interfaces.Row, errCh chan<- error) error {
var (
err error
bs []byte
ready = make(chan bool)
)
go func() {
ready <- true
for {
select {
case <-ctx.Done():
logrus.Warn("received quit signal...")
return
case row, ok := <-rowCh:
if !ok {
return
}
if bs, err = row.Bytes(); err != nil {
errCh <- err
return
}
if _, err = lf.writer.Write(append(bs, '\n')); err != nil {
errCh <- err
return
}
}
}
}()
<-ready
return nil
}
func (lf *LocalFile) Start(ctx context.Context, rowCh <-chan *model.TaskRow, errCh chan<- error) error {
var (
err error
)
if err = lf.init(); err != nil {
return err
}
return nil
func (lf *LocalFile) Close() {
_ = lf.writer.Close()
}