Giter Site home page Giter Site logo

Comments (32)

noear avatar noear commented on July 21, 2024

你让我惊讶了!!!需要一个小时的等待,我感觉不适合用RPC调用。

from solon.

noear avatar noear commented on July 21, 2024
//是设定自动发 socketd 心跳的间隔时间
session.sendHeartbeatAuto(10);

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

哈哈哈,是的,我有方法,必须做很重的处理。
有什么办法可以不超时吗?是否可以配置超时值?

from solon.

noear avatar noear commented on July 21, 2024

一个小时的等待,确实不合适。。。网络随时可能会中断的。。。我给你几个建议方案,你试试。
我先想一想。。。

from solon.

danielsawan avatar danielsawan commented on July 21, 2024
//是设定自动发 socketd 心跳的间隔时间
session.sendHeartbeatAuto(10);

我把这个命令放在客户端,但似乎并不奏效。
有什么命令可以放在服务器上吗?

from solon.

noear avatar noear commented on July 21, 2024

这个对你的需求没无处。。。它是管心跳间隔的。

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

一个小时的等待,确实不合适。。。网络随时可能会中断的。。。我给你几个建议方案,你试试。 我先想一想。。。

如果出现网络故障,这对我来说并不是一个问题,我有一个很好的错误处理方法。

from solon.

noear avatar noear commented on July 21, 2024

我先想一想啊。。。1个小时的等待,什么方案更好?

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

心跳的作用是无限期地维持连接吗?

from solon.

noear avatar noear commented on July 21, 2024

对的:)

from solon.

noear avatar noear commented on July 21, 2024

目前可以通过:Nami.builder() 来指定时长(现在默认是 30 秒)

Nami.builder().url("tcp://localhost:28080/demoe/rpc")
                .timeout(60 * 60 * 2) //单位:秒
                .encoder(SnackTypeEncoder.instance)
                .create(HelloService.class);

from solon.

noear avatar noear commented on July 21, 2024

或者通过注解:

@NamiClient(url = "tcp://localhost:28080/demoe/rpc", timeout=60*60*2)
HelloService helloService;

from solon.

noear avatar noear commented on July 21, 2024

好像 Nami.builder() ,还没有 timeout 接口,我马上发个新版本

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

非常感谢你,我将等待你的新版本!

from solon.

noear avatar noear commented on July 21, 2024

感觉 rpc 的应答模式,不大好。。。网络中断的话,响应也会中断掉。

感觉消息通知模式比较好。(A服务 通知 B服务开始干活;B服务完成任务 再通知 A服务)

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

如果能在这个层面上设置一个超时,那也是很好的。

HelloService helloService = SocketD.create(session, HelloService.class);
session.sendHeartbeatAuto(30);
session.setTimeout(1000 * 30); // new

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

感觉 rpc 的应答模式,不大好。。。网络中断的话,响应也会中断掉。

感觉消息通知模式比较好。(A服务 通知 B服务开始干活;B服务完成任务 再通知 A服务)

是的,你是对的,我应该通过发送消息来进行,但我仍然希望有可能配置超时。我不认为这是个坏主意。

from solon.

noear avatar noear commented on July 21, 2024

服务端

//启动服务端
public class ServerApp {
    public static void main(String[] args) {
        //启动Solon容器(SocketD bean&plugin 由solon容器管理)
        Solon.start(ServerApp.class, args, app -> app.enableSocketD(true));
    }
}

///定义服务端监听
@ServerEndpoint
public class ServerListener implements Listener {
    @Override
    public void onMessage(Session session, Message message) {
        String cmd = message.bodyAsString();
        if ("start".equals(cmd)) {
            //通过线程池异步执行任务
            Utils.pools.submit(() -> {
                try {
                    //todo task
                    session.send(Message.wrap("我完成工作了"));

                } catch (Throwable e) {
                    session.send(Message.wrap("我失败了"));
                }


            });

            session.send(Message.wrapResponse(message, "ok"));
        }
    }
}

客户端

//启动客户端
public class ClientApp {
    public static void main(String[] args) throws Throwable {
        //启动Solon容器(SocketD bean&plugin 由solon容器管理)
        Solon.start(ClientApp.class, args);

        //创建会话(如果后端是WebSocekt,协议头为:ws)
        Session session = SocketD.createSession("tcp://localhost:28080");

        //设定30秒自动上发心跳(如果断开了,也尝试自动重链)
        session.sendHeartbeatAuto(30);

        //开始监听
        session.listener(new Listener() {
            @Override
            public void onMessage(Session session, Message message) throws IOException {
                //会分别收到:"ok" 和 "我完成工作了" 或 “我失败了”
            }
        });

        //发消息并等结果(会收到 ok )
        String message = session.sendAndResponse("start");
    }
}

from solon.

noear avatar noear commented on July 21, 2024

我帮你写了下示例。。。你可以看一下

from solon.

noear avatar noear commented on July 21, 2024

新的版本,也正在发

from solon.

noear avatar noear commented on July 21, 2024

1.7.4 可以下载了。。。三种方式设定超时

//方式1
Nami.builder().url("tcp://localhost:28080/demoe/rpc")
                .timeout(60 * 60 * 2) //单位:秒
                .encoder(SnackTypeEncoder.instance)
                .create(HelloService.class);

