小编amo*_*amo的帖子

在CXF JAX-WS单向方法调用中获取客户端IP地址的可靠方法

我正在使用以下代码来获取JAX-WS单向方法调用的客户端IP地址:

protected HttpServletRequest getServletRequest() {
    MessageContext ctx = wsContext.getMessageContext();
    return (HttpServletRequest) ctx.get( MessageContext.SERVLET_REQUEST );
}

protected synchronized String getClientIp() {
    String clientIp = "";
    HttpServletRequest request = getServletRequest();
    if ( request != null ) {
        clientIp = request.getRemoteAddr();

        // Handle proxy
        String header = request.getHeader( "x-forwarded-for" );
        if( header != null && !header.isEmpty() ) {
            clientIp = header.split( "," )[0];
        }
    }
    return clientIp;
}
Run Code Online (Sandbox Code Playgroud)

当多个客户端连接时,为请求检索的IP地址有时是来自先前请求的不正确的缓存值.获取单向呼叫始发者IP地址的可靠方法是什么?

soap web-services cxf jax-ws java-ee

10
推荐指数
1
解决办法
8054
查看次数

如何在C#中实现与定时器的同步

我有一个场景,我的C#类有两个方法说,DoThis()并且DoThat()由外部调用者以任何顺序相互独立调用.这两种方法需要以下列方式同步:

  • 在调用之后DoThis(),至少等待t1几秒钟才能继续DoThat()执行
  • 在调用之后DoThat(),至少等待t2几秒钟才能继续DoThis()执行

所以基本上是伪代码:

static SomeCustomTimer Ta, Tb;
static TimeSpan t1, t2;

public static void DoThis()
{
    if(Tb.IsRunning())
        Tb.WaitForExpiry();

    DoStuff();
    Ta.Start(t1);
}

public static void DoThat()
{
    if(Ta.IsRunning())
        Ta.WaitForExpiry();

    DoOtherStuff();
    Tb.Start(t2);
}
Run Code Online (Sandbox Code Playgroud)

DoStuff()DoOtherStuff()长时间运行的方法,不以其他方式共享资源.通常DoThis()DoThat()不会同时调用.但我仍然需要防止潜在的僵局.

我怎样才能最好地实现DoThis(),DoThat()在C#中?

编辑 我的场景现在很简单,因为没有任意数量的线程调用这些函数.出于简化的目的,有一个调用程序线程以任意顺序调用这些函数.因此,不会同时调用这两个方法,而是调用者将以任何顺序逐个调用这些方法.我无法控制调用者线程的代码,所以我想强制执行连续调用DoThis(),DoThat()之间的延迟.

.net c# multithreading synchronization

4
推荐指数
1
解决办法
2496
查看次数

标签 统计

.net ×1

c# ×1

cxf ×1

java-ee ×1

jax-ws ×1

multithreading ×1

soap ×1

synchronization ×1

web-services ×1