291
eclipse_template.xml
Normal file
291
eclipse_template.xml
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<profiles version="12">
|
||||||
|
<profile kind="CodeFormatterProfile" name="Apache UIMA Code Conventions" version="12">
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="2"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="4"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
@ -27,155 +27,173 @@ import org.json.JSONObject;
|
|||||||
*
|
*
|
||||||
* @author joshclemm, harmenw
|
* @author joshclemm, harmenw
|
||||||
*/
|
*/
|
||||||
public abstract class GossipMember implements Comparable<GossipMember>{
|
public abstract class GossipMember implements Comparable<GossipMember> {
|
||||||
|
|
||||||
public static final String JSON_HOST = "host";
|
public static final String JSON_HOST = "host";
|
||||||
public static final String JSON_PORT = "port";
|
|
||||||
public static final String JSON_HEARTBEAT = "heartbeat";
|
|
||||||
public static final String JSON_ID = "id";
|
|
||||||
public static final String JSON_CLUSTER = "cluster";
|
|
||||||
protected final String _host;
|
|
||||||
protected final int _port;
|
|
||||||
protected volatile long _heartbeat;
|
|
||||||
protected final String _clusterName;
|
|
||||||
/**
|
|
||||||
* The purpose of the id field is to be able for nodes to identify themselves beyond there host/port. For example
|
|
||||||
* an application might generate a persistent id so if they rejoin the cluster at a different host and port we
|
|
||||||
* are aware it is the same node.
|
|
||||||
*/
|
|
||||||
protected String _id;
|
|
||||||
|
|
||||||
/**
|
public static final String JSON_PORT = "port";
|
||||||
* Constructor.
|
|
||||||
* @param host The hostname or IP address.
|
|
||||||
* @param port The port number.
|
|
||||||
* @param heartbeat The current heartbeat.
|
|
||||||
* @param id an id that may be replaced after contact
|
|
||||||
*/
|
|
||||||
public GossipMember(String clusterName, String host, int port, String id, long heartbeat) {
|
|
||||||
_clusterName = clusterName;
|
|
||||||
_host = host;
|
|
||||||
_port = port;
|
|
||||||
_id = id;
|
|
||||||
_heartbeat = heartbeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
public static final String JSON_HEARTBEAT = "heartbeat";
|
||||||
* Get the name of the cluster the member belongs to.
|
|
||||||
*
|
|
||||||
* @return The cluster name
|
|
||||||
*/
|
|
||||||
public String getClusterName(){
|
|
||||||
return _clusterName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
public static final String JSON_ID = "id";
|
||||||
* Get the hostname or IP address of the remote gossip member.
|
|
||||||
* @return The hostname or IP address.
|
|
||||||
*/
|
|
||||||
public String getHost() {
|
|
||||||
return _host;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
public static final String JSON_CLUSTER = "cluster";
|
||||||
* Get the port number of the remote gossip member.
|
|
||||||
* @return The port number.
|
|
||||||
*/
|
|
||||||
public int getPort() {
|
|
||||||
return _port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
protected final String host;
|
||||||
* The member address in the form IP/host:port
|
|
||||||
* Similar to the toString in {@link InetSocketAddress}
|
|
||||||
*/
|
|
||||||
public String getAddress() {
|
|
||||||
return _host+":"+_port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
protected final int port;
|
||||||
* Get the heartbeat of this gossip member.
|
|
||||||
* @return The current heartbeat.
|
|
||||||
*/
|
|
||||||
public long getHeartbeat() {
|
|
||||||
return _heartbeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
protected volatile long heartbeat;
|
||||||
* Set the heartbeat of this gossip member.
|
|
||||||
* @param heartbeat The new heartbeat.
|
|
||||||
*/
|
|
||||||
public void setHeartbeat(long heartbeat) {
|
|
||||||
this._heartbeat = heartbeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
protected final String clusterName;
|
||||||
|
|
||||||
public String getId() {
|
/**
|
||||||
return _id;
|
* The purpose of the id field is to be able for nodes to identify themselves beyond there
|
||||||
|
* host/port. For example an application might generate a persistent id so if they rejoin the
|
||||||
|
* cluster at a different host and port we are aware it is the same node.
|
||||||
|
*/
|
||||||
|
protected String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param host
|
||||||
|
* The hostname or IP address.
|
||||||
|
* @param port
|
||||||
|
* The port number.
|
||||||
|
* @param heartbeat
|
||||||
|
* The current heartbeat.
|
||||||
|
* @param id
|
||||||
|
* an id that may be replaced after contact
|
||||||
|
*/
|
||||||
|
public GossipMember(String clusterName, String host, int port, String id, long heartbeat) {
|
||||||
|
this.clusterName = clusterName;
|
||||||
|
this.host = host;
|
||||||
|
this.port = port;
|
||||||
|
this.id = id;
|
||||||
|
this.heartbeat = heartbeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the cluster the member belongs to.
|
||||||
|
*
|
||||||
|
* @return The cluster name
|
||||||
|
*/
|
||||||
|
public String getClusterName() {
|
||||||
|
return clusterName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the hostname or IP address of the remote gossip member.
|
||||||
|
*
|
||||||
|
* @return The hostname or IP address.
|
||||||
|
*/
|
||||||
|
public String getHost() {
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the port number of the remote gossip member.
|
||||||
|
*
|
||||||
|
* @return The port number.
|
||||||
|
*/
|
||||||
|
public int getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The member address in the form IP/host:port Similar to the toString in
|
||||||
|
* {@link InetSocketAddress}
|
||||||
|
*/
|
||||||
|
public String getAddress() {
|
||||||
|
return host + ":" + port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the heartbeat of this gossip member.
|
||||||
|
*
|
||||||
|
* @return The current heartbeat.
|
||||||
|
*/
|
||||||
|
public long getHeartbeat() {
|
||||||
|
return heartbeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the heartbeat of this gossip member.
|
||||||
|
*
|
||||||
|
* @param heartbeat
|
||||||
|
* The new heartbeat.
|
||||||
|
*/
|
||||||
|
public void setHeartbeat(long heartbeat) {
|
||||||
|
this.heartbeat = heartbeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String _id) {
|
public void setId(String _id) {
|
||||||
this._id = _id;
|
this.id = _id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Member [address=" + getAddress() + ", id=" + _id + ", heartbeat=" + _heartbeat + "]";
|
return "Member [address=" + getAddress() + ", id=" + id + ", heartbeat=" + heartbeat + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see java.lang.Object#hashCode()
|
* @see java.lang.Object#hashCode()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
String address = getAddress();
|
String address = getAddress();
|
||||||
result = prime * result
|
result = prime * result + ((address == null) ? 0 : address.hashCode()) + clusterName == null ? 0
|
||||||
+ ((address == null) ? 0 : address.hashCode())
|
: clusterName.hashCode();
|
||||||
+ _clusterName == null ? 0 : _clusterName.hashCode();
|
return result;
|
||||||
return result;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see java.lang.Object#equals(java.lang.Object)
|
* @see java.lang.Object#equals(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj) {
|
if (this == obj) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
System.err.println("equals(): obj is null.");
|
System.err.println("equals(): obj is null.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (! (obj instanceof GossipMember) ) {
|
if (!(obj instanceof GossipMember)) {
|
||||||
System.err.println("equals(): obj is not of type GossipMember.");
|
System.err.println("equals(): obj is not of type GossipMember.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// The object is the same of they both have the same address (hostname and port).
|
// The object is the same of they both have the same address (hostname and port).
|
||||||
return getAddress().equals(((LocalGossipMember) obj).getAddress()) &&
|
return getAddress().equals(((LocalGossipMember) obj).getAddress())
|
||||||
getClusterName().equals(((LocalGossipMember) obj).getClusterName());
|
&& getClusterName().equals(((LocalGossipMember) obj).getClusterName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the JSONObject which is the JSON representation of this GossipMember.
|
* Get the JSONObject which is the JSON representation of this GossipMember.
|
||||||
* @return The JSONObject of this GossipMember.
|
*
|
||||||
*/
|
* @return The JSONObject of this GossipMember.
|
||||||
public JSONObject toJSONObject() {
|
*/
|
||||||
try {
|
public JSONObject toJSONObject() {
|
||||||
JSONObject jsonObject = new JSONObject();
|
try {
|
||||||
jsonObject.put(JSON_CLUSTER, _clusterName);
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put(JSON_HOST, _host);
|
jsonObject.put(JSON_CLUSTER, clusterName);
|
||||||
jsonObject.put(JSON_PORT, _port);
|
jsonObject.put(JSON_HOST, host);
|
||||||
jsonObject.put(JSON_ID, _id);
|
jsonObject.put(JSON_PORT, port);
|
||||||
jsonObject.put(JSON_HEARTBEAT, _heartbeat);
|
jsonObject.put(JSON_ID, id);
|
||||||
return jsonObject;
|
jsonObject.put(JSON_HEARTBEAT, heartbeat);
|
||||||
} catch (JSONException e) {
|
return jsonObject;
|
||||||
throw new RuntimeException(e);
|
} catch (JSONException e) {
|
||||||
}
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int compareTo(GossipMember other){
|
public int compareTo(GossipMember other) {
|
||||||
return this.getAddress().compareTo(other.getAddress());
|
return this.getAddress().compareTo(other.getAddress());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,18 +27,15 @@ public class GossipRunner {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
File configFile;
|
File configFile;
|
||||||
|
|
||||||
if (args.length == 1) {
|
if (args.length == 1) {
|
||||||
configFile = new File("./" + args[0]);
|
configFile = new File("./" + args[0]);
|
||||||
} else {
|
} else {
|
||||||
configFile = new File("gossip.conf");
|
configFile = new File("gossip.conf");
|
||||||
}
|
}
|
||||||
|
|
||||||
new GossipRunner(configFile);
|
new GossipRunner(configFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GossipRunner(File configFile) {
|
public GossipRunner(File configFile) {
|
||||||
|
|
||||||
if (configFile != null && configFile.exists()) {
|
if (configFile != null && configFile.exists()) {
|
||||||
try {
|
try {
|
||||||
System.out.println("Parsing the configuration file...");
|
System.out.println("Parsing the configuration file...");
|
||||||
|
@ -36,7 +36,7 @@ public class GossipService {
|
|||||||
|
|
||||||
public static final Logger LOGGER = Logger.getLogger(GossipService.class);
|
public static final Logger LOGGER = Logger.getLogger(GossipService.class);
|
||||||
|
|
||||||
private GossipManager _gossipManager;
|
private GossipManager gossipManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor with the default settings.
|
* Constructor with the default settings.
|
||||||
@ -46,9 +46,9 @@ public class GossipService {
|
|||||||
*/
|
*/
|
||||||
public GossipService(StartupSettings startupSettings) throws InterruptedException,
|
public GossipService(StartupSettings startupSettings) throws InterruptedException,
|
||||||
UnknownHostException {
|
UnknownHostException {
|
||||||
this(startupSettings.getCluster(), InetAddress.getLocalHost().getHostAddress(), startupSettings.getPort(), startupSettings.getId(),
|
this(startupSettings.getCluster(), InetAddress.getLocalHost().getHostAddress(), startupSettings
|
||||||
startupSettings.getGossipMembers(), startupSettings
|
.getPort(), startupSettings.getId(), startupSettings.getGossipMembers(),
|
||||||
.getGossipSettings(), null);
|
startupSettings.getGossipSettings(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,26 +60,28 @@ public class GossipService {
|
|||||||
public GossipService(String cluster, String ipAddress, int port, String id,
|
public GossipService(String cluster, String ipAddress, int port, String id,
|
||||||
List<GossipMember> gossipMembers, GossipSettings settings, GossipListener listener)
|
List<GossipMember> gossipMembers, GossipSettings settings, GossipListener listener)
|
||||||
throws InterruptedException, UnknownHostException {
|
throws InterruptedException, UnknownHostException {
|
||||||
_gossipManager = new RandomGossipManager(cluster, ipAddress, port, id, settings, gossipMembers, listener);
|
gossipManager = new RandomGossipManager(cluster, ipAddress, port, id, settings, gossipMembers,
|
||||||
|
listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
String address = get_gossipManager().getMyself().getHost() + ":" + get_gossipManager().getMyself().getPort();
|
String address = get_gossipManager().getMyself().getHost() + ":"
|
||||||
LOGGER.debug( "Starting: " + _gossipManager.getName() + " - " + address );
|
+ get_gossipManager().getMyself().getPort();
|
||||||
|
LOGGER.debug("Starting: " + gossipManager.getName() + " - " + address);
|
||||||
|
|
||||||
_gossipManager.start();
|
gossipManager.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
_gossipManager.shutdown();
|
gossipManager.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GossipManager get_gossipManager() {
|
public GossipManager get_gossipManager() {
|
||||||
return _gossipManager;
|
return gossipManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_gossipManager(GossipManager _gossipManager) {
|
public void set_gossipManager(GossipManager _gossipManager) {
|
||||||
this._gossipManager = _gossipManager;
|
this.gossipManager = _gossipManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,10 +25,10 @@ package com.google.code.gossip;
|
|||||||
public class GossipSettings {
|
public class GossipSettings {
|
||||||
|
|
||||||
/** Time between gossip'ing in ms. Default is 1 second. */
|
/** Time between gossip'ing in ms. Default is 1 second. */
|
||||||
private int _gossipInterval = 1000;
|
private int gossipInterval = 1000;
|
||||||
|
|
||||||
/** Time between cleanups in ms. Default is 10 seconds. */
|
/** Time between cleanups in ms. Default is 10 seconds. */
|
||||||
private int _cleanupInterval = 10000;
|
private int cleanupInterval = 10000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct GossipSettings with default settings.
|
* Construct GossipSettings with default settings.
|
||||||
@ -45,8 +45,8 @@ public class GossipSettings {
|
|||||||
* The cleanup interval in ms.
|
* The cleanup interval in ms.
|
||||||
*/
|
*/
|
||||||
public GossipSettings(int gossipInterval, int cleanupInterval) {
|
public GossipSettings(int gossipInterval, int cleanupInterval) {
|
||||||
_gossipInterval = gossipInterval;
|
this.gossipInterval = gossipInterval;
|
||||||
_cleanupInterval = cleanupInterval;
|
this.cleanupInterval = cleanupInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,7 +56,7 @@ public class GossipSettings {
|
|||||||
* The gossip interval in ms.
|
* The gossip interval in ms.
|
||||||
*/
|
*/
|
||||||
public void setGossipTimeout(int gossipInterval) {
|
public void setGossipTimeout(int gossipInterval) {
|
||||||
_gossipInterval = gossipInterval;
|
this.gossipInterval = gossipInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,7 +67,7 @@ public class GossipSettings {
|
|||||||
* The cleanup interval in ms.
|
* The cleanup interval in ms.
|
||||||
*/
|
*/
|
||||||
public void setCleanupInterval(int cleanupInterval) {
|
public void setCleanupInterval(int cleanupInterval) {
|
||||||
_cleanupInterval = cleanupInterval;
|
this.cleanupInterval = cleanupInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,7 +76,7 @@ public class GossipSettings {
|
|||||||
* @return The gossip interval in ms.
|
* @return The gossip interval in ms.
|
||||||
*/
|
*/
|
||||||
public int getGossipInterval() {
|
public int getGossipInterval() {
|
||||||
return _gossipInterval;
|
return gossipInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,6 +85,6 @@ public class GossipSettings {
|
|||||||
* @return The cleanup interval.
|
* @return The cleanup interval.
|
||||||
*/
|
*/
|
||||||
public int getCleanupInterval() {
|
public int getCleanupInterval() {
|
||||||
return _cleanupInterval;
|
return cleanupInterval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,9 @@ import javax.management.timer.Timer;
|
|||||||
*/
|
*/
|
||||||
public class GossipTimeoutTimer extends Timer {
|
public class GossipTimeoutTimer extends Timer {
|
||||||
|
|
||||||
private final long _sleepTime;
|
private final long sleepTime;
|
||||||
private final LocalGossipMember _source;
|
|
||||||
|
private final LocalGossipMember source;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor. Creates a reset-able timer that wakes up after millisecondsSleepTime.
|
* Constructor. Creates a reset-able timer that wakes up after millisecondsSleepTime.
|
||||||
@ -45,8 +46,8 @@ public class GossipTimeoutTimer extends Timer {
|
|||||||
public GossipTimeoutTimer(long millisecondsSleepTime, NotificationListener notificationListener,
|
public GossipTimeoutTimer(long millisecondsSleepTime, NotificationListener notificationListener,
|
||||||
LocalGossipMember member) {
|
LocalGossipMember member) {
|
||||||
super();
|
super();
|
||||||
_sleepTime = millisecondsSleepTime;
|
sleepTime = millisecondsSleepTime;
|
||||||
_source = member;
|
source = member;
|
||||||
addNotificationListener(notificationListener, null, null);
|
addNotificationListener(notificationListener, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +64,7 @@ public class GossipTimeoutTimer extends Timer {
|
|||||||
*/
|
*/
|
||||||
public void reset() {
|
public void reset() {
|
||||||
removeAllNotifications();
|
removeAllNotifications();
|
||||||
setWakeupTime(_sleepTime);
|
setWakeupTime(sleepTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,6 +73,6 @@ public class GossipTimeoutTimer extends Timer {
|
|||||||
* @param milliseconds
|
* @param milliseconds
|
||||||
*/
|
*/
|
||||||
private void setWakeupTime(long milliseconds) {
|
private void setWakeupTime(long milliseconds) {
|
||||||
addNotification("type", "message", _source, new Date(System.currentTimeMillis() + milliseconds));
|
addNotification("type", "message", source, new Date(System.currentTimeMillis() + milliseconds));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,28 +43,28 @@ public class LocalGossipMember extends GossipMember {
|
|||||||
* @param cleanupTimeout
|
* @param cleanupTimeout
|
||||||
* The cleanup timeout for this gossip member.
|
* The cleanup timeout for this gossip member.
|
||||||
*/
|
*/
|
||||||
public LocalGossipMember(String clusterName, String hostname, int port, String id, long heartbeat,
|
public LocalGossipMember(String clusterName, String hostname, int port, String id,
|
||||||
NotificationListener notificationListener, int cleanupTimeout) {
|
long heartbeat, NotificationListener notificationListener, int cleanupTimeout) {
|
||||||
super(clusterName, hostname, port, id, heartbeat);
|
super(clusterName, hostname, port, id, heartbeat);
|
||||||
|
|
||||||
this.timeoutTimer = new GossipTimeoutTimer(cleanupTimeout, notificationListener, this);
|
timeoutTimer = new GossipTimeoutTimer(cleanupTimeout, notificationListener, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start the timeout timer.
|
* Start the timeout timer.
|
||||||
*/
|
*/
|
||||||
public void startTimeoutTimer() {
|
public void startTimeoutTimer() {
|
||||||
this.timeoutTimer.start();
|
timeoutTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the timeout timer.
|
* Reset the timeout timer.
|
||||||
*/
|
*/
|
||||||
public void resetTimeoutTimer() {
|
public void resetTimeoutTimer() {
|
||||||
this.timeoutTimer.reset();
|
timeoutTimer.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disableTimer() {
|
public void disableTimer() {
|
||||||
this.timeoutTimer.removeAllNotifications();
|
timeoutTimer.removeAllNotifications();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,18 +39,18 @@ public class StartupSettings {
|
|||||||
private static final Logger log = Logger.getLogger(StartupSettings.class);
|
private static final Logger log = Logger.getLogger(StartupSettings.class);
|
||||||
|
|
||||||
/** The id to use fo the service */
|
/** The id to use fo the service */
|
||||||
private String _id;
|
private String id;
|
||||||
|
|
||||||
/** The port to start the gossip service on. */
|
/** The port to start the gossip service on. */
|
||||||
private int _port;
|
private int port;
|
||||||
|
|
||||||
private String cluster;
|
private String cluster;
|
||||||
|
|
||||||
/** The gossip settings used at startup. */
|
/** The gossip settings used at startup. */
|
||||||
private final GossipSettings _gossipSettings;
|
private final GossipSettings gossipSettings;
|
||||||
|
|
||||||
/** The list with gossip members to start with. */
|
/** The list with gossip members to start with. */
|
||||||
private final List<GossipMember> _gossipMembers;
|
private final List<GossipMember> gossipMembers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
@ -75,18 +75,18 @@ public class StartupSettings {
|
|||||||
* The port to start the service on.
|
* The port to start the service on.
|
||||||
*/
|
*/
|
||||||
public StartupSettings(String id, int port, GossipSettings gossipSettings) {
|
public StartupSettings(String id, int port, GossipSettings gossipSettings) {
|
||||||
_id = id;
|
this.id = id;
|
||||||
_port = port;
|
this.port = port;
|
||||||
_gossipSettings = gossipSettings;
|
this.gossipSettings = gossipSettings;
|
||||||
_gossipMembers = new ArrayList<>();
|
gossipMembers = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCluster(String cluster){
|
public void setCluster(String cluster) {
|
||||||
this.cluster = cluster;
|
this.cluster = cluster;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCluster(){
|
public String getCluster() {
|
||||||
return this.cluster;
|
return cluster;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,8 +95,8 @@ public class StartupSettings {
|
|||||||
* @param id
|
* @param id
|
||||||
* The id for this service.
|
* The id for this service.
|
||||||
*/
|
*/
|
||||||
public void setId( String id ) {
|
public void setId(String id) {
|
||||||
_id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,7 +105,7 @@ public class StartupSettings {
|
|||||||
* @return the service's id.
|
* @return the service's id.
|
||||||
*/
|
*/
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return _id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,7 +115,7 @@ public class StartupSettings {
|
|||||||
* The port for the gossip service.
|
* The port for the gossip service.
|
||||||
*/
|
*/
|
||||||
public void setPort(int port) {
|
public void setPort(int port) {
|
||||||
_port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -124,7 +124,7 @@ public class StartupSettings {
|
|||||||
* @return The port of the gossip service.
|
* @return The port of the gossip service.
|
||||||
*/
|
*/
|
||||||
public int getPort() {
|
public int getPort() {
|
||||||
return _port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,7 +133,7 @@ public class StartupSettings {
|
|||||||
* @return The GossipSettings object.
|
* @return The GossipSettings object.
|
||||||
*/
|
*/
|
||||||
public GossipSettings getGossipSettings() {
|
public GossipSettings getGossipSettings() {
|
||||||
return _gossipSettings;
|
return gossipSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,7 +143,7 @@ public class StartupSettings {
|
|||||||
* The member to add.
|
* The member to add.
|
||||||
*/
|
*/
|
||||||
public void addGossipMember(GossipMember member) {
|
public void addGossipMember(GossipMember member) {
|
||||||
_gossipMembers.add(member);
|
gossipMembers.add(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -152,7 +152,7 @@ public class StartupSettings {
|
|||||||
* @return The gossip members.
|
* @return The gossip members.
|
||||||
*/
|
*/
|
||||||
public List<GossipMember> getGossipMembers() {
|
public List<GossipMember> getGossipMembers() {
|
||||||
return _gossipMembers;
|
return gossipMembers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,13 +171,15 @@ public class StartupSettings {
|
|||||||
public static StartupSettings fromJSONFile(File jsonFile) throws JSONException,
|
public static StartupSettings fromJSONFile(File jsonFile) throws JSONException,
|
||||||
FileNotFoundException, IOException {
|
FileNotFoundException, IOException {
|
||||||
// Read the file to a String.
|
// Read the file to a String.
|
||||||
BufferedReader br = new BufferedReader(new FileReader(jsonFile));
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
StringBuffer buffer = new StringBuffer();
|
||||||
String line;
|
try (BufferedReader br = new BufferedReader(new FileReader(jsonFile)) ){
|
||||||
while ((line = br.readLine()) != null) {
|
String line;
|
||||||
buffer.append(line.trim());
|
while ((line = br.readLine()) != null) {
|
||||||
|
buffer.append(line.trim());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Lets parse the String as JSON.
|
// Lets parse the String as JSON.
|
||||||
JSONObject jsonObject = new JSONArray(buffer.toString()).getJSONObject(0);
|
JSONObject jsonObject = new JSONArray(buffer.toString()).getJSONObject(0);
|
||||||
|
|
||||||
@ -194,22 +196,22 @@ public class StartupSettings {
|
|||||||
int cleanupInterval = jsonObject.getInt("cleanup_interval");
|
int cleanupInterval = jsonObject.getInt("cleanup_interval");
|
||||||
|
|
||||||
// Initiate the settings with the port number.
|
// Initiate the settings with the port number.
|
||||||
StartupSettings settings = new StartupSettings(id, port, new GossipSettings(
|
StartupSettings settings = new StartupSettings(id, port, new GossipSettings(gossipInterval,
|
||||||
gossipInterval, cleanupInterval));
|
cleanupInterval));
|
||||||
|
|
||||||
// Now iterate over the members from the config file and add them to the settings.
|
// Now iterate over the members from the config file and add them to the settings.
|
||||||
String configMembersDetails = "Config-members [";
|
String configMembersDetails = "Config-members [";
|
||||||
JSONArray membersJSON = jsonObject.getJSONArray("members");
|
JSONArray membersJSON = jsonObject.getJSONArray("members");
|
||||||
for (int i = 0; i < membersJSON.length(); i++) {
|
for (int i = 0; i < membersJSON.length(); i++) {
|
||||||
JSONObject memberJSON = membersJSON.getJSONObject(i);
|
JSONObject memberJSON = membersJSON.getJSONObject(i);
|
||||||
RemoteGossipMember member = new RemoteGossipMember(memberJSON.getString("cluster"), memberJSON.getString("host"),
|
RemoteGossipMember member = new RemoteGossipMember(memberJSON.getString("cluster"),
|
||||||
memberJSON.getInt("port"), "");
|
memberJSON.getString("host"), memberJSON.getInt("port"), "");
|
||||||
settings.addGossipMember(member);
|
settings.addGossipMember(member);
|
||||||
configMembersDetails += member.getAddress();
|
configMembersDetails += member.getAddress();
|
||||||
if (i < (membersJSON.length() - 1))
|
if (i < (membersJSON.length() - 1))
|
||||||
configMembersDetails += ", ";
|
configMembersDetails += ", ";
|
||||||
}
|
}
|
||||||
log.info( configMembersDetails + "]" );
|
log.info(configMembersDetails + "]");
|
||||||
|
|
||||||
// Return the created settings object.
|
// Return the created settings object.
|
||||||
return settings;
|
return settings;
|
||||||
|
@ -21,7 +21,7 @@ public enum GossipState {
|
|||||||
UP("up"), DOWN("down");
|
UP("up"), DOWN("down");
|
||||||
private final String state;
|
private final String state;
|
||||||
|
|
||||||
private GossipState(String state){
|
private GossipState(String state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,31 +31,31 @@ import com.google.code.gossip.LocalGossipMember;
|
|||||||
*/
|
*/
|
||||||
abstract public class ActiveGossipThread implements Runnable {
|
abstract public class ActiveGossipThread implements Runnable {
|
||||||
|
|
||||||
protected final GossipManager _gossipManager;
|
protected final GossipManager gossipManager;
|
||||||
|
|
||||||
private final AtomicBoolean _keepRunning;
|
private final AtomicBoolean keepRunning;
|
||||||
|
|
||||||
public ActiveGossipThread(GossipManager gossipManager) {
|
public ActiveGossipThread(GossipManager gossipManager) {
|
||||||
_gossipManager = gossipManager;
|
this.gossipManager = gossipManager;
|
||||||
_keepRunning = new AtomicBoolean(true);
|
this.keepRunning = new AtomicBoolean(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while (_keepRunning.get()) {
|
while (keepRunning.get()) {
|
||||||
try {
|
try {
|
||||||
TimeUnit.MILLISECONDS.sleep(_gossipManager.getSettings().getGossipInterval());
|
TimeUnit.MILLISECONDS.sleep(gossipManager.getSettings().getGossipInterval());
|
||||||
sendMembershipList(_gossipManager.getMyself(), _gossipManager.getMemberList());
|
sendMembershipList(gossipManager.getMyself(), gossipManager.getMemberList());
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
GossipService.LOGGER.error(e);
|
GossipService.LOGGER.error(e);
|
||||||
_keepRunning.set(false);
|
keepRunning.set(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
shutdown();
|
shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
_keepRunning.set(false);
|
keepRunning.set(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,39 +43,50 @@ import com.google.code.gossip.event.GossipState;
|
|||||||
public abstract class GossipManager extends Thread implements NotificationListener {
|
public abstract class GossipManager extends Thread implements NotificationListener {
|
||||||
|
|
||||||
public static final Logger LOGGER = Logger.getLogger(GossipManager.class);
|
public static final Logger LOGGER = Logger.getLogger(GossipManager.class);
|
||||||
|
|
||||||
public static final int MAX_PACKET_SIZE = 102400;
|
public static final int MAX_PACKET_SIZE = 102400;
|
||||||
|
|
||||||
private final ConcurrentSkipListMap<LocalGossipMember,GossipState> members;
|
private final ConcurrentSkipListMap<LocalGossipMember, GossipState> members;
|
||||||
private final LocalGossipMember _me;
|
|
||||||
private final GossipSettings _settings;
|
private final LocalGossipMember me;
|
||||||
private final AtomicBoolean _gossipServiceRunning;
|
|
||||||
private final Class<? extends PassiveGossipThread> _passiveGossipThreadClass;
|
private final GossipSettings settings;
|
||||||
private final Class<? extends ActiveGossipThread> _activeGossipThreadClass;
|
|
||||||
|
private final AtomicBoolean gossipServiceRunning;
|
||||||
|
|
||||||
|
private final Class<? extends PassiveGossipThread> passiveGossipThreadClass;
|
||||||
|
|
||||||
|
private final Class<? extends ActiveGossipThread> activeGossipThreadClass;
|
||||||
|
|
||||||
private final GossipListener listener;
|
private final GossipListener listener;
|
||||||
|
|
||||||
private ActiveGossipThread activeGossipThread;
|
private ActiveGossipThread activeGossipThread;
|
||||||
|
|
||||||
private PassiveGossipThread passiveGossipThread;
|
private PassiveGossipThread passiveGossipThread;
|
||||||
private ExecutorService _gossipThreadExecutor;
|
|
||||||
|
private ExecutorService gossipThreadExecutor;
|
||||||
|
|
||||||
public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass,
|
public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass,
|
||||||
Class<? extends ActiveGossipThread> activeGossipThreadClass, String cluster, String address, int port,
|
Class<? extends ActiveGossipThread> activeGossipThreadClass, String cluster,
|
||||||
String id, GossipSettings settings, List<GossipMember> gossipMembers,
|
String address, int port, String id, GossipSettings settings,
|
||||||
GossipListener listener) {
|
List<GossipMember> gossipMembers, GossipListener listener) {
|
||||||
_passiveGossipThreadClass = passiveGossipThreadClass;
|
this.passiveGossipThreadClass = passiveGossipThreadClass;
|
||||||
_activeGossipThreadClass = activeGossipThreadClass;
|
this.activeGossipThreadClass = activeGossipThreadClass;
|
||||||
_settings = settings;
|
this.settings = settings;
|
||||||
_me = new LocalGossipMember(cluster, address, port, id, System.currentTimeMillis(), this, settings.getCleanupInterval());
|
me = new LocalGossipMember(cluster, address, port, id, System.currentTimeMillis(), this,
|
||||||
|
settings.getCleanupInterval());
|
||||||
members = new ConcurrentSkipListMap<>();
|
members = new ConcurrentSkipListMap<>();
|
||||||
for (GossipMember startupMember : gossipMembers) {
|
for (GossipMember startupMember : gossipMembers) {
|
||||||
if (!startupMember.equals(_me)) {
|
if (!startupMember.equals(me)) {
|
||||||
LocalGossipMember member = new LocalGossipMember(startupMember.getClusterName(), startupMember.getHost(),
|
LocalGossipMember member = new LocalGossipMember(startupMember.getClusterName(),
|
||||||
startupMember.getPort(), startupMember.getId(), System.currentTimeMillis(), this,
|
startupMember.getHost(), startupMember.getPort(), startupMember.getId(),
|
||||||
settings.getCleanupInterval());
|
System.currentTimeMillis(), this, settings.getCleanupInterval());
|
||||||
members.put(member, GossipState.UP);
|
members.put(member, GossipState.UP);
|
||||||
GossipService.LOGGER.debug(member);
|
GossipService.LOGGER.debug(member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_gossipThreadExecutor = Executors.newCachedThreadPool();
|
gossipThreadExecutor = Executors.newCachedThreadPool();
|
||||||
_gossipServiceRunning = new AtomicBoolean(true);
|
gossipServiceRunning = new AtomicBoolean(true);
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -98,9 +109,9 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void revivieMember(LocalGossipMember m){
|
public void revivieMember(LocalGossipMember m) {
|
||||||
for ( Entry<LocalGossipMember, GossipState> it : this.members.entrySet()){
|
for (Entry<LocalGossipMember, GossipState> it : this.members.entrySet()) {
|
||||||
if (it.getKey().getId().equals(m.getId())){
|
if (it.getKey().getId().equals(m.getId())) {
|
||||||
it.getKey().disableTimer();
|
it.getKey().disableTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,7 +122,7 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createOrRevivieMember(LocalGossipMember m){
|
public void createOrRevivieMember(LocalGossipMember m) {
|
||||||
members.put(m, GossipState.UP);
|
members.put(m, GossipState.UP);
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.gossipEvent(m, GossipState.UP);
|
listener.gossipEvent(m, GossipState.UP);
|
||||||
@ -119,7 +130,7 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GossipSettings getSettings() {
|
public GossipSettings getSettings() {
|
||||||
return _settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,8 +139,8 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
*/
|
*/
|
||||||
public List<LocalGossipMember> getMemberList() {
|
public List<LocalGossipMember> getMemberList() {
|
||||||
List<LocalGossipMember> up = new ArrayList<>();
|
List<LocalGossipMember> up = new ArrayList<>();
|
||||||
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()){
|
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()) {
|
||||||
if (GossipState.UP.equals(entry.getValue())){
|
if (GossipState.UP.equals(entry.getValue())) {
|
||||||
up.add(entry.getKey());
|
up.add(entry.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,13 +148,13 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
}
|
}
|
||||||
|
|
||||||
public LocalGossipMember getMyself() {
|
public LocalGossipMember getMyself() {
|
||||||
return _me;
|
return me;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<LocalGossipMember> getDeadList() {
|
public List<LocalGossipMember> getDeadList() {
|
||||||
List<LocalGossipMember> up = new ArrayList<>();
|
List<LocalGossipMember> up = new ArrayList<>();
|
||||||
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()){
|
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()) {
|
||||||
if (GossipState.DOWN.equals(entry.getValue())){
|
if (GossipState.DOWN.equals(entry.getValue())) {
|
||||||
up.add(entry.getKey());
|
up.add(entry.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,23 +167,23 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
for (LocalGossipMember member : members.keySet()) {
|
for (LocalGossipMember member : members.keySet()) {
|
||||||
if (member != _me) {
|
if (member != me) {
|
||||||
member.startTimeoutTimer();
|
member.startTimeoutTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
passiveGossipThread = _passiveGossipThreadClass.getConstructor(GossipManager.class)
|
passiveGossipThread = passiveGossipThreadClass.getConstructor(GossipManager.class)
|
||||||
.newInstance(this);
|
.newInstance(this);
|
||||||
_gossipThreadExecutor.execute(passiveGossipThread);
|
gossipThreadExecutor.execute(passiveGossipThread);
|
||||||
activeGossipThread = _activeGossipThreadClass.getConstructor(GossipManager.class)
|
activeGossipThread = activeGossipThreadClass.getConstructor(GossipManager.class)
|
||||||
.newInstance(this);
|
.newInstance(this);
|
||||||
_gossipThreadExecutor.execute(activeGossipThread);
|
gossipThreadExecutor.execute(activeGossipThread);
|
||||||
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
||||||
| InvocationTargetException | NoSuchMethodException | SecurityException e1) {
|
| InvocationTargetException | NoSuchMethodException | SecurityException e1) {
|
||||||
throw new RuntimeException(e1);
|
throw new RuntimeException(e1);
|
||||||
}
|
}
|
||||||
GossipService.LOGGER.debug("The GossipService is started.");
|
GossipService.LOGGER.debug("The GossipService is started.");
|
||||||
while (_gossipServiceRunning.get()) {
|
while (gossipServiceRunning.get()) {
|
||||||
try {
|
try {
|
||||||
// TODO
|
// TODO
|
||||||
TimeUnit.MILLISECONDS.sleep(1);
|
TimeUnit.MILLISECONDS.sleep(1);
|
||||||
@ -186,17 +197,17 @@ public abstract class GossipManager extends Thread implements NotificationListen
|
|||||||
* Shutdown the gossip service.
|
* Shutdown the gossip service.
|
||||||
*/
|
*/
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
_gossipServiceRunning.set(false);
|
gossipServiceRunning.set(false);
|
||||||
_gossipThreadExecutor.shutdown();
|
gossipThreadExecutor.shutdown();
|
||||||
if (passiveGossipThread != null){
|
if (passiveGossipThread != null) {
|
||||||
passiveGossipThread.shutdown();
|
passiveGossipThread.shutdown();
|
||||||
}
|
}
|
||||||
if (activeGossipThread != null){
|
if (activeGossipThread != null) {
|
||||||
activeGossipThread.shutdown();
|
activeGossipThread.shutdown();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
boolean result = _gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
|
boolean result = gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
|
||||||
if (!result){
|
if (!result) {
|
||||||
LOGGER.error("executor shutdown timed out");
|
LOGGER.error("executor shutdown timed out");
|
||||||
}
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
@ -47,38 +47,38 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
public static final Logger LOGGER = Logger.getLogger(PassiveGossipThread.class);
|
public static final Logger LOGGER = Logger.getLogger(PassiveGossipThread.class);
|
||||||
|
|
||||||
/** The socket used for the passive thread of the gossip service. */
|
/** The socket used for the passive thread of the gossip service. */
|
||||||
private DatagramSocket _server;
|
private DatagramSocket server;
|
||||||
|
|
||||||
private final GossipManager _gossipManager;
|
private final GossipManager gossipManager;
|
||||||
|
|
||||||
private AtomicBoolean _keepRunning;
|
private AtomicBoolean keepRunning;
|
||||||
|
|
||||||
private final String _cluster;
|
private final String cluster;
|
||||||
|
|
||||||
public PassiveGossipThread(GossipManager gossipManager) {
|
public PassiveGossipThread(GossipManager gossipManager) {
|
||||||
_gossipManager = gossipManager;
|
this.gossipManager = gossipManager;
|
||||||
try {
|
try {
|
||||||
SocketAddress socketAddress = new InetSocketAddress(_gossipManager.getMyself().getHost(),
|
SocketAddress socketAddress = new InetSocketAddress(gossipManager.getMyself().getHost(),
|
||||||
_gossipManager.getMyself().getPort());
|
gossipManager.getMyself().getPort());
|
||||||
_server = new DatagramSocket(socketAddress);
|
server = new DatagramSocket(socketAddress);
|
||||||
GossipService.LOGGER.debug("Gossip service successfully initialized on port "
|
GossipService.LOGGER.debug("Gossip service successfully initialized on port "
|
||||||
+ _gossipManager.getMyself().getPort());
|
+ gossipManager.getMyself().getPort());
|
||||||
GossipService.LOGGER.debug("I am " + _gossipManager.getMyself());
|
GossipService.LOGGER.debug("I am " + gossipManager.getMyself());
|
||||||
_cluster = _gossipManager.getMyself().getClusterName();
|
cluster = gossipManager.getMyself().getClusterName();
|
||||||
} catch (SocketException ex) {
|
} catch (SocketException ex) {
|
||||||
GossipService.LOGGER.warn(ex);
|
GossipService.LOGGER.warn(ex);
|
||||||
throw new RuntimeException(ex);
|
throw new RuntimeException(ex);
|
||||||
}
|
}
|
||||||
_keepRunning = new AtomicBoolean(true);
|
keepRunning = new AtomicBoolean(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while (_keepRunning.get()) {
|
while (keepRunning.get()) {
|
||||||
try {
|
try {
|
||||||
byte[] buf = new byte[_server.getReceiveBufferSize()];
|
byte[] buf = new byte[server.getReceiveBufferSize()];
|
||||||
DatagramPacket p = new DatagramPacket(buf, buf.length);
|
DatagramPacket p = new DatagramPacket(buf, buf.length);
|
||||||
_server.receive(p);
|
server.receive(p);
|
||||||
int packet_length = 0;
|
int packet_length = 0;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
int shift = (4 - 1 - i) * 8;
|
int shift = (4 - 1 - i) * 8;
|
||||||
@ -98,7 +98,8 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
JSONArray jsonArray = new JSONArray(receivedMessage);
|
JSONArray jsonArray = new JSONArray(receivedMessage);
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
JSONObject memberJSONObject = jsonArray.getJSONObject(i);
|
JSONObject memberJSONObject = jsonArray.getJSONObject(i);
|
||||||
if (memberJSONObject.length() == 5 && _cluster.equals(memberJSONObject.get(GossipMember.JSON_CLUSTER))) {
|
if (memberJSONObject.length() == 5
|
||||||
|
&& cluster.equals(memberJSONObject.get(GossipMember.JSON_CLUSTER))) {
|
||||||
RemoteGossipMember member = new RemoteGossipMember(
|
RemoteGossipMember member = new RemoteGossipMember(
|
||||||
memberJSONObject.getString(GossipMember.JSON_CLUSTER),
|
memberJSONObject.getString(GossipMember.JSON_CLUSTER),
|
||||||
memberJSONObject.getString(GossipMember.JSON_HOST),
|
memberJSONObject.getString(GossipMember.JSON_HOST),
|
||||||
@ -112,7 +113,7 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
senderMember = member;
|
senderMember = member;
|
||||||
}
|
}
|
||||||
remoteGossipMembers.add(member);
|
remoteGossipMembers.add(member);
|
||||||
} else if(memberJSONObject.length() == 5) {
|
} else if (memberJSONObject.length() == 5) {
|
||||||
GossipService.LOGGER.warn("The member object does not belong to this cluster.");
|
GossipService.LOGGER.warn("The member object does not belong to this cluster.");
|
||||||
} else {
|
} else {
|
||||||
GossipService.LOGGER
|
GossipService.LOGGER
|
||||||
@ -121,7 +122,7 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
mergeLists(_gossipManager, senderMember, remoteGossipMembers);
|
mergeLists(gossipManager, senderMember, remoteGossipMembers);
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
GossipService.LOGGER
|
GossipService.LOGGER
|
||||||
.error("The received message is not well-formed JSON. The following message has been dropped:\n"
|
.error("The received message is not well-formed JSON. The following message has been dropped:\n"
|
||||||
@ -137,7 +138,7 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
GossipService.LOGGER.error(e);
|
GossipService.LOGGER.error(e);
|
||||||
System.out.println(e);
|
System.out.println(e);
|
||||||
_keepRunning.set(false);
|
keepRunning.set(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
shutdown();
|
shutdown();
|
||||||
@ -145,8 +146,9 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
try {
|
try {
|
||||||
_server.close();
|
server.close();
|
||||||
} catch (RuntimeException ex){ }
|
} catch (RuntimeException ex) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,11 +167,9 @@ abstract public class PassiveGossipThread implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* random comments
|
* random comments // Check whether the package is smaller than the maximal packet length. // A
|
||||||
* // Check whether the package is smaller than the maximal packet length.
|
* package larger than this would not be possible to be send from a GossipService, // since this is
|
||||||
// A package larger than this would not be possible to be send from a GossipService,
|
* check before sending the message. // This could normally only occur when the list of members is
|
||||||
// since this is check before sending the message.
|
* very big, // or when the packet is malformed, and the first 4 bytes is not the right in anymore.
|
||||||
// This could normally only occur when the list of members is very big,
|
* // For this reason we regards the message.
|
||||||
// or when the packet is malformed, and the first 4 bytes is not the right in anymore.
|
*/
|
||||||
// For this reason we regards the message.
|
|
||||||
* */
|
|
||||||
|
@ -44,13 +44,14 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
|
|||||||
protected void mergeLists(GossipManager gossipManager, RemoteGossipMember senderMember,
|
protected void mergeLists(GossipManager gossipManager, RemoteGossipMember senderMember,
|
||||||
List<GossipMember> remoteList) {
|
List<GossipMember> remoteList) {
|
||||||
|
|
||||||
//if the person sending to us is in the dead list consider them up
|
// if the person sending to us is in the dead list consider them up
|
||||||
for (LocalGossipMember i : gossipManager.getDeadList()){
|
for (LocalGossipMember i : gossipManager.getDeadList()) {
|
||||||
if (i.getId().equals(senderMember.getId())){
|
if (i.getId().equals(senderMember.getId())) {
|
||||||
System.out.println(gossipManager.getMyself() +" caught a live one!");
|
System.out.println(gossipManager.getMyself() + " caught a live one!");
|
||||||
LocalGossipMember newLocalMember = new LocalGossipMember(senderMember.getClusterName(), senderMember.getHost(),
|
LocalGossipMember newLocalMember = new LocalGossipMember(senderMember.getClusterName(),
|
||||||
senderMember.getPort(), senderMember.getId(), senderMember.getHeartbeat(),
|
senderMember.getHost(), senderMember.getPort(), senderMember.getId(),
|
||||||
gossipManager, gossipManager.getSettings().getCleanupInterval());
|
senderMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
|
||||||
|
.getCleanupInterval());
|
||||||
gossipManager.revivieMember(newLocalMember);
|
gossipManager.revivieMember(newLocalMember);
|
||||||
newLocalMember.startTimeoutTimer();
|
newLocalMember.startTimeoutTimer();
|
||||||
}
|
}
|
||||||
@ -67,10 +68,11 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
|
|||||||
localMember.resetTimeoutTimer();
|
localMember.resetTimeoutTimer();
|
||||||
}
|
}
|
||||||
} else if (!gossipManager.getMemberList().contains(remoteMember)
|
} else if (!gossipManager.getMemberList().contains(remoteMember)
|
||||||
&& !gossipManager.getDeadList().contains(remoteMember) ){
|
&& !gossipManager.getDeadList().contains(remoteMember)) {
|
||||||
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(), remoteMember.getHost(),
|
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(),
|
||||||
remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(),
|
remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(),
|
||||||
gossipManager, gossipManager.getSettings().getCleanupInterval());
|
remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
|
||||||
|
.getCleanupInterval());
|
||||||
gossipManager.createOrRevivieMember(newLocalMember);
|
gossipManager.createOrRevivieMember(newLocalMember);
|
||||||
newLocalMember.startTimeoutTimer();
|
newLocalMember.startTimeoutTimer();
|
||||||
} else {
|
} else {
|
||||||
@ -78,9 +80,10 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
|
|||||||
LocalGossipMember localDeadMember = gossipManager.getDeadList().get(
|
LocalGossipMember localDeadMember = gossipManager.getDeadList().get(
|
||||||
gossipManager.getDeadList().indexOf(remoteMember));
|
gossipManager.getDeadList().indexOf(remoteMember));
|
||||||
if (remoteMember.getHeartbeat() > localDeadMember.getHeartbeat()) {
|
if (remoteMember.getHeartbeat() > localDeadMember.getHeartbeat()) {
|
||||||
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(), remoteMember.getHost(),
|
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(),
|
||||||
remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(),
|
remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(),
|
||||||
gossipManager, gossipManager.getSettings().getCleanupInterval());
|
remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
|
||||||
|
.getCleanupInterval());
|
||||||
gossipManager.revivieMember(newLocalMember);
|
gossipManager.revivieMember(newLocalMember);
|
||||||
newLocalMember.startTimeoutTimer();
|
newLocalMember.startTimeoutTimer();
|
||||||
GossipService.LOGGER.debug("Removed remote member " + remoteMember.getAddress()
|
GossipService.LOGGER.debug("Removed remote member " + remoteMember.getAddress()
|
||||||
@ -98,7 +101,7 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
|
|||||||
GossipService.LOGGER.debug("remote " + remoteList);
|
GossipService.LOGGER.debug("remote " + remoteList);
|
||||||
GossipService.LOGGER.debug("live " + gossipManager.getMemberList());
|
GossipService.LOGGER.debug("live " + gossipManager.getMemberList());
|
||||||
GossipService.LOGGER.debug("dead " + gossipManager.getDeadList());
|
GossipService.LOGGER.debug("dead " + gossipManager.getDeadList());
|
||||||
//throw new IllegalArgumentException("wtf");
|
// throw new IllegalArgumentException("wtf");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,25 +110,19 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
old comment section:
|
* old comment section: // If a member is restarted the heartbeat will restart from 1, so we should
|
||||||
// If a member is restarted the heartbeat will restart from 1, so we should check
|
* check // that here. // So a member can become from the dead when it is either larger than a
|
||||||
// that here.
|
* previous // heartbeat (due to network failure) // or when the heartbeat is 1 (after a restart of
|
||||||
// So a member can become from the dead when it is either larger than a previous
|
* the service). // TODO: What if the first message of a gossip service is sent to a dead node? The
|
||||||
// heartbeat (due to network failure)
|
* // second member will receive a heartbeat of two. // TODO: The above does happen. Maybe a special
|
||||||
// or when the heartbeat is 1 (after a restart of the service).
|
* message for a revived member? // TODO: Or maybe when a member is declared dead for more than //
|
||||||
// TODO: What if the first message of a gossip service is sent to a dead node? The
|
* _settings.getCleanupInterval() ms, reset the heartbeat to 0. // It will then accept a revived
|
||||||
// second member will receive a heartbeat of two.
|
* member. // The above is now handle by checking whether the heartbeat differs //
|
||||||
// TODO: The above does happen. Maybe a special message for a revived member?
|
* _settings.getCleanupInterval(), it must be restarted.
|
||||||
// TODO: Or maybe when a member is declared dead for more than
|
*/
|
||||||
// _settings.getCleanupInterval() ms, reset the heartbeat to 0.
|
|
||||||
// It will then accept a revived member.
|
|
||||||
// The above is now handle by checking whether the heartbeat differs
|
|
||||||
// _settings.getCleanupInterval(), it must be restarted.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// The remote member is back from the dead.
|
* // The remote member is back from the dead. // Remove it from the dead list. //
|
||||||
// Remove it from the dead list.
|
* gossipManager.getDeadList().remove(localDeadMember); // Add it as a new member and add it to the
|
||||||
// gossipManager.getDeadList().remove(localDeadMember);
|
* member list.
|
||||||
// Add it as a new member and add it to the member list.
|
*/
|
||||||
*/
|
|
@ -47,8 +47,8 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
|
|||||||
if (member == null) {
|
if (member == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try (DatagramSocket socket = new DatagramSocket()){
|
try (DatagramSocket socket = new DatagramSocket()) {
|
||||||
socket.setSoTimeout(_gossipManager.getSettings().getGossipInterval());
|
socket.setSoTimeout(gossipManager.getSettings().getGossipInterval());
|
||||||
InetAddress dest = InetAddress.getByName(member.getHost());
|
InetAddress dest = InetAddress.getByName(member.getHost());
|
||||||
JSONArray jsonArray = new JSONArray();
|
JSONArray jsonArray = new JSONArray();
|
||||||
jsonArray.put(me.toJSONObject());
|
jsonArray.put(me.toJSONObject());
|
||||||
@ -60,8 +60,7 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
|
|||||||
int packet_length = json_bytes.length;
|
int packet_length = json_bytes.length;
|
||||||
if (packet_length < GossipManager.MAX_PACKET_SIZE) {
|
if (packet_length < GossipManager.MAX_PACKET_SIZE) {
|
||||||
byte[] buf = createBuffer(packet_length, json_bytes);
|
byte[] buf = createBuffer(packet_length, json_bytes);
|
||||||
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, dest,
|
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, dest, member.getPort());
|
||||||
member.getPort());
|
|
||||||
socket.send(datagramPacket);
|
socket.send(datagramPacket);
|
||||||
} else {
|
} else {
|
||||||
GossipService.LOGGER.error("The length of the to be send message is too large ("
|
GossipService.LOGGER.error("The length of the to be send message is too large ("
|
||||||
@ -72,7 +71,7 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] createBuffer(int packetLength, byte [] jsonBytes){
|
private byte[] createBuffer(int packetLength, byte[] jsonBytes) {
|
||||||
byte[] lengthBytes = new byte[4];
|
byte[] lengthBytes = new byte[4];
|
||||||
lengthBytes[0] = (byte) (packetLength >> 24);
|
lengthBytes[0] = (byte) (packetLength >> 24);
|
||||||
lengthBytes[1] = (byte) ((packetLength << 8) >> 24);
|
lengthBytes[1] = (byte) ((packetLength << 8) >> 24);
|
||||||
|
@ -28,11 +28,11 @@ import com.google.code.gossip.manager.impl.SendMembersActiveGossipThread;
|
|||||||
public class RandomActiveGossipThread extends SendMembersActiveGossipThread {
|
public class RandomActiveGossipThread extends SendMembersActiveGossipThread {
|
||||||
|
|
||||||
/** The Random used for choosing a member to gossip with. */
|
/** The Random used for choosing a member to gossip with. */
|
||||||
private final Random _random;
|
private final Random random;
|
||||||
|
|
||||||
public RandomActiveGossipThread(GossipManager gossipManager) {
|
public RandomActiveGossipThread(GossipManager gossipManager) {
|
||||||
super(gossipManager);
|
super(gossipManager);
|
||||||
_random = new Random();
|
random = new Random();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,7 +44,7 @@ public class RandomActiveGossipThread extends SendMembersActiveGossipThread {
|
|||||||
protected LocalGossipMember selectPartner(List<LocalGossipMember> memberList) {
|
protected LocalGossipMember selectPartner(List<LocalGossipMember> memberList) {
|
||||||
LocalGossipMember member = null;
|
LocalGossipMember member = null;
|
||||||
if (memberList.size() > 0) {
|
if (memberList.size() > 0) {
|
||||||
int randomNeighborIndex = _random.nextInt(memberList.size());
|
int randomNeighborIndex = random.nextInt(memberList.size());
|
||||||
member = memberList.get(randomNeighborIndex);
|
member = memberList.get(randomNeighborIndex);
|
||||||
} else {
|
} else {
|
||||||
GossipService.LOGGER.debug("I am alone in this world.");
|
GossipService.LOGGER.debug("I am alone in this world.");
|
||||||
|
@ -26,9 +26,9 @@ import com.google.code.gossip.manager.impl.OnlyProcessReceivedPassiveGossipThrea
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RandomGossipManager extends GossipManager {
|
public class RandomGossipManager extends GossipManager {
|
||||||
public RandomGossipManager(String cluster, String address, int port, String id, GossipSettings settings,
|
public RandomGossipManager(String cluster, String address, int port, String id,
|
||||||
List<GossipMember> gossipMembers, GossipListener listener) {
|
GossipSettings settings, List<GossipMember> gossipMembers, GossipListener listener) {
|
||||||
super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, cluster, address,
|
super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, cluster,
|
||||||
port, id, settings, gossipMembers, listener);
|
address, port, id, settings, gossipMembers, listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user