//方式2
@NamiClient(url = "tcp://localhost:28080/demoe/rpc", timeout=60*60*2)
HelloService helloService;

//方式3
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        NamiConfiguration namiConfiguration = new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                //指定编码器与解码器
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
                builder.timeout(60 * 60 * 2);
            }
        };

        return namiConfiguration;
    }
}

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

谢谢你的快速工作!
我希望能够使用接口注解来定义路线,例如

@NamiClient(path = "/helloService")
public interface HelloService {
...

似乎对娜美,我们必须指定路线...

事实上,我正在使用这种语法

Session session = SocketD.createSession("tcp://192.168.1.21:28080", true);
session.sendHeartbeatAuto(20);
session.setTimeout(1000 * 30); // 是否可以在这里定义超时?
HelloService helloService = SocketD.create(session, HelloService.class);

所以我想知道,是否有可能有一个session.setTimeout,或者Nami是否能够自动读取接口路由,而不把路径放在url中?

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

#39 (comment)

from solon.

noear avatar noear commented on July 21, 2024
 // 这里不能定义 
session.setTimeout(1000 * 30);

 // 这里可以定义
@NamiClient(path = "/helloService", timeout=1000* 30)
public interface HelloService {
...

from solon.

noear avatar noear commented on July 21, 2024

“Nami是否能够自动读取接口路由”,这个也可以的。

比如这样配合:

@NamiClient(path = "/helloService", timeout=1000* 30)
public interface HelloService {
  //..
}

//这个时候要用 upstream() ,而不是 url()  //编码器,可以通过配置器统一配置 //也可以在下面指定
Nami.builder().upstream(()->"tcp://localhost:28080").create(HelloService.class);

//url() 要求放完整的路径
//upstream() 要求放服务地址提供者

from solon.

noear avatar noear commented on July 21, 2024

SocketD.create 的内部,最终也是使用 Nami.builder()...

public class SocketD {
    ......
    /**
     * 创建接口
     * */
    public static <T> T create(Supplier<Session> sessions, Encoder encoder, Decoder decoder, Class<T> service) {
        URI uri = sessions.get().uri();
        if (uri == null) {
            uri = URI.create("tcp://socketd");
        }

        String server = uri.getScheme() + ":" + uri.getSchemeSpecificPart();

        return Nami.builder()
                .encoder(encoder)
                .decoder(decoder)
                .headerSet(Constants.HEADER_ACCEPT, Constants.CONTENT_TYPE_JSON) //相当于指定默认解码器 //如果指定不同的编码器,会被盖掉
                .headerSet(Constants.HEADER_CONTENT_TYPE, Constants.CONTENT_TYPE_JSON) //相当于指定默认编码器
                .channel(new SocketChannel(sessions))
                .upstream(() -> server)
                .create(service);
    }
}

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

你好。

超时选项似乎起作用了 ! 干得好

关于Nami.builder(),是否可以配置 "autoreconnect "和 "sendHeartbeatAuto "选项?

我试过了,但没有用

Supplier<Session> sessions = new  Supplier<Session>() {
	@Override
	public Session get() {
		Session session = SocketD.createSession("tcp://127.0.0.1:28080", true); // 自动重新连接
		session.sendHeartbeatAuto(30); // 自动心脏跳动
		return session;
	}
};
		
T service = Nami.builder()
.channel(new SocketChannel(sessions))
.timeout(60 * 60 * 2) // secondes
.create(type);

from solon.

noear avatar noear commented on July 21, 2024

Nami.builder() 内部,已经是 autoReconnect 了。。。但是 sendHeartbeatAuto 没有

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

所以 "sendHeartbeatAuto "不能被激活,而 "autoReconnect "默认是激活的。

非常感谢你的帮助,我想我们现在已经完成了这个任务。
如果你没有什么要补充的,我就让你关闭这个票。

再次感谢您的帮助! 我喜欢你的应用程序!

from solon.

noear avatar noear commented on July 21, 2024

1.7.5-M1 版本发布了。。。三种方式设定:

//方式1
Nami.builder().url("tcp://localhost:28080/demoe/rpc")
                .timeout(60 * 60 * 2) //单位:秒
                .heartbeat(30) //单位:秒
                .encoder(SnackTypeEncoder.instance)
                .create(HelloService.class);

//方式2
@NamiClient(url = "tcp://localhost:28080/demoe/rpc", timeout=60*60*2, heartbeat=30)
HelloService helloService;

//方式3
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        NamiConfiguration namiConfiguration = new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                //指定编码器与解码器
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
                builder.timeout(60 * 60 * 2);
                builder.heartbeat(30);
            }
        };

        return namiConfiguration;
    }
}

from solon.

danielsawan avatar danielsawan commented on July 21, 2024

哦,我的上帝,你是我曾经合作过的最有反应能力的开发员。谢谢你,伙计。

我再次让你关闭这个票,让你去做Jackson列表的反序列化工作,哈哈哈。

谢谢

from solon.

noear avatar noear commented on July 21, 2024

要促成框架更完善,需要大量的需求和反馈:)

from solon.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.