我怎么能使用非系统属性PropertySource与jgroups

时间:2017-03-10 18:39:16

标签: java jgroups

让我们说我使用tcp-nio.xml配置

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="urn:org:jgroups"
        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
    <TCP_NIO2 bind_port="7800"
              recv_buf_size="${tcp.recv_buf_size:5M}"
              send_buf_size="${tcp.send_buf_size:5M}"
              max_bundle_size="64K"
              max_bundle_timeout="30"
              sock_conn_timeout="300"

              timer_type="new3"
              timer.min_threads="4"
              timer.max_threads="10"
              timer.keep_alive_time="3000"
              timer.queue_max_size="500"

              thread_pool.enabled="true"
              thread_pool.min_threads="2"
              thread_pool.max_threads="8"
              thread_pool.keep_alive_time="5000"
              thread_pool.queue_enabled="true"
              thread_pool.queue_max_size="10000"
              thread_pool.rejection_policy="discard"

              oob_thread_pool.enabled="true"
              oob_thread_pool.min_threads="1"
              oob_thread_pool.max_threads="8"
              oob_thread_pool.keep_alive_time="5000"
              oob_thread_pool.queue_enabled="false"
              oob_thread_pool.queue_max_size="100"
              oob_thread_pool.rejection_policy="discard"/>

    <TCPPING async_discovery="true"
             initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}"
             port_range="3"/>
    <MERGE3  min_interval="10000"
             max_interval="30000"/>
    <FD_SOCK/>
    <FD_ALL timeout="30000" />
    <VERIFY_SUSPECT timeout="1500"  />
    <BARRIER />
    <pbcast.NAKACK2 use_mcast_xmit="false"
                    discard_delivered_msgs="true"/>
    <UNICAST3 />
    <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
                   max_bytes="4M"/>
    <pbcast.GMS print_local_addr="true" join_timeout="2000"
                view_bundling="true"/>
    <MFC max_credits="2M"
         min_threshold="0.4"/>
    <FRAG2 frag_size="60K"  />
    <!--RSVP resend_interval="2000" timeout="10000"/-->
    <pbcast.STATE_TRANSFER/>
</config>

我要设置{jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}

@Profile( CLUSTERED )
@Bean( JCHANNEL_SPRING_SECURITY )
public JChannel jChannelSpringSecurity(
    @Value( "classpath:jgroups-session.xml" ) final InputStreamSource jgroupsConfig,
    @Value( "${sessionDistributed.channel:SpringSecurity_Cluster}" ) final String channelName,
    @Value( "${jgroups.tcpping.initialhosts:localhost,localhost}" ) final String initialHosts,
    @Value( "${sessionDistributed.port:7800}" ) final int port
    ) throws Exception
{
    initialHosts( "session", initialHosts, port );
    JChannel jChannel = new JChannel( jgroupsConfig.getInputStream() );
    jChannel.setName( channelName );
    jChannel.connect( channelName );
    return jChannel;
}

private void initialHosts( final String key, final CharSequence hostsCSV, final int port ) {
    List<String> hosts = SPLITTER.splitToList( hostsCSV );
    String initialHosts = String.format( "%s[%d],%s[%d]", hosts.get( 0 ), port, hosts.get( 1 ), port );
    String property = String.format( "jgroups.%s.tcpping.initial_hosts", key );
    System.setProperty( property, initialHosts );
}

这样可行,但有没有办法在不将其写回System.properties的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

是的,您可以通过编程方式设置initial_hosts,例如

List<PhysicalAddress> hosts=// create initial hosts
JChannel ch=...//create channel
TCPPING ping=ch.findProtocol(TCPPING.class);
ping.setInitialHosts(hosts